24 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
25 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
26 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
27 const unsigned int threadId= blockId * bsize+(threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
28 for(
unsigned int i=threadId;i<
kvol;i+=gsize*bsize){
29 const unsigned int uidm = iu[mu*
kvol+i];
31 const unsigned int uidn = iu[nu*
kvol+i];
34 u12t[indn]*
conj(u12t[indm]);
36 u12t[indn]*u11t[indm];
38 Sigma11[i]+=a11*
conj(u11t[indn])+a12*
conj(u12t[indn]);
39 Sigma12[i]+=-a11*u12t[indn]+a12*u11t[indn];
57 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
58 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
59 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
60 const unsigned int threadId= blockId * bsize+(threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
61 for(
unsigned int i=threadId;i<
kvol;i+=gsize*bsize){
62 const unsigned int uidm = iu[mu*
kvol+i];
63 const unsigned int didn =
id[nu*
kvol+i];
68 u12sh[uidm]*
conj(u12s);
72 u11s=u11t[ind]; u12s=u12t[ind];
73 Sigma11[i]+=a11*u11s-a12*
conj(u12s);
74 Sigma12[i]+=a11*u12s+a12*
conj(u11s);
90 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
91 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
92 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
93 const unsigned int threadId= blockId * bsize+(threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
94 for(
unsigned int i=threadId;i<
kvol;i+=gsize*bsize){
95 const unsigned int ind = i+
kvolHalo*mu;
96 Complex_f a11 = u11t[ind]*Sigma12[i]+u12t[ind]*
conj(Sigma11[i]);
97 Complex_f a12 = u11t[ind]*Sigma11[i]+
conj(u12t[ind])*Sigma12[i];
99 dSdpi[i+
kvol*mu]=beta*a11.imag();
100 dSdpi[i+
kvol*(1*
ndim+mu)]=beta*a11.real();
101 dSdpi[i+
kvol*(2*
ndim+mu)]=beta*a12.imag();
115 template <
typename T>
116 __global__
void Gather(T *x, T *y,
const unsigned int n,
unsigned int *table,
const unsigned short mu)
120 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
121 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
122 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
123 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
124 const unsigned int gthreadId= blockId * bsize+bthreadId;
125 const unsigned int kvbmu=
kvolHalo*mu;
126 for(
unsigned int i = gthreadId; i<
kvol;i+=gsize*bsize)
127 x[i]=y[table[i+kvbmu]+kvbmu];
147 unsigned int *iu,
const unsigned short gamin[16],
float akappa,
const unsigned short mu){
148 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
149 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
150 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
151 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
152 const unsigned int gthreadId= blockId * bsize+bthreadId;
154 for(
unsigned int i=gthreadId;i<
kvol;i+=gsize*bsize){
155 const unsigned int ind=i+
kvolHalo*mu;
157 const unsigned int uid = iu[i+
kvol*mu];
159 for(
unsigned short idirac=0;idirac<
nc*
ndirac;idirac+=
nc){
171 dSdpis[0]=dSdpi[i+
kvol*mu];
177 +
conj(X1s[1])*(u11s*X2su[0]+u12s*X2su[1])
178 +
conj(X1su[0])*(u12s*X2s[0]-
conj(u11s)*X2s[1])
179 +
conj(X1su[1])*(-u11s*X2s[0]-
conj(u12s)*X2s[1])).imag();
184 +
conj(X1s[1])*(-u11s*X2su[0]-u12s*X2su[1])
185 +
conj(X1su[0])*(-u12s*X2s[0]-
conj(u11s)*X2s[1])
186 +
conj(X1su[1])*(u11s*X2s[0]-
conj(u12s)*X2s[1]))).real();
188 dSdpis[2]=dSdpi[i+
kvol*(2*
ndim+mu)];
190 conj(X1s[0])*(u11s *X2su[0]+u12s *X2su[1])
192 +
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
193 +
conj(X1su[1])*(-
conj(u12s)*X2s[0]+u11s *X2s[1])).imag();
195 const unsigned short gindex=mu*
ndirac+(idirac>>1);
198 const unsigned short gind = gamin[gindex]<<1;
204 dSdpis[0]+=-(gamval_c*
206 +
conj(X1s[1])* (u11s *X2su[0]+u12s *X2su[1])
207 +
conj(X1su[0])* (-u12s *X2s[0] +
conj(u11s)*X2s[1])
208 +
conj(X1su[1])*(u11s *X2s[0] +
conj(u12s)*X2s[1]))).imag();
209 dSdpi[i+
kvol*mu]=dSdpis[0];
211 dSdpis[1]+=(gamval_c*
212 (
conj(X1s[0])* (-
conj(u12s)*X2su[0] +
conj(u11s)*X2su[1])
213 +
conj(X1s[1])*(-u11s *X2su[0]-u12s *X2su[1])
214 +
conj(X1su[0])* (u12s *X2s[0]+
conj(u11s)*X2s[1])
215 +
conj(X1su[1])* (-u11s *X2s[0]+
conj(u12s)*X2s[1]))).real();
218 dSdpis[2]+=-(gamval_c*
219 (
conj(X1s[0])*(u11s *X2su[0]+u12s *X2su[1])
221 +
conj(X1su[0])*(
conj(u11s)*X2s[0]+u12s *X2s[1])
222 +
conj(X1su[1])*(
conj(u12s)*X2s[0]-u11s *X2s[1]))).imag();
223 dSdpi[i+
kvol*(2*
ndim+mu)]=dSdpis[2];
244 float *dk4m,
float *dk4p,
unsigned int *iu,
const unsigned short gamin[16],
float akappa){
245 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
246 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
247 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
248 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
249 const unsigned int gthreadId= blockId * bsize+bthreadId;
251 const unsigned short mu=3;
252 for(
unsigned int i=gthreadId;i<
kvol;i+=gsize*bsize){
253 const unsigned int ind=i+
kvolHalo*mu;
255 const float dk4ms=dk4m[i];
const float dk4ps=dk4p[i];
257 const unsigned int uid = iu[i+
kvol*mu];
259 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
270 dSdpis[0]=dSdpi[i+
kvol*mu];
274 dSdpis[0]+=-(dk4ms*(
conj(X1s[0])*(-
conj(u12s)*X2su[0]+
conj(u11s)*X2su[1])
275 +
conj(X1s[1])*(u11s *X2su[0]+u12s *X2su[1]))
276 +dk4ps*(
conj(X1su[0])*(+u12s*X2s[0]-
conj(u11s)*X2s[1])
277 +
conj(X1su[1])*(-u11s*X2s[0]-
conj(u12s)*X2s[1]))).imag();
280 dSdpis[1]+=(dk4ms*(
conj(X1s[0])*(-
conj(u12s)*X2su[0]+
conj(u11s)*X2su[1])
281 +
conj(X1s[1])*(-u11s *X2su[0]-u12s *X2su[1]))
282 +dk4ps*(
conj(X1su[0])*(-u12s *X2s[0]-
conj(u11s)*X2s[1])
283 +
conj(X1su[1])*( u11s *X2s[0]-
conj(u12s)*X2s[1]))).real();
285 dSdpis[2]=dSdpi[i+
kvol*(2*
ndim+mu)];
286 dSdpis[2]+=-(dk4ms* (
conj(X1s[0])* (u11s *X2su[0]+u12s *X2su[1])
288 +dk4ps*(
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
289 +
conj(X1su[1])* (-
conj(u12s)*X2s[0]+u11s *X2s[1]))).imag();
291 const unsigned short gindex=mu*
ndirac+(idirac>>1);
293 const unsigned short gind = gamin[gindex]<<1;
297 dSdpis[0]+=-(dk4ms*(
conj(X1s[0])*(-
conj(u12s)*X2su[0]+
conj(u11s)*X2su[1])
298 +
conj(X1s[1])*(u11s *X2su[0]+u12s *X2su[1]))
299 -dk4ps*(
conj(X1su[0])* (u12s *X2s[0]-
conj(u11s)*X2s[1])
300 +
conj(X1su[1])*(-u11s *X2s[0]-
conj(u12s)*X2s[1]))).imag();
301 dSdpi[i+
kvol*mu]=dSdpis[0];
303 dSdpis[1]+=(dk4ms*(
conj(X1s[0])*(-
conj(u12s)*X2su[0]+
conj(u11s)*X2su[1])
304 +
conj(X1s[1])*(-u11s*X2su[0]-u12s *X2su[1]))
305 -dk4ps*(
conj(X1su[0])*(-u12s *X2s[0]-
conj(u11s)*X2s[1])
306 +
conj(X1su[1])*(u11s*X2s[0]-
conj(u12s)*X2s[1]))).real();
309 dSdpis[2]+=-(dk4ms*(
conj(X1s[0])*(u11s*X2su[0] +u12s *X2su[1])
311 -dk4ps*(
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
312 +
conj(X1su[1])*(-
conj(u12s)*X2s[0]+u11s *X2s[1]))).imag();
313 dSdpi[i+
kvol*(2*
ndim+mu)]=dSdpis[2];
320 const char funcname[] =
"Gauge_force";
322 cudaGetDevice(&device);
324 for(
unsigned short i=0;i<
ndim;i++){
326 cudaMallocManaged((
void **)&Sigma[i][0],
kvol*
sizeof(
Complex_f),cudaMemAttachGlobal);
327 cudaMallocManaged((
void **)&Sigma[i][1],
kvol*
sizeof(
Complex_f),cudaMemAttachGlobal);
328 cudaMallocManaged((
void **)&ush[i][0],
kvolHalo*
sizeof(
Complex_f),cudaMemAttachGlobal);
329 cudaMallocManaged((
void **)&ush[i][1],
kvolHalo*
sizeof(
Complex_f),cudaMemAttachGlobal);
337 for(
unsigned short mu=0; mu<
ndim; mu++){
340 for(
unsigned short nu=0; nu<
ndim; nu++)
357 ush[mu][0],ush[mu][1],ut[0],ut[1]);
362 for(
unsigned short i=0;i<
ndim;i++){
364 cudaFree(Sigma[i][0]); cudaFree(Sigma[i][1]);
365 cudaFree(ush[i][0]); cudaFree(ush[i][1]);
367 cudaFreeAsync(Sigma[i][0],
streams[i]); cudaFreeAsync(Sigma[i][1],
streams[i]);
368 cudaFreeAsync(ush[i][0],
streams[i]); cudaFreeAsync(ush[i][1],
streams[i]);
374 Complex_f gamval[20],
float *dk[2],
unsigned int *iu,
const unsigned short gamin[16],\
376 const char *funcname =
"Force";
381 for(
unsigned short mu=0;mu<3;mu++){
382 Kernels::cuForce_s<<<dimGrid,dimBlock,0,streams[mu]>>>(dSdpi,ut[0],ut[1],X1,X2,gamval,iu,gamin,akappa,mu);
386 Kernels::cuForce_t<<<dimGrid,dimBlock,0,streams[mu]>>>(dSdpi,ut[0],ut[1],X1,X2,gamval,dk[0],dk[1],iu,gamin,akappa);
__device__ __forceinline__ T conj(const T &z)
Complex Conjugation.
__global__ void Gather(T *x, T *y, const unsigned int n, unsigned int *table, const unsigned short mu)
Extracts all the single precision gauge links in the direction only.
void cuForce(double *dSdpi, Complex_f *ut[2], Complex_f *X1, Complex_f *X2, Complex_f gamval[20], float *dk[2], unsigned int *iu, const unsigned short gamin[16], float akappa, dim3 dimGrid, dim3 dimBlock)
Calculates the force at each intermediate time.
void cuGauge_force(Complex_f *ut[2], double *dSdpi, float beta, unsigned int *iu, unsigned int *id, dim3 dimGrid, dim3 dimBlock)
Calculate the gauge contribution to the force.
__global__ void Plus_staple(const int mu, const int nu, unsigned int *iu, Complex_f *Sigma11, Complex_f *Sigma12, Complex_f *u11t, Complex_f *u12t)
Calculates the staple in the positive direction.
__global__ void cuForce_s(double *dSdpi, Complex_f *u11t, Complex_f *u12t, Complex_f *X1, Complex_f *X2, Complex_f gamval[20], unsigned int *iu, const unsigned short gamin[16], float akappa, const unsigned short mu)
Calculates the force at each intermediate time.
__global__ void cuGaugeForce(int mu, Complex_f *Sigma11, Complex_f *Sigma12, double *dSdpi, Complex_f *u11t, Complex_f *u12t, float beta)
Calculates the gauge force due to the Wilson Action at each intermediate time.
__global__ void Minus_staple(const int mu, const int nu, unsigned int *iu, unsigned int *id, Complex_f *Sigma11, Complex_f *Sigma12, Complex_f *u11sh, Complex_f *u12sh, Complex_f *u11t, Complex_f *u12t)
Calculates the staple in the negative direction.
__global__ void cuForce_t(double *dSdpi, Complex_f *u11t, Complex_f *u12t, Complex_f *X1, Complex_f *X2, Complex_f gamval[20], float *dk4m, float *dk4p, unsigned int *iu, const unsigned short gamin[16], float akappa)
Calculates the force at each intermediate time.
int CHalo_swap_dir(Complex_f *c, int ncpt, int idir, int layer)
Swaps the halos along the axis given by idir in the direction given by layer.
Matrix multiplication and related declarations.
#define DOWN
Flag for send down.
#define kvol
Sublattice volume.
#define ndirac
Dirac indices.
#define cudaDeviceSynchronise()
Get rid of that bastardised yankee English.
#define Complex_f
Single precision complex number.
dim3 dimGrid
Default grid size. First component is normally nt. Second and third depend whatever is needed to get ...
#define kvolHalo
Subvolume + halo size.
dim3 dimBlock
Default block size. Usually 128.
Function declarations for most of the routines.
cudaStream_t streams[ndirac *ndim *nadj]
An array of concurrent GPU streams to keep it busy.