|
QUDA v0.3.2
A library for QCD on GPUs
|
00001 __constant__ int X1h; 00002 __constant__ int X1; 00003 __constant__ int X2; 00004 __constant__ int X3; 00005 __constant__ int X4; 00006 00007 __constant__ int X1_3; 00008 __constant__ int X2_3; 00009 __constant__ int X3_3; 00010 __constant__ int X4_3; 00011 00012 __constant__ int X1m1; 00013 __constant__ int X2m1; 00014 __constant__ int X3m1; 00015 __constant__ int X4m1; 00016 00017 __constant__ int X1m3; 00018 __constant__ int X2m3; 00019 __constant__ int X3m3; 00020 __constant__ int X4m3; 00021 00022 __constant__ int X2X1mX1; 00023 __constant__ int X3X2X1mX2X1; 00024 __constant__ int X4X3X2X1mX3X2X1; 00025 __constant__ int X4X3X2X1hmX3X2X1h; 00026 00027 __constant__ int X2X1m3X1; 00028 __constant__ int X3X2X1m3X2X1; 00029 __constant__ int X4X3X2X1m3X3X2X1; 00030 __constant__ int X4X3X2X1hm3X3X2X1h; 00031 00032 __constant__ int X2X1; 00033 __constant__ int X3X2X1; 00034 00035 __constant__ int X2X1_3; 00036 __constant__ int X3X2X1_3; 00037 00038 __constant__ int Vh; 00039 __constant__ int sp_stride; 00040 __constant__ int ga_stride; 00041 __constant__ int cl_stride; 00042 00043 __constant__ int fat_ga_stride; 00044 __constant__ int long_ga_stride; 00045 00046 __constant__ int gauge_fixed; 00047 00048 // domain wall constants 00049 __constant__ int Ls; 00050 00051 // single precision constants 00052 __constant__ float anisotropy_f; 00053 __constant__ float coeff_f; 00054 __constant__ float t_boundary_f; 00055 __constant__ float pi_f; 00056 00057 // double precision constants 00058 __constant__ double anisotropy; 00059 __constant__ double t_boundary; 00060 __constant__ double coeff; 00061 00062 __constant__ float2 An2; 00063 __constant__ float2 TB2; 00064 __constant__ float2 No2; 00065 00066 int initDslash = 0; 00067 00068 void initCommonConstants(FullGauge gauge) { 00069 int Vh = gauge.volume; 00070 cudaMemcpyToSymbol("Vh", &Vh, sizeof(int)); 00071 00072 if (Vh%BLOCK_DIM != 0) { 00073 errorQuda("Error, Volume not a multiple of the thread block size"); 00074 } 00075 00076 int X1 = 2*gauge.X[0]; 00077 cudaMemcpyToSymbol("X1", &X1, sizeof(int)); 00078 00079 int X2 = gauge.X[1]; 00080 cudaMemcpyToSymbol("X2", &X2, sizeof(int)); 00081 00082 int X3 = gauge.X[2]; 00083 cudaMemcpyToSymbol("X3", &X3, sizeof(int)); 00084 00085 int X4 = gauge.X[3]; 00086 cudaMemcpyToSymbol("X4", &X4, sizeof(int)); 00087 00088 00089 int X1_3 = 3*X1; 00090 cudaMemcpyToSymbol("X1_3", &X1_3, sizeof(int)); 00091 00092 int X2_3 = 3*X2; 00093 cudaMemcpyToSymbol("X2_3", &X2_3, sizeof(int)); 00094 00095 int X3_3 = 3*X3; 00096 cudaMemcpyToSymbol("X3_3", &X3_3, sizeof(int)); 00097 00098 int X4_3 = 3*X4; 00099 cudaMemcpyToSymbol("X4_3", &X4_3, sizeof(int)); 00100 00101 00102 int X2X1 = X2*X1; 00103 cudaMemcpyToSymbol("X2X1", &X2X1, sizeof(int)); 00104 00105 int X3X2X1 = X3*X2*X1; 00106 cudaMemcpyToSymbol("X3X2X1", &X3X2X1, sizeof(int)); 00107 00108 int X2X1_3 = 3*X2*X1; 00109 cudaMemcpyToSymbol("X2X1_3", &X2X1_3, sizeof(int)); 00110 00111 int X3X2X1_3 = 3*X3*X2*X1; 00112 cudaMemcpyToSymbol("X3X2X1_3", &X3X2X1_3, sizeof(int)); 00113 00114 00115 int X1h = X1/2; 00116 cudaMemcpyToSymbol("X1h", &X1h, sizeof(int)); 00117 00118 int X1m1 = X1 - 1; 00119 cudaMemcpyToSymbol("X1m1", &X1m1, sizeof(int)); 00120 00121 int X2m1 = X2 - 1; 00122 cudaMemcpyToSymbol("X2m1", &X2m1, sizeof(int)); 00123 00124 int X3m1 = X3 - 1; 00125 cudaMemcpyToSymbol("X3m1", &X3m1, sizeof(int)); 00126 00127 int X4m1 = X4 - 1; 00128 cudaMemcpyToSymbol("X4m1", &X4m1, sizeof(int)); 00129 00130 int X1m3 = X1 - 3; 00131 cudaMemcpyToSymbol("X1m3", &X1m3, sizeof(int)); 00132 00133 int X2m3 = X2 - 3; 00134 cudaMemcpyToSymbol("X2m3", &X2m3, sizeof(int)); 00135 00136 int X3m3 = X3 - 3; 00137 cudaMemcpyToSymbol("X3m3", &X3m3, sizeof(int)); 00138 00139 int X4m3 = X4 - 3; 00140 cudaMemcpyToSymbol("X4m3", &X4m3, sizeof(int)); 00141 00142 00143 int X2X1mX1 = X2X1 - X1; 00144 cudaMemcpyToSymbol("X2X1mX1", &X2X1mX1, sizeof(int)); 00145 00146 int X3X2X1mX2X1 = X3X2X1 - X2X1; 00147 cudaMemcpyToSymbol("X3X2X1mX2X1", &X3X2X1mX2X1, sizeof(int)); 00148 00149 int X4X3X2X1mX3X2X1 = (X4-1)*X3X2X1; 00150 cudaMemcpyToSymbol("X4X3X2X1mX3X2X1", &X4X3X2X1mX3X2X1, sizeof(int)); 00151 00152 int X4X3X2X1hmX3X2X1h = (X4-1)*X3*X2*X1h; 00153 cudaMemcpyToSymbol("X4X3X2X1hmX3X2X1h", &X4X3X2X1hmX3X2X1h, sizeof(int)); 00154 00155 int X2X1m3X1 = X2X1 - 3*X1; 00156 cudaMemcpyToSymbol("X2X1m3X1", &X2X1m3X1, sizeof(int)); 00157 00158 int X3X2X1m3X2X1 = X3X2X1 - 3*X2X1; 00159 cudaMemcpyToSymbol("X3X2X1m3X2X1", &X3X2X1m3X2X1, sizeof(int)); 00160 00161 int X4X3X2X1m3X3X2X1 = (X4-3)*X3X2X1; 00162 cudaMemcpyToSymbol("X4X3X2X1m3X3X2X1", &X4X3X2X1m3X3X2X1, sizeof(int)); 00163 00164 int X4X3X2X1hm3X3X2X1h = (X4-3)*X3*X2*X1h; 00165 cudaMemcpyToSymbol("X4X3X2X1hm3X3X2X1h", &X4X3X2X1hm3X3X2X1h, sizeof(int)); 00166 00167 checkCudaError(); 00168 } 00169 00170 00171 void initDslashConstants(FullGauge gauge, int sp_stride, int cl_stride, int Ls) 00172 { 00173 00174 initCommonConstants(gauge); 00175 00176 cudaMemcpyToSymbol("sp_stride", &sp_stride, sizeof(int)); 00177 00178 int ga_stride = gauge.stride; 00179 cudaMemcpyToSymbol("ga_stride", &ga_stride, sizeof(int)); 00180 00181 int fat_ga_stride = gauge.stride; 00182 int long_ga_stride = gauge.stride; 00183 00184 cudaMemcpyToSymbol("fat_ga_stride", &fat_ga_stride, sizeof(int)); 00185 cudaMemcpyToSymbol("long_ga_stride", &long_ga_stride, sizeof(int)); 00186 00187 00188 00189 cudaMemcpyToSymbol("cl_stride", &cl_stride, sizeof(int)); 00190 00191 int gf = (gauge.gauge_fixed == QUDA_GAUGE_FIXED_YES) ? 1 : 0; 00192 cudaMemcpyToSymbol("gauge_fixed", &(gf), sizeof(int)); 00193 00194 cudaMemcpyToSymbol("anisotropy", &(gauge.anisotropy), sizeof(double)); 00195 00196 double t_bc = (gauge.t_boundary == QUDA_PERIODIC_T) ? 1.0 : -1.0; 00197 cudaMemcpyToSymbol("t_boundary", &(t_bc), sizeof(double)); 00198 00199 double coeff = -24.0*gauge.tadpole_coeff*gauge.tadpole_coeff; 00200 cudaMemcpyToSymbol("coeff", &(coeff), sizeof(double)); 00201 00202 00203 float anisotropy_f = gauge.anisotropy; 00204 cudaMemcpyToSymbol("anisotropy_f", &(anisotropy_f), sizeof(float)); 00205 00206 float t_bc_f = (gauge.t_boundary == QUDA_PERIODIC_T) ? 1.0 : -1.0; 00207 cudaMemcpyToSymbol("t_boundary_f", &(t_bc_f), sizeof(float)); 00208 00209 float coeff_f = -24.0*gauge.tadpole_coeff*gauge.tadpole_coeff; 00210 cudaMemcpyToSymbol("coeff_f", &(coeff_f), sizeof(float)); 00211 00212 00213 float2 An2 = make_float2(gauge.anisotropy, 1.0 / (gauge.anisotropy*gauge.anisotropy)); 00214 cudaMemcpyToSymbol("An2", &(An2), sizeof(float2)); 00215 float2 TB2 = make_float2(t_bc_f, 1.0 / (t_bc_f * t_bc_f)); 00216 cudaMemcpyToSymbol("TB2", &(TB2), sizeof(float2)); 00217 float2 No2 = make_float2(1.0, 1.0); 00218 cudaMemcpyToSymbol("No2", &(No2), sizeof(float2)); 00219 00220 float h_pi_f = M_PI; 00221 cudaMemcpyToSymbol("pi_f", &(h_pi_f), sizeof(float)); 00222 00223 cudaMemcpyToSymbol("Ls", &Ls, sizeof(int)); 00224 00225 checkCudaError(); 00226 00227 initDslash = 1; 00228 } 00229
1.7.3