20 template <
typename T,
unsigned int bsize>
22 if(bsize >= 64) sdata[tid] += sdata[tid + 32];
23 if(bsize >= 32) sdata[tid] += sdata[tid + 16];
24 if(bsize >= 16) sdata[tid] += sdata[tid + 8];
25 if(bsize >= 8) sdata[tid] += sdata[tid + 4];
26 if(bsize >= 4) sdata[tid] += sdata[tid + 2];
27 if(bsize >= 2) sdata[tid] += sdata[tid + 1];
48 __global__
void cuDslash(complex<T> *phi, complex<T> *r, complex<T> *u11t, complex<T> *u12t,
const unsigned int *iu,
const unsigned int *
id,\
49 complex<T> gamval[20],
const unsigned short gamin[16],
const T *dk4m,
const T *dk4p,
const Complex_f jqq,
const float akappa){
50 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
51 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
52 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
53 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
54 const unsigned int gthreadId= blockId * bsize+bthreadId;
56 for(
unsigned int i=gthreadId;i<
kvol;i+=gsize*bsize){
57 complex<T> ru[
nc]; complex<T> rd[
nc];
58 complex<T> rgu[
nc]; complex<T> rgd[
nc];
60 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
61 unsigned short igork = ((idirac>>1)+4)<<1;
62 unsigned int ind_d =4*
ndirac+(idirac>>1);
63 complex<T> a_1=
conj(jqq)*gamval[ind_d];
65 complex<T> a_2=-jqq*gamval[ind_d];
67 phi_s[idirac]=phi[ind_d]+a_1*r[ind_g];
68 phi_s[igork]=phi[ind_g]+a_2*r[ind_d];
70 phi_s[idirac+1]=phi[ind_d]+a_1*r[ind_g];
71 phi_s[igork+1]=phi[ind_g]+a_2*r[ind_d];
73 complex<T> u11s; complex<T> u12s;
74 complex<T> u11sd; complex<T> u12sd;
78 for(
unsigned short mu = 0; mu <3; mu++){
80 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
82 u11s=u11t[ind]; u12s=u12t[ind];
84 u11sd=u11t[ind]; u12sd=u12t[ind];
85 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
86 unsigned short idirac=igorkov&3;
87 unsigned short gind=mu*
ndirac+idirac;
88 const complex<T> gam=gamval[gind];
90 unsigned short igork1 = (igorkov<4) ? gamin[gind] : gamin[gind]+4;
91 for(
unsigned short c=0;c<
nc;c++){
96 phi_s[igorkov*
nc]+=-akappa*(u11s*ru[0]+ u12s*ru[1]+\
97 conj(u11sd)*rd[0]- u12sd*rd[1]);
99 phi_s[igorkov*
nc]+=gam*(u11s*rgu[0]+ u12s*rgu[1]-\
100 conj(u11sd)*rgd[0]+ u12sd*rgd[1]);
102 phi_s[igorkov*
nc+1]+=-akappa*(-
conj(u12s)*ru[0]+
conj(u11s)*ru[1]+\
103 conj(u12sd)*rd[0]+ u11sd*rd[1]);
105 phi_s[igorkov*
nc+1]+=gam*(-
conj(u12s)*rgu[0]+
conj(u11s)*rgu[1]-\
106 conj(u12sd)*rgd[0]- u11sd*rgd[1]);
115 u11s=u11t[ind]; u12s=u12t[ind];
116 const T dk4ms=dk4m[i];
const T dk4ps=dk4p[i];
118 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
120 u11sd=u11t[ind]; u12sd=u12t[ind];
121 const T dk4msd=dk4m[did];
const T dk4psd=dk4p[did];
122 for(
unsigned short igorkov=0;igorkov<
ndirac;igorkov++){
123 unsigned short igork1 = gamin[3*
ndirac+igorkov];
124 for(
unsigned short c=0;c<
nc;c++){
130 -dk4ps*(u11s*(ru[0]-rgu[0]) +u12s*(ru[1]-rgu[1]))
131 -dk4msd*(
conj(u11sd)*(rd[0]+rgd[0]) -u12sd *(rd[1]+rgd[1]));
134 phi_s[igorkov*
nc+1]+=
135 -dk4ps*(-
conj(u12s)*(ru[0]-rgu[0]) +
conj(u11s)*(ru[1]-rgu[1]))
136 -dk4msd*(
conj(u12sd)*(rd[0]+rgd[0]) +u11sd *(rd[1]+rgd[1]));
138 const unsigned short igorkovPP=igorkov+4;
142 for(
unsigned short c=0;c<
nc;c++){
147 phi_s[igorkovPP*
nc]+=-dk4ms*(u11s*(ru[0]-rgu[0])+ u12s*(ru[1]-rgu[1]))-
148 dk4psd*(
conj(u11sd)*(rd[0]+rgd[0])- u12sd*(rd[1]+rgd[1]));
151 phi_s[igorkovPP*
nc+1]+=-dk4ms*(
conj(-u12s)*(ru[0]-rgu[0]) +
conj(u11s)*(ru[1]-rgu[1]))
152 -dk4psd*(
conj(u12sd)*(rd[0]+rgd[0]) +u11sd*(rd[1]+rgd[1]));
174 template <
typename T>
175 __global__
void cuDslashd(complex<T> *phi,
const complex<T> *r,
const complex<T> *u11t,
const complex<T> *u12t,
const unsigned int *iu,
const unsigned int *
id,\
176 complex<T> gamval[20],
const unsigned short gamin[16],
const T *dk4m,
const T *dk4p,
const Complex_f jqq,
const float akappa){
177 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
178 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
179 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
180 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
181 const unsigned int gthreadId= blockId * bsize+bthreadId;
183 for(
unsigned int i=gthreadId;i<
kvol;i+=gsize*bsize){
184 complex<T> ru[
nc]; complex<T> rd[
nc];
185 complex<T> rgu[
nc]; complex<T> rgd[
nc];
187 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
188 unsigned short igork = ((idirac>>1)+4)<<1;
189 unsigned int ind_d =4*
ndirac+(idirac>>1);
190 complex<T> a_1=-
conj(jqq)*gamval[ind_d];
191 complex<T> a_2=jqq*gamval[ind_d];
192 ind_d=i+
kvol*(idirac);
unsigned int ind_g=i+
kvol*(igork);
193 phi_s[idirac]=phi[ind_d]+a_1*r[ind_g];
194 phi_s[igork]=phi[ind_g]+a_2*r[ind_d];
196 phi_s[idirac+1]=phi[ind_d]+a_1*r[ind_g];
197 phi_s[igork+1]=phi[ind_g]+a_2*r[ind_d];
199 complex<T> u11s; complex<T> u12s;
200 complex<T> u11sd; complex<T> u12sd;
204 for(
unsigned short mu = 0; mu <3; mu++){
206 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
208 u11s=u11t[ind]; u12s=u12t[ind];
210 u11sd=u11t[ind]; u12sd=u12t[ind];
211 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
212 unsigned short idirac=igorkov&3;
213 const complex<T> gam=gamval[mu*
ndirac+idirac];
215 unsigned short igork1 = (igorkov<4) ? gamin[mu*
ndirac+idirac] : gamin[mu*
ndirac+idirac]+4;
216 for(
unsigned short c=0;c<
nc;c++){
221 phi_s[igorkov*
nc]-= akappa*(u11s*ru[0] +u12s*ru[1]
222 +
conj(u11sd)*rd[0] -u12sd *rd[1]);
225 phi_s[igorkov*
nc]-=gam* (u11s*rgu[0] +u12s*rgu[1]
226 -
conj(u11sd)*rgd[0] +u12sd *rgd[1]);
228 phi_s[igorkov*
nc+1]-= akappa*(-
conj(u12s)*ru[0] +
conj(u11s)*ru[1]
229 +
conj(u12sd)*rd[0] +u11sd *rd[1]);
231 phi_s[igorkov*
nc+1]-=gam* (-
conj(u12s)*rgu[0] +
conj(u11s)*rgu[1]
232 -
conj(u12sd)*rgd[0] -u11sd *rgd[1]);
243 u11s=u11t[ind]; u12s=u12t[ind];
244 const T dk4ms=dk4m[i];
const T dk4ps=dk4p[i];
246 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
248 u11sd=u11t[ind]; u12sd=u12t[ind];
249 const T dk4msd=dk4m[did];
const T dk4psd=dk4p[did];
250 for(
unsigned short igorkov=0; igorkov<
ndirac; igorkov++){
251 unsigned short igork1 = gamin[3*
ndirac+igorkov];
252 for(
unsigned short c=0;c<
nc;c++){
258 -dk4ms*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
259 -dk4psd*(
conj(u11sd)*(rd[0]-rgd[0]) -u12sd *(rd[1]-rgd[1]));
260 phi[i+
kvol*(igorkov*
nc)]=phi_s[igorkov*
nc];
262 phi_s[igorkov*
nc+1]+=
263 -dk4ms*(-
conj(u12s)*(ru[0]+rgu[0]) +
conj(u11s)*(ru[1]+rgu[1]))
264 -dk4psd*(
conj(u12sd)*(rd[0]-rgd[0]) +u11sd *(rd[1]-rgd[1]));
265 phi[i+
kvol*(igorkov*
nc+1)]=phi_s[igorkov*
nc+1];
266 const unsigned short igorkovPP=igorkov+4;
269 for(
unsigned short c=0;c<
nc;c++){
274 phi_s[igorkovPP*
nc]+=-dk4ps*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
275 -dk4msd*(
conj(u11sd)*(rd[0]-rgd[0]) -u12sd*(rd[1]-rgd[1]));
276 phi[i+
kvol*(igorkovPP*
nc)]=phi_s[igorkovPP*
nc];
278 phi_s[igorkovPP*
nc+1]+=dk4ps*(
conj(u12s)*(ru[0]+rgu[0]) -
conj(u11s)*(ru[1]+rgu[1]))
279 -dk4msd*(
conj(u12sd)*(rd[0]-rgd[0]) +u11sd*(rd[1]-rgd[1]));
280 phi[i+
kvol*(igorkovPP*
nc+1)]=phi_s[igorkovPP*
nc+1];
301 template <
typename T>
302 __global__
void cuHdslash(complex<T> *phi,
const complex<T> *r,
const complex<T> *u11t,
const complex<T> *u12t,
unsigned int *iu,
unsigned int *
id,\
303 __constant__ complex<T> gamval[20],
const unsigned short gamin[16],
const T *dk4m,
const T *dk4p,
const __grid_constant__
float akappa){
307 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
308 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
309 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
310 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
311 const unsigned int gthreadId= blockId * bsize+bthreadId;
314 complex<T> ru[2]; complex<T> rd[2];
315 complex<T> rgu[2]; complex<T> rgd[2];
317 for(
unsigned int i=gthreadId;i<
kvol;i+=bsize*gsize){
319 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
321 for(
unsigned short c=0; c<
nc; c++)
323 phi_s[idirac+c]=phi[i+
kvolHalo*(c+idirac)];
326 for(
unsigned short mu = 0; mu <
ndim; mu++){
328 const complex<T> u11s=u11t[ind];
const complex<T> u12s=u12t[ind];
330 const int did=
id[ind];
const int uid = iu[ind];
332 const complex<T> u11sd=u11t[ind];
const complex<T> u12sd=u12t[ind];
334 for(
unsigned short idirac=0; idirac<
ndirac*
nc; idirac+=
nc){
335 const unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
337 for(
unsigned short c=0;c<
nc;c++){
339 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
341 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
348 const complex<T> gam=gamval[mu*
ndirac+(idirac>>1)];
349 phi_s[idirac]+=-akappa*(u11s*ru[0]+u12s*ru[1]+\
350 conj(u11sd)*rd[0]-u12sd*rd[1]);
352 phi_s[idirac]+=gam*(u11s*rgu[0]+u12s*rgu[1]-\
353 conj(u11sd)*rgd[0]+ u12sd*rgd[1]);
355 phi_s[idirac+1]+=-akappa*(-
conj(u12s)*ru[0]+
conj(u11s)*ru[1]+\
356 conj(u12sd)*rd[0]+ u11sd*rd[1]);
358 phi_s[idirac+1]+=gam*(-
conj(u12s)*rgu[0]+
conj(u11s)*rgu[1]-\
359 conj(u12sd)*rgd[0]- u11sd*rgd[1]);
363 const T dk4ms=dk4m[did];
const T dk4ps=dk4p[i];
366 phi_s[idirac+0]-= dk4ps*(u11s*(ru[0]-rgu[0])
367 +u12s*(ru[1]-rgu[1]));
368 phi_s[idirac+0]-= dk4ms*(
conj(u11sd)*(rd[0]+rgd[0])
369 -u12sd *(rd[1]+rgd[1]));
370 phi[i+
kvolHalo*(0+idirac)]=phi_s[idirac+0];
372 phi_s[idirac+1]-= dk4ps*(-
conj(u12s)*(ru[0]-rgu[0])
373 +
conj(u11s)*(ru[1]-rgu[1]));
374 phi_s[idirac+1]-= dk4ms*(
conj(u12sd)*(rd[0]+rgd[0])
375 +u11sd *(rd[1]+rgd[1]));
376 phi[i+
kvolHalo*(1+idirac)]=phi_s[idirac+1];
397 template <
typename T>
398 __global__
void cuHdslashd(complex<T> *phi,
const complex<T>* r,
const complex<T>* u11t,
const complex<T>* u12t,
unsigned int* iu,
unsigned int*
id,\
399 __constant__ complex<T> gamval[20],
const unsigned short gamin[16],
const T* dk4m,
const T* dk4p,
const __grid_constant__
float akappa){
403 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
404 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
405 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
406 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
407 const unsigned int gthreadId= blockId * bsize+bthreadId;
410 for(
unsigned int i=gthreadId;i<
kvol;i+=gsize*bsize){
413 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
415 for(
unsigned short c=0; c<
nc; c++)
417 phi_s[idirac+c]=phi[i+
kvol*(c+idirac)];
420 for(
unsigned short mu = 0; mu <
ndim; mu++){
422 const complex<T> u11s=u11t[ind];
const complex<T> u12s=u12t[ind];
424 const int did=
id[ind];
const int uid = iu[ind];
426 const complex<T> u11sd=u11t[ind];
const complex<T> u12sd=u12t[ind];
428 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc){
429 const unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
430 complex<T> ru[2]; complex<T> rd[2];
431 complex<T> rgu[2]; complex<T> rgd[2];
433 for(
unsigned short c=0;c<
nc;c++){
435 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
437 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
444 const complex<T> gam=gamval[mu*
ndirac+(idirac>>1)];
445 phi_s[idirac]-=akappa*(u11s*ru[0] +u12s*ru[1]
446 +
conj(u11sd)*rd[0] -u12sd *rd[1]);
448 phi_s[idirac]-=gam* (u11s*rgu[0] +u12s*rgu[1]
449 -
conj(u11sd)*rgd[0] +u12sd *rgd[1]);
451 phi_s[idirac+1]-=akappa*(-
conj(u12s)*ru[0] +
conj(u11s)*ru[1]
452 +
conj(u12sd)*rd[0] +u11sd *rd[1]);
454 phi_s[idirac+1]-=gam*(-
conj(u12s)*rgu[0] +
conj(u11s)*rgu[1]
455 -
conj(u12sd)*rgd[0] -u11sd *rgd[1]);
459 const T dk4ms=dk4m[i];
const T dk4ps=dk4p[did];
462 phi_s[idirac]+= -dk4ms*(u11s*(ru[0]+rgu[0])
463 +u12s*(ru[1]+rgu[1]));
464 phi_s[idirac]+= -dk4ps*(
conj(u11sd)*(rd[0]-rgd[0])
465 -u12sd *(rd[1]-rgd[1]));
466 phi[i+
kvol*(0+idirac)]=phi_s[idirac+0];
468 phi_s[idirac+1]-= dk4ms*(-
conj(u12s)*(ru[0]+rgu[0])
469 +
conj(u11s)*(ru[1]+rgu[1]));
470 phi_s[idirac+1]-= +dk4ps*(
conj(u12sd)*(rd[0]-rgd[0])
471 +u11sd *(rd[1]-rgd[1]));
472 phi[i+
kvol*(1+idirac)]=phi_s[idirac+1];
489 template <
typename T>
490 __global__
void Transpose(T *out,
const T *in,
const int fast_in,
const int fast_out){
491 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
492 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
493 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
494 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
495 const unsigned int gthreadId= blockId * bsize+bthreadId;
499 if(fast_out>fast_in){
500 for(
unsigned int x=gthreadId;x<fast_out;x+=gsize*bsize)
501 for(
unsigned int y=0; y<fast_in;y++)
502 out[y*fast_out+x]=in[x*fast_in+y];
506 for(
unsigned int x=0; x<fast_out;x++)
507 for(
unsigned int y=gthreadId;y<fast_in;y+=gsize*bsize)
508 out[y*fast_out+x]=in[x*fast_in+y];
520 __global__
void Mixed_Sumto(
double *d,
float *f,
const unsigned int n){
521 const unsigned int gsize = gridDim.x*gridDim.y*gridDim.z;
522 const unsigned int bsize = blockDim.x*blockDim.y*blockDim.z;
523 const unsigned int blockId = blockIdx.x+ blockIdx.y * gridDim.x+ gridDim.x * gridDim.y * blockIdx.z;
524 const unsigned int bthreadId= (threadIdx.z * blockDim.y+ threadIdx.y)* blockDim.x+ threadIdx.x;
525 const unsigned int gthreadId= blockId * bsize+bthreadId;
527 for(
unsigned int i=gthreadId; i<n;i+=bsize*gsize)
542 template <
typename T,
unsigned int bsize>
543 __global__
void reduce_sum(T *g_in_data, T *g_out_data,
const unsigned int n){
544 extern __shared__ T sdata[];
547 const unsigned short tid = threadIdx.x;
548 unsigned int i = blockIdx.x*(bsize*2) + tid;
549 const unsigned int gridSize = blockDim.x * 2 * gridDim.x;
552 sdata[tid] += g_in_data[i];
554 sdata[tid] += g_in_data[i + bsize];
562 for(
unsigned int s=bsize/2;s>=warpSize;s>>=1){
564 sdata[tid] += sdata[tid + s]; __syncthreads();
566#if defined(__HIP_PLATFORM_AMD__) || defined(__HIP_PLATFORM_HCC__)
567#define SU2_WARP_MASK 0xffffffffffffffffULL
569#define SU2_WARP_MASK 0xffffffffU
575 for (
int offset = warpSize/2; offset > 0; offset >>= 1)
576 val += __shfl_down_sync(SU2_WARP_MASK, val, offset);
577 if (tid == 0) sdata[0] = val;
581 g_out_data[blockIdx.x] = sdata[0];
587double cureduce_sum_d(
double *input,
const unsigned int n,
const unsigned short stream){
588 const unsigned int bsize=256;
589 unsigned int gsize=(n + (2 * bsize) - 1) / (2 * bsize);
590 double *cachein, *cacheout;
591 cudaMallocAsync(&cacheout,gsize*
sizeof(
double),
streams[stream]);
594 cudaMallocAsync(&cachein,gsize*
sizeof(
double),
streams[stream]);
595 cudaMemcpyAsync(cachein,cacheout,gsize*
sizeof(
double),cudaMemcpyDefault,
streams[stream]);
596 cudaFreeAsync(cacheout,
streams[stream]);
598 cudaMallocAsync(&cacheout,gsize*
sizeof(
double),
streams[stream]);
600 cudaFreeAsync(cachein,
streams[stream]);
603 cudaStreamSynchronize(
streams[stream]);
604 cudaMemcpyAsync(&output,cacheout,
sizeof(
double),cudaMemcpyDefault,
streams[stream]);
605 cudaStreamSynchronize(
streams[stream]);
606 cudaFreeAsync(cacheout,
streams[stream]);
610 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
Complex_f jqq,
float akappa,
612 const char funcname[] =
"Dslash";
616 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
620 Kernels::cuDslash<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],jqq,akappa);
624 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
Complex_f jqq,
float akappa,
626 const char funcname[] =
"Dslashd";
630 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
634 Kernels::cuDslashd<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],jqq,akappa);
638 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
float akappa,
640 const char funcname[] =
"Hdslash";
642 for(
unsigned short j=0;j<
nc*
ndirac;j++)
644 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
648 Kernels::cuHdslash<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],akappa);
652 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
float akappa,
654 const char funcname[] =
"Hdslashd";
657 for(
unsigned short j=0;j<
nc*
ndirac;j++)
659 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
663 Kernels::cuHdslashd<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],akappa);
669 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
Complex_f jqq,
float akappa,
671 const char funcname[] =
"Dslash_f";
675 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
679 Kernels::cuDslash<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],jqq,akappa);
683 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
Complex_f jqq,
float akappa,
685 const char funcname[] =
"Dslashd_f";
689 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
693 Kernels::cuDslashd<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],jqq,akappa);
697 const unsigned short gamin[16],
float *dk[
nc],
float akappa, dim3
dimGrid, dim3
dimBlock){
698 const char funcname[] =
"Hdslash_f";
700 for(
unsigned short j=0;j<
nc*
ndirac;j++)
702 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
708 Kernels::cuHdslash<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],akappa);
713 const char funcname[] =
"Hdslashd_f";
715 for(
unsigned short j=0;j<
nc*
ndirac;j++)
717 fprintf(stderr,
"Error %d in %s: Cuda failed to copy managed r into device Phi with code %d.\nExiting,,,\n\n",\
721 Kernels::cuHdslashd<<<dimGrid,dimBlock>>>(phi,r,ut[0],ut[1],iu,id,gamval,gamin,dk[0],dk[1],akappa);
727 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
Complex));
728 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
Complex),cudaMemcpyDefault);
734 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
Complex_f));
735 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
Complex_f),cudaMemcpyDefault);
742 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
double));
743 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
double),cudaMemcpyDefault);
749 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
float));
750 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
float),cudaMemcpyDefault);
756 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
int));
757 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
int),cudaMemcpyDefault);
762 unsigned int *holder;
763 cudaMalloc((
void **)&holder,fast_in*fast_out*
sizeof(
unsigned int));
764 cudaMemcpy(holder,out,fast_in*fast_out*
sizeof(
unsigned int),cudaMemcpyDefault);
#define CPYERROR
Copy failed.
void cuDslash_f(Complex_f *phi, Complex_f *r, Complex_f *ut[nc], unsigned int *iu, unsigned int *id, Complex_f gamval[20], const unsigned short gamin[16], float *dk[nc], Complex_f jqq, float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
void cuHdslashd_f(Complex_f *phi, Complex_f *r, Complex_f *ut[nc], unsigned int *iu, unsigned int *id, Complex_f gamval[20], const unsigned short gamin[16], float *dk[nc], float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in single precision.
void cuDslashd_f(Complex_f *phi, Complex_f *r, Complex_f *ut[nc], unsigned int *iu, unsigned int *id, Complex_f gamval[20], const unsigned short gamin[16], float *dk[nc], Complex_f jqq, float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
void cuHdslash_f(Complex_f *phi, Complex_f *r, Complex_f *ut[nc], unsigned int *iu, unsigned int *id, Complex_f gamval[20], const unsigned short gamin[16], float *dk[nc], float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in single precision.
__global__ void cuDslash(complex< T > *phi, complex< T > *r, complex< T > *u11t, complex< T > *u12t, const unsigned int *iu, const unsigned int *id, complex< T > gamval[20], const unsigned short gamin[16], const T *dk4m, const T *dk4p, const Complex_f jqq, const float akappa)
Evaluates .
__global__ void cuHdslashd(complex< T > *phi, const complex< T > *r, const complex< T > *u11t, const complex< T > *u12t, unsigned int *iu, unsigned int *id, __constant__ complex< T > gamval[20], const unsigned short gamin[16], const T *dk4m, const T *dk4p, const __grid_constant__ float akappa)
Evaluates using up/down partitioning.
__global__ void cuDslashd(complex< T > *phi, const complex< T > *r, const complex< T > *u11t, const complex< T > *u12t, const unsigned int *iu, const unsigned int *id, complex< T > gamval[20], const unsigned short gamin[16], const T *dk4m, const T *dk4p, const Complex_f jqq, const float akappa)
Evaluates .
void cuHdslashd(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
__global__ void cuHdslash(complex< T > *phi, const complex< T > *r, const complex< T > *u11t, const complex< T > *u12t, unsigned int *iu, unsigned int *id, __constant__ complex< T > gamval[20], const unsigned short gamin[16], const T *dk4m, const T *dk4p, const __grid_constant__ float akappa)
Evaluates using up/down partitioning.
void cuHdslash(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
void cuDslash(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], Complex_f jqq, float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
void cuDslashd(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], Complex_f jqq, float akappa, dim3 dimGrid, dim3 dimBlock)
GPU calling wrapper for in double precision.
double cureduce_sum_d(double *input, const unsigned int n, const unsigned short stream)
Sum all terms in an array of doubles.
void cuTranspose_f(float *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
void cuTranspose_d(double *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
void cuTranspose_U(unsigned int *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
__device__ void warpReduce_sum(volatile T *sdata, const unsigned int tid)
Performs a warp reduction for sum.
__global__ void reduce_sum(T *g_in_data, T *g_out_data, const unsigned int n)
Performs a block reduction for sum.
__device__ __forceinline__ T conj(const T &z)
Complex Conjugation.
void cuTranspose_z(Complex *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
__global__ void Mixed_Sumto(double *d, float *f, const unsigned int n)
Sums a float array into a double array.
void cuTranspose_c(Complex_f *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
void cuTranspose_I(int *out, const int fast_in, const int fast_out, const dim3 dimGrid, const dim3 dimBlock)
In place transpose used to convert from AoS to SoA memory layout.
__global__ void Transpose(T *out, const T *in, const int fast_in, const int fast_out)
Swaps the order of the gauge field so that it is now SoA instead of AoS and it is nice and coalesced ...
void cuMixed_Sumto(double *d, float *f, const unsigned int n, const dim3 dimGrid, const dim3 dimBlock)
Add a single to a double value, and save the output in the double array For complex valued arrays,...
Matrix multiplication and related declarations.
#define ngorkov
Gor'kov indices.
#define kvol
Sublattice volume.
#define Complex
Double precision complex number.
#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.
Complex Header for CUDA. Sets macros for C compatability.