7 #include <cuda_runtime.h> 25 #include <gtest/gtest.h> 27 #define TDIFF(a,b) (b.tv_sec - a.tv_sec + 0.000001*(b.tv_usec - a.tv_usec)) 32 extern void usage(
char** argv);
58 TEST(unitarization, verify) {
70 ASSERT_EQ(res,1) <<
"CPU and CUDA implementations do not agree";
81 qudaGaugeParam.
X[0] =
xdim;
82 qudaGaugeParam.
X[1] =
ydim;
83 qudaGaugeParam.
X[2] =
zdim;
84 qudaGaugeParam.
X[3] =
tdim;
118 errorQuda(
"ERROR: allocating fatlink failed\n");
122 for(
int i=0;i < 4;i++){
124 if(sitelink[i] == NULL){
125 errorQuda(
"ERROR; allocate sitelink[%d] failed\n", i);
133 double* link =
reinterpret_cast<double*
>(inlink);
134 for(
int dir=0; dir<4; ++dir){
135 double* slink =
reinterpret_cast<double*
>(sitelink[dir]);
136 for(
int i=0; i<
V; ++i){
138 link[(i*4 + dir)*gaugeSiteSize + j] = slink[i*gaugeSiteSize + j];
143 float* link =
reinterpret_cast<float*
>(inlink);
144 for(
int dir=0; dir<4; ++dir){
145 float* slink =
reinterpret_cast<float*
>(sitelink[dir]);
146 for(
int i=0; i<
V; ++i){
148 link[(i*4 + dir)*gaugeSiteSize + j] = slink[i*gaugeSiteSize + j];
172 double act_path_coeff[6];
173 act_path_coeff[0] = 0.625000;
174 act_path_coeff[1] = -0.058479;
175 act_path_coeff[2] = -0.087719;
176 act_path_coeff[3] = 0.030778;
177 act_path_coeff[4] = -0.007200;
178 act_path_coeff[5] = -0.123113;
194 cudaError_t error = cudaHostGetDevicePointer(&num_failures_d, num_failures_h, 0);
195 if (error != cudaSuccess)
errorQuda(
"cudaHostGetDevicePointer failed with error: %s", cudaGetErrorString(error));
198 struct timeval t0, t1;
200 gettimeofday(&t0,NULL);
202 cudaDeviceSynchronize();
203 gettimeofday(&t1,NULL);
206 test_rc = RUN_ALL_TESTS();
215 for(
int dir=0; dir<4; ++dir) cudaFreeHost(sitelink[dir]);
237 printfQuda(
"link_precision link_reconstruct space_dimension T_dimension algorithm max allowed error deviation tolerance\n");
260 int main(
int argc,
char **argv)
263 ::testing::InitGoogleTest(&argc, argv);
271 for (i=1; i<argc; i++){
276 fprintf(stderr,
"ERROR: Invalid option:%s\n", argv[i]);
290 printfQuda(
"Number of failures = %d\n", num_failures);
291 if(num_failures > 0){
292 printfQuda(
"Failure rate = %lf\n", num_failures/(4.0*
V*num_procs));
293 printfQuda(
"You may want to increase the error tolerance or vary the unitarization parameters\n");
static QudaGaugeParam qudaGaugeParam
int dimPartitioned(int dim)
QudaReconstructType reconstruct_sloppy
QudaGhostExchange ghostExchange
int main(int argc, char **argv)
enum QudaPrecision_s QudaPrecision
void saveCPUField(cpuGaugeField &cpu) const
Upload from this field into a CPU field.
void setUnitarizeLinksConstants(double unitarize_eps, double max_error, bool allow_svd, bool svd_only, double svd_rel_error, double svd_abs_error)
cpuGaugeField * cpuFatLink
cudaGaugeField * cudaULink
static bool reunit_svd_only
int process_command_line_option(int argc, char **argv, int *idx)
static QudaPrecision cpu_prec
QudaReconstructType link_recon
void exchange_llfat_cleanup(void)
QudaGaugeFieldOrder gauge_order
void computeKSLinkQuda(void *fatlink, void *longlink, void *ulink, void *inlink, double *path_coeff, QudaGaugeParam *param)
static double svd_rel_error
int compare_floats(void *a, void *b, int len, double epsilon, QudaPrecision precision)
const char * get_prec_str(QudaPrecision prec)
void createSiteLinkCPU(void **link, QudaPrecision precision, int phase)
static void display_test_info()
static double max_allowed_error
TEST(unitarization, verify)
void loadCPUField(const cpuGaugeField &cpu)
Download into this field from a CPU field.
const char * get_unitarization_str(bool svd_only)
void initQuda(int device)
void unitarizeLinks(cudaGaugeField &outfield, const cudaGaugeField &infield, int *fails)
const char * get_recon_str(QudaReconstructType recon)
QudaGaugeFieldOrder order
QudaPrecision cuda_prec_sloppy
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
static double unitarize_eps
QudaReconstructType reconstruct
static int * num_failures_h
static int unitarize_link_test(int &test_rc)
static int * num_failures_d
static QudaGaugeFieldOrder gauge_order
static bool reunit_allow_svd
void setPrecision(QudaPrecision precision, bool force_native=false)
Helper function for setting the precision and corresponding field order for QUDA internal fields...
void unitarizeLinksCPU(cpuGaugeField &outfield, const cpuGaugeField &infield)
int gridsize_from_cmdline[]
static double svd_abs_error
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
cudaGaugeField * cudaFatLink
void comm_allreduce_int(int *data)
QudaReconstructType reconstruct
#define mapped_malloc(size)
void initComms(int argc, char **argv, int *const commDims)
cpuGaugeField * cudaResult
QudaGaugeParam newQudaGaugeParam(void)