17 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
Complex_f jqq,
float akappa){
18 const char funcname[] =
"Dslash";
27 cuDslash(phi,r,ut,iu,
id,gamval,gamin,dk,jqq,akappa,
dimGrid,
dimBlock);
31#pragma omp parallel for simd
32 for(
unsigned int i=0;i<
kvol;i++){
36 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
37 unsigned short igork = ((idirac>>1)+4)<<1;
38 unsigned int ind_d =4*
ndirac+(idirac>>1);
43 phi_s[idirac]=phi[ind_d]+a_1*r[ind_g];
44 phi_s[igork]=phi[ind_g]+a_2*r[ind_d];
46 phi_s[idirac+1]=phi[ind_d]+a_1*r[ind_g];
47 phi_s[igork+1]=phi[ind_g]+a_2*r[ind_d];
54 for(
unsigned short mu = 0; mu <3; mu++){
56 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
58 u11s=ut[0][ind]; u12s=ut[1][ind];
60 u11sd=ut[0][ind]; u12sd=ut[1][ind];
61 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
62 unsigned short idirac=igorkov&3;
63 unsigned short gind=mu*
ndirac+idirac;
66 unsigned short igork1 = (igorkov<4) ? gamin[gind] : gamin[gind]+4;
67 for(
unsigned short c=0;c<
nc;c++){
72 phi_s[igorkov*
nc]+=-akappa*(u11s*ru[0]+ u12s*ru[1]+\
73 conj(u11sd)*rd[0]- u12sd*rd[1]);
75 phi_s[igorkov*
nc]+=gam*(u11s*rgu[0]+ u12s*rgu[1]-\
76 conj(u11sd)*rgd[0]+ u12sd*rgd[1]);
78 phi_s[igorkov*
nc+1]+=-akappa*(-
conj(u12s)*ru[0]+
conj(u11s)*ru[1]+\
79 conj(u12sd)*rd[0]+ u11sd*rd[1]);
81 phi_s[igorkov*
nc+1]+=gam*(-
conj(u12s)*rgu[0]+
conj(u11s)*rgu[1]-\
82 conj(u12sd)*rgd[0]- u11sd*rgd[1]);
91 u11s=ut[0][ind]; u12s=ut[1][ind];
92 const double dk4ms=dk[0][i];
const double dk4ps=dk[1][i];
94 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
96 u11sd=ut[0][ind]; u12sd=ut[1][ind];
97 const double dk4msd=dk[0][did];
const double dk4psd=dk[1][did];
98 for(
unsigned short igorkov=0;igorkov<
ndirac;igorkov++){
99 unsigned short igork1 = gamin[3*
ndirac+igorkov];
100 for(
unsigned short c=0;c<
nc;c++){
106 -dk4ps*(u11s*(ru[0]-rgu[0]) +u12s*(ru[1]-rgu[1]))
107 -dk4msd*(
conj(u11sd)*(rd[0]+rgd[0]) -u12sd *(rd[1]+rgd[1]));
110 phi_s[igorkov*
nc+1]+=
111 -dk4ps*(-
conj(u12s)*(ru[0]-rgu[0]) +
conj(u11s)*(ru[1]-rgu[1]))
112 -dk4msd*(
conj(u12sd)*(rd[0]+rgd[0]) +u11sd *(rd[1]+rgd[1]));
114 const unsigned short igorkovPP=igorkov+4;
118 for(
unsigned short c=0;c<
nc;c++){
122 phi_s[igorkovPP*
nc]+=-dk4ms*(u11s*(ru[0]-rgu[0])+ u12s*(ru[1]-rgu[1]))-
123 dk4psd*(
conj(u11sd)*(rd[0]+rgd[0])- u12sd*(rd[1]+rgd[1]));
126 phi_s[igorkovPP*
nc+1]+=-dk4ms*(
conj(-u12s)*(ru[0]-rgu[0]) +
conj(u11s)*(ru[1]-rgu[1]))
127 -dk4psd*(
conj(u12sd)*(rd[0]+rgd[0]) +u11sd*(rd[1]+rgd[1]));
136 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
Complex_f jqq,
float akappa){
137 const char funcname[] =
"Dslashd";
145 cuDslashd(phi,r,ut,iu,
id,gamval,gamin,dk,jqq,akappa,
dimGrid,
dimBlock);
149#pragma omp parallel for simd
150 for(
unsigned int i=0;i<
kvol;i++){
154 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
155 unsigned short igork = ((idirac>>1)+4)<<1;
156 unsigned int ind_d =4*
ndirac+(idirac>>1);
160 phi_s[idirac]=phi[i+
kvol*idirac]+a_1*r[i+
kvolHalo*igork];
161 phi_s[igork]=phi[i+
kvol*igork]+a_2*r[i+
kvolHalo*idirac];
163 phi_s[idirac+1]=phi[i+
kvol*(idirac+1)]+a_1*r[i+
kvolHalo*(igork+1)];
164 phi_s[igork+1]=phi[i+
kvol*(igork+1)]+a_2*r[i+
kvolHalo*(idirac+1)];
171 for(
unsigned short mu = 0; mu <3; mu++){
173 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
175 u11s=ut[0][ind]; u12s=ut[1][ind];
177 u11sd=ut[0][ind]; u12sd=ut[1][ind];
178 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
179 unsigned short idirac=igorkov&3;
182 unsigned short igork1 = (igorkov<4) ? gamin[mu*
ndirac+idirac] : gamin[mu*
ndirac+idirac]+4;
183 for(
unsigned short c=0;c<
nc;c++){
188 phi_s[igorkov*
nc]-= akappa*(u11s*ru[0] +u12s*ru[1]
189 +
conj(u11sd)*rd[0] -u12sd *rd[1]);
192 phi_s[igorkov*
nc]-=gam* (u11s*rgu[0] +u12s*rgu[1]
193 -
conj(u11sd)*rgd[0] +u12sd *rgd[1]);
195 phi_s[igorkov*
nc+1]-= akappa*(-
conj(u12s)*ru[0] +
conj(u11s)*ru[1]
196 +
conj(u12sd)*rd[0] +u11sd *rd[1]);
198 phi_s[igorkov*
nc+1]-=gam* (-
conj(u12s)*rgu[0] +
conj(u11s)*rgu[1]
199 -
conj(u12sd)*rgd[0] -u11sd *rgd[1]);
210 u11s=ut[0][ind]; u12s=ut[1][ind];
211 const double dk4ms=dk[0][i];
const double dk4ps=dk[1][i];
213 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
215 u11sd=ut[0][ind]; u12sd=ut[1][ind];
216 const double dk4msd=dk[0][did];
const double dk4psd=dk[1][did];
217 for(
unsigned short igorkov=0; igorkov<
ndirac; igorkov++){
218 unsigned short igork1 = gamin[3*
ndirac+igorkov];
219 for(
unsigned short c=0;c<
nc;c++){
225 -dk4ms*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
226 -dk4psd*(
conj(u11sd)*(rd[0]-rgd[0]) -u12sd *(rd[1]-rgd[1]));
227 phi[i+
kvol*(igorkov*
nc)]=phi_s[igorkov*
nc];
229 phi_s[igorkov*
nc+1]+=
230 -dk4ms*(-
conj(u12s)*(ru[0]+rgu[0]) +
conj(u11s)*(ru[1]+rgu[1]))
231 -dk4psd*(
conj(u12sd)*(rd[0]-rgd[0]) +u11sd *(rd[1]-rgd[1]));
232 phi[i+
kvol*(igorkov*
nc+1)]=phi_s[igorkov*
nc+1];
233 const unsigned short igorkovPP=igorkov+4;
236 for(
unsigned short c=0;c<
nc;c++){
241 phi_s[igorkovPP*
nc]+=-dk4ps*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
242 -dk4msd*(
conj(u11sd)*(rd[0]-rgd[0]) -u12sd*(rd[1]-rgd[1]));
243 phi[i+
kvol*(igorkovPP*
nc)]=phi_s[igorkovPP*
nc];
245 phi_s[igorkovPP*
nc+1]+=dk4ps*(
conj(u12s)*(ru[0]+rgu[0]) -
conj(u11s)*(ru[1]+rgu[1]))
246 -dk4msd*(
conj(u12sd)*(rd[0]-rgd[0]) +u11sd*(rd[1]-rgd[1]));
247 phi[i+
kvol*(igorkovPP*
nc+1)]=phi_s[igorkovPP*
nc+1];
255 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
float akappa){
256 const char funcname[] =
"Hdslash";
265 cuHdslash(phi,r,ut,iu,
id,gamval,gamin,dk,akappa,
dimGrid,
dimBlock);
267 for(
unsigned short j=0;j<
nc*
ndirac;j++)
269#pragma omp parallel for simd
270 for(
unsigned int i=0;i<
kvol;i++){
274 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
276 for(
unsigned short c=0; c<
nc; c++)
278 phi_s[idirac+c]=phi[i+
kvolHalo*(c+idirac)];
281 for(
unsigned short mu = 0; mu <
ndim; mu++){
285 const int did=
id[ind];
const int uid = iu[ind];
288 for(
unsigned short idirac=0; idirac<
ndirac*
nc; idirac+=
nc){
289 const unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
291 for(
unsigned short c=0;c<
nc;c++){
293 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
295 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
303 phi_s[idirac]+=-akappa*(u11s*ru[0]+u12s*ru[1]+\
304 conj(u11sd)*rd[0]-u12sd*rd[1]);
306 phi_s[idirac]+=gam*(u11s*rgu[0]+u12s*rgu[1]-\
307 conj(u11sd)*rgd[0]+ u12sd*rgd[1]);
309 phi_s[idirac+1]+=-akappa*(-
conj(u12s)*ru[0]+
conj(u11s)*ru[1]+\
310 conj(u12sd)*rd[0]+ u11sd*rd[1]);
312 phi_s[idirac+1]+=gam*(-
conj(u12s)*rgu[0]+
conj(u11s)*rgu[1]-\
313 conj(u12sd)*rgd[0]- u11sd*rgd[1]);
317 const double dk4ms=dk[0][did];
const double dk4ps=dk[1][i];
320 phi_s[idirac+0]-= dk4ps*(u11s*(ru[0]-rgu[0])
321 +u12s*(ru[1]-rgu[1]));
322 phi_s[idirac+0]-= dk4ms*(
conj(u11sd)*(rd[0]+rgd[0])
323 -u12sd *(rd[1]+rgd[1]));
324 phi[i+
kvolHalo*(0+idirac)]=phi_s[idirac+0];
326 phi_s[idirac+1]-= dk4ps*(-
conj(u12s)*(ru[0]-rgu[0])
327 +
conj(u11s)*(ru[1]-rgu[1]));
328 phi_s[idirac+1]-= dk4ms*(
conj(u12sd)*(rd[0]+rgd[0])
329 +u11sd *(rd[1]+rgd[1]));
330 phi[i+
kvolHalo*(1+idirac)]=phi_s[idirac+1];
339 Complex gamval[20],
const unsigned short gamin[16],
double *dk[
nc],
float akappa){
340 const char funcname[] =
"Hdslashd";
348 cuHdslashd(phi,r,ut,iu,
id,gamval,gamin,dk,akappa,
dimGrid,
dimBlock);
350 for(
unsigned short j=0;j<
nc*
ndirac;j++)
353#pragma omp parallel for simd
354 for(
unsigned int i=0;i<
kvol;i++){
359 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
361 for(
unsigned short c=0; c<
nc; c++)
363 phi_s[idirac+c]=phi[i+
kvol*(c+idirac)];
366 for(
unsigned short mu = 0; mu <
ndim; mu++){
370 const int did=
id[ind];
const int uid = iu[ind];
373 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc){
374 unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
376 for(
unsigned short c=0;c<
nc;c++){
378 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
380 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
388 phi_s[idirac]-=akappa*(u11s*ru[0] +u12s*ru[1]
389 +
conj(u11sd)*rd[0] -u12sd *rd[1]);
391 phi_s[idirac]-=gam* (u11s*rgu[0] +u12s*rgu[1]
392 -
conj(u11sd)*rgd[0] +u12sd *rgd[1]);
394 phi_s[idirac+1]-=akappa*(-
conj(u12s)*ru[0] +
conj(u11s)*ru[1]
395 +
conj(u12sd)*rd[0] +u11sd *rd[1]);
397 phi_s[idirac+1]-=gam*(-
conj(u12s)*rgu[0] +
conj(u11s)*rgu[1]
398 -
conj(u12sd)*rgd[0] -u11sd *rgd[1]);
402 const double dk4ms=dk[0][i];
const double dk4ps=dk[1][did];
405 phi_s[idirac]+= -dk4ms*(u11s*(ru[0]+rgu[0])
406 +u12s*(ru[1]+rgu[1]));
407 phi_s[idirac]+= -dk4ps*(
conj(u11sd)*(rd[0]-rgd[0])
408 -u12sd *(rd[1]-rgd[1]));
409 phi[i+
kvol*(0+idirac)]=phi_s[idirac+0];
411 phi_s[idirac+1]-= dk4ms*(-
conj(u12s)*(ru[0]+rgu[0])
412 +
conj(u11s)*(ru[1]+rgu[1]));
413 phi_s[idirac+1]-= +dk4ps*(
conj(u12sd)*(rd[0]-rgd[0])
414 +u11sd *(rd[1]-rgd[1]));
415 phi[i+
kvol*(1+idirac)]=phi_s[idirac+1];
426 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
Complex_f jqq,
float akappa){
427 const char funcname[] =
"Dslash_f";
436 cuDslash_f(phi,r,ut,iu,
id,gamval,gamin,dk,jqq,akappa,
dimGrid,
dimBlock);
440#pragma omp parallel for simd
441 for(
unsigned int i=0;i<
kvol;i++){
445 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
446 unsigned short igork = ((idirac>>1)+4)<<1;
447 unsigned int ind_d =4*
ndirac+(idirac>>1);
452 phi_s[idirac]=phi[ind_d]+a_1*r[ind_g];
453 phi_s[igork]=phi[ind_g]+a_2*r[ind_d];
455 phi_s[idirac+1]=phi[ind_d]+a_1*r[ind_g];
456 phi_s[igork+1]=phi[ind_g]+a_2*r[ind_d];
463 for(
unsigned short mu = 0; mu <3; mu++){
465 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
467 u11s=ut[0][ind]; u12s=ut[1][ind];
469 u11sd=ut[0][ind]; u12sd=ut[1][ind];
470 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
471 unsigned short idirac=igorkov&3;
472 unsigned short gind=mu*
ndirac+idirac;
475 unsigned short igork1 = (igorkov<4) ? gamin[gind] : gamin[gind]+4;
476 for(
unsigned short c=0;c<
nc;c++){
481 phi_s[igorkov*
nc]+=-akappa*(u11s*ru[0]+ u12s*ru[1]+\
482 conjf(u11sd)*rd[0]- u12sd*rd[1]);
484 phi_s[igorkov*
nc]+=gam*(u11s*rgu[0]+ u12s*rgu[1]-\
485 conjf(u11sd)*rgd[0]+ u12sd*rgd[1]);
487 phi_s[igorkov*
nc+1]+=-akappa*(-conjf(u12s)*ru[0]+ conjf(u11s)*ru[1]+\
488 conjf(u12sd)*rd[0]+ u11sd*rd[1]);
490 phi_s[igorkov*
nc+1]+=gam*(-conjf(u12s)*rgu[0]+ conjf(u11s)*rgu[1]-\
491 conjf(u12sd)*rgd[0]- u11sd*rgd[1]);
500 u11s=ut[0][ind]; u12s=ut[1][ind];
501 const float dk4ms=dk[0][i];
const float dk4ps=dk[1][i];
503 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
505 u11sd=ut[0][ind]; u12sd=ut[1][ind];
506 const float dk4msd=dk[0][did];
const float dk4psd=dk[1][did];
507 for(
unsigned short igorkov=0;igorkov<
ndirac;igorkov++){
508 unsigned short igork1 = gamin[3*
ndirac+igorkov];
509 for(
unsigned short c=0;c<
nc;c++){
515 -dk4ps*(u11s*(ru[0]-rgu[0]) +u12s*(ru[1]-rgu[1]))
516 -dk4msd*(conjf(u11sd)*(rd[0]+rgd[0]) -u12sd *(rd[1]+rgd[1]));
519 phi_s[igorkov*
nc+1]+=
520 -dk4ps*(-conjf(u12s)*(ru[0]-rgu[0]) +conjf(u11s)*(ru[1]-rgu[1]))
521 -dk4msd*(conjf(u12sd)*(rd[0]+rgd[0]) +u11sd *(rd[1]+rgd[1]));
523 const unsigned short igorkovPP=igorkov+4;
527 for(
unsigned short c=0;c<
nc;c++){
531 phi_s[igorkovPP*
nc]+=-dk4ms*(u11s*(ru[0]-rgu[0])+ u12s*(ru[1]-rgu[1]))-
532 dk4psd*(conjf(u11sd)*(rd[0]+rgd[0])- u12sd*(rd[1]+rgd[1]));
535 phi_s[igorkovPP*
nc+1]+=-dk4ms*(conjf(-u12s)*(ru[0]-rgu[0]) +conjf(u11s)*(ru[1]-rgu[1]))
536 -dk4psd*(conjf(u12sd)*(rd[0]+rgd[0]) +u11sd*(rd[1]+rgd[1]));
545 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
Complex_f jqq,
float akappa){
546 const char funcname[] =
"Dslashd_f";
554 cuDslashd_f(phi,r,ut,iu,
id,gamval,gamin,dk,jqq,akappa,
dimGrid,
dimBlock);
558#pragma omp parallel for simd
559 for(
unsigned int i=0;i<
kvol;i++){
563 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
564 unsigned short igork = ((idirac>>1)+4)<<1;
565 unsigned int ind_d =4*
ndirac+(idirac>>1);
569 phi_s[idirac]=phi[i+
kvol*idirac]+a_1*r[i+
kvolHalo*igork];
570 phi_s[igork]=phi[i+
kvol*igork]+a_2*r[i+
kvolHalo*idirac];
572 phi_s[idirac+1]=phi[i+
kvol*(idirac+1)]+a_1*r[i+
kvolHalo*(igork+1)];
573 phi_s[igork+1]=phi[i+
kvol*(igork+1)]+a_2*r[i+
kvolHalo*(idirac+1)];
580 for(
unsigned short mu = 0; mu <3; mu++){
582 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
584 u11s=ut[0][ind]; u12s=ut[1][ind];
586 u11sd=ut[0][ind]; u12sd=ut[1][ind];
587 for(
unsigned short igorkov=0; igorkov<
ngorkov; igorkov++){
588 unsigned short idirac=igorkov&3;
591 unsigned short igork1 = (igorkov<4) ? gamin[mu*
ndirac+idirac] : gamin[mu*
ndirac+idirac]+4;
592 for(
unsigned short c=0;c<
nc;c++){
597 phi_s[igorkov*
nc]-= akappa*(u11s*ru[0] +u12s*ru[1]
598 +conjf(u11sd)*rd[0] -u12sd *rd[1]);
601 phi_s[igorkov*
nc]-=gam* (u11s*rgu[0] +u12s*rgu[1]
602 -conjf(u11sd)*rgd[0] +u12sd *rgd[1]);
604 phi_s[igorkov*
nc+1]-= akappa*(-conjf(u12s)*ru[0] +conjf(u11s)*ru[1]
605 +conjf(u12sd)*rd[0] +u11sd *rd[1]);
607 phi_s[igorkov*
nc+1]-=gam* (-conjf(u12s)*rgu[0] +conjf(u11s)*rgu[1]
608 -conjf(u12sd)*rgd[0] -u11sd *rgd[1]);
619 u11s=ut[0][ind]; u12s=ut[1][ind];
620 const float dk4ms=dk[0][i];
const float dk4ps=dk[1][i];
622 const unsigned int did=
id[ind];
const unsigned int uid = iu[ind];
624 u11sd=ut[0][ind]; u12sd=ut[1][ind];
625 const float dk4msd=dk[0][did];
const float dk4psd=dk[1][did];
626 for(
unsigned short igorkov=0; igorkov<
ndirac; igorkov++){
627 unsigned short igork1 = gamin[3*
ndirac+igorkov];
628 for(
unsigned short c=0;c<
nc;c++){
634 -dk4ms*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
635 -dk4psd*(conjf(u11sd)*(rd[0]-rgd[0]) -u12sd *(rd[1]-rgd[1]));
636 phi[i+
kvol*(igorkov*
nc)]=phi_s[igorkov*
nc];
638 phi_s[igorkov*
nc+1]+=
639 -dk4ms*(-conjf(u12s)*(ru[0]+rgu[0]) +conjf(u11s)*(ru[1]+rgu[1]))
640 -dk4psd*(conjf(u12sd)*(rd[0]-rgd[0]) +u11sd *(rd[1]-rgd[1]));
641 phi[i+
kvol*(igorkov*
nc+1)]=phi_s[igorkov*
nc+1];
642 const unsigned short igorkovPP=igorkov+4;
645 for(
unsigned short c=0;c<
nc;c++){
650 phi_s[igorkovPP*
nc]+=-dk4ps*(u11s*(ru[0]+rgu[0]) +u12s*(ru[1]+rgu[1]))
651 -dk4msd*(conjf(u11sd)*(rd[0]-rgd[0]) -u12sd*(rd[1]-rgd[1]));
652 phi[i+
kvol*(igorkovPP*
nc)]=phi_s[igorkovPP*
nc];
654 phi_s[igorkovPP*
nc+1]+=dk4ps*(conjf(u12s)*(ru[0]+rgu[0]) -conjf(u11s)*(ru[1]+rgu[1]))
655 -dk4msd*(conjf(u12sd)*(rd[0]-rgd[0]) +u11sd*(rd[1]-rgd[1]));
656 phi[i+
kvol*(igorkovPP*
nc+1)]=phi_s[igorkovPP*
nc+1];
664 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
float akappa){
665 const char funcname[] =
"Hdslash_f";
671 cuHdslash_f(phi,r,ut,iu,
id,gamval,gamin,dk,akappa,
dimGrid,
dimBlock);
674 for(
unsigned short j=0;j<
nc*
ndirac;j++)
676#pragma omp parallel for simd
677 for(
unsigned int i=0;i<
kvol;i++){
681 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
683 for(
unsigned short c=0; c<
nc; c++)
686 phi_s[idirac+c]=phi[i+
kvolHalo*(c+idirac)];
689 for(
unsigned short mu = 0; mu <
ndim; mu++){
693 const int did=
id[ind];
const int uid = iu[ind];
696 for(
unsigned short idirac=0; idirac<
ndirac*
nc; idirac+=
nc){
697 const unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
699 for(
unsigned short c=0;c<
nc;c++){
701 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
703 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
711 phi_s[idirac]+=-akappa*(u11s*ru[0]+u12s*ru[1]+\
712 conjf(u11sd)*rd[0]-u12sd*rd[1]);
714 phi_s[idirac]+=gam*(u11s*rgu[0]+u12s*rgu[1]-\
715 conjf(u11sd)*rgd[0]+ u12sd*rgd[1]);
717 phi_s[idirac+1]+=-akappa*(-conjf(u12s)*ru[0]+ conjf(u11s)*ru[1]+\
718 conjf(u12sd)*rd[0]+ u11sd*rd[1]);
720 phi_s[idirac+1]+=gam*(-conjf(u12s)*rgu[0]+ conjf(u11s)*rgu[1]-\
721 conjf(u12sd)*rgd[0]- u11sd*rgd[1]);
725 const float dk4ms=dk[0][did];
const float dk4ps=dk[1][i];
728 phi_s[idirac+0]-= dk4ps*(u11s*(ru[0]-rgu[0])
729 +u12s*(ru[1]-rgu[1]));
730 phi_s[idirac+0]-= dk4ms*(conjf(u11sd)*(rd[0]+rgd[0])
731 -u12sd *(rd[1]+rgd[1]));
732 phi[i+
kvolHalo*(0+idirac)]=phi_s[idirac+0];
734 phi_s[idirac+1]-= dk4ps*(-conjf(u12s)*(ru[0]-rgu[0])
735 +conjf(u11s)*(ru[1]-rgu[1]));
736 phi_s[idirac+1]-= dk4ms*(conjf(u12sd)*(rd[0]+rgd[0])
737 +u11sd *(rd[1]+rgd[1]));
738 phi[i+
kvolHalo*(1+idirac)]=phi_s[idirac+1];
747 Complex_f gamval[20],
const unsigned short gamin[16],
float *dk[
nc],
float akappa){
748 const char funcname[] =
"Hdslashd_f";
758 cuHdslashd_f(phi,r,ut,iu,
id,gamval,gamin,dk,akappa,
dimGrid,
dimBlock);
760 for(
unsigned short j=0;j<
nc*
ndirac;j++)
764#pragma omp parallel for simd
765 for(
unsigned int i=0;i<
kvol;i++){
770 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc)
772 for(
unsigned short c=0; c<
nc; c++)
774 phi_s[idirac+c]=phi[i+
kvol*(c+idirac)];
777 for(
unsigned short mu = 0; mu <
ndim; mu++){
781 const int did=
id[ind];
const int uid = iu[ind];
784 for(
unsigned short idirac=0; idirac<
nc*
ndirac; idirac+=
nc){
785 unsigned short igork1 = gamin[mu*
ndirac+(idirac>>1)] << (
nc-1);
787 for(
unsigned short c=0;c<
nc;c++){
789 ru[c]=r[uid+ind]; rd[c]=r[did+ind];
791 rgu[c]=r[uid+ind]; rgd[c]=r[did+ind];
799 phi_s[idirac]-=akappa*(u11s*ru[0] +u12s*ru[1]
800 +conjf(u11sd)*rd[0] -u12sd *rd[1]);
802 phi_s[idirac]-=gam* (u11s*rgu[0] +u12s*rgu[1]
803 -conjf(u11sd)*rgd[0] +u12sd *rgd[1]);
805 phi_s[idirac+1]-=akappa*(-conjf(u12s)*ru[0] +conjf(u11s)*ru[1]
806 +conjf(u12sd)*rd[0] +u11sd *rd[1]);
808 phi_s[idirac+1]-=gam*(-conjf(u12s)*rgu[0] +conjf(u11s)*rgu[1]
809 -conjf(u12sd)*rgd[0] -u11sd *rgd[1]);
813 const float dk4ms=dk[0][i];
const float dk4ps=dk[1][did];
816 phi_s[idirac]+= -dk4ms*(u11s*(ru[0]+rgu[0])
817 +u12s*(ru[1]+rgu[1]));
818 phi_s[idirac]+= -dk4ps*(conjf(u11sd)*(rd[0]-rgd[0])
819 -u12sd *(rd[1]-rgd[1]));
820 phi[i+
kvol*(0+idirac)]=phi_s[idirac+0];
822 phi_s[idirac+1]-= dk4ms*(-conjf(u12s)*(ru[0]+rgu[0])
823 +conjf(u11s)*(ru[1]+rgu[1]));
824 phi_s[idirac+1]-= +dk4ps*(conjf(u12sd)*(rd[0]-rgd[0])
825 +u11sd *(rd[1]-rgd[1]));
826 phi[i+
kvol*(1+idirac)]=phi_s[idirac+1];
837 const volatile char funcname[]=
"Transpose_c";
843 memcpy(in,out,fast_in*fast_out*
sizeof(
Complex_f));
845 if(fast_out>fast_in){
846 for(
int x=0;x<fast_out;x++)
847 for(
int y=0; y<fast_in;y++)
848 out[y*fast_out+x]=in[x*fast_in+y];
852 for(
int x=0; x<fast_out;x++)
853 for(
int y=0;y<fast_in;y++)
854 out[y*fast_out+x]=in[x*fast_in+y];
860 const volatile char funcname[]=
"Transpose_c";
866 memcpy(in,out,fast_in*fast_out*
sizeof(
Complex));
868 if(fast_out>fast_in){
869 for(
int x=0;x<fast_out;x++)
870 for(
int y=0; y<fast_in;y++)
871 out[y*fast_out+x]=in[x*fast_in+y];
875 for(
int x=0; x<fast_out;x++)
876 for(
int y=0;y<fast_in;y++)
877 out[y*fast_out+x]=in[x*fast_in+y];
882inline void Transpose_f(
float *out,
const int fast_in,
const int fast_out){
883 const char funcname[]=
"Transpose_f";
888 float *in = (
float *)aligned_alloc(
AVX,fast_in*fast_out*
sizeof(
float));
889 memcpy(in,out,fast_in*fast_out*
sizeof(
float));
891 if(fast_out>fast_in){
892 for(
int x=0;x<fast_out;x++)
893 for(
int y=0; y<fast_in;y++)
894 out[y*fast_out+x]=in[x*fast_in+y];
898 for(
int x=0; x<fast_out;x++)
899 for(
int y=0;y<fast_in;y++)
900 out[y*fast_out+x]=in[x*fast_in+y];
905inline void Transpose_d(
double *out,
const int fast_in,
const int fast_out){
906 const char funcname[]=
"Transpose_f";
911 double *in = (
double *)aligned_alloc(
AVX,fast_in*fast_out*
sizeof(
double));
912 memcpy(in,out,fast_in*fast_out*
sizeof(
double));
914 if(fast_out>fast_in){
915 for(
int x=0;x<fast_out;x++)
916 for(
int y=0; y<fast_in;y++)
917 out[y*fast_out+x]=in[x*fast_in+y];
921 for(
int x=0; x<fast_out;x++)
922 for(
int y=0;y<fast_in;y++)
923 out[y*fast_out+x]=in[x*fast_in+y];
928inline void Transpose_I(
int *out,
const int fast_in,
const int fast_out){
929 const char funcname[]=
"Transpose_I";
934 int *in = (
int *)aligned_alloc(
AVX,fast_in*fast_out*
sizeof(
int));
935 memcpy(in,out,fast_in*fast_out*
sizeof(
int));
937 if(fast_out>fast_in){
938 for(
int x=0;x<fast_out;x++)
939 for(
int y=0; y<fast_in;y++)
940 out[y*fast_out+x]=in[x*fast_in+y];
944 for(
int x=0; x<fast_out;x++)
945 for(
int y=0;y<fast_in;y++)
946 out[y*fast_out+x]=in[x*fast_in+y];
951inline void Transpose_U(
unsigned int *out,
const int fast_in,
const int fast_out){
952 const char funcname[]=
"Transpose_I";
957 unsigned int *in = (
unsigned int *)aligned_alloc(
AVX,fast_in*fast_out*
sizeof(
unsigned int));
958 memcpy(in,out,fast_in*fast_out*
sizeof(
unsigned int));
960 if(fast_out>fast_in){
961 for(
unsigned int x=0;x<fast_out;x++)
962 for(
unsigned int y=0; y<fast_in;y++)
963 out[y*fast_out+x]=in[x*fast_in+y];
967 for(
unsigned int x=0; x<fast_out;x++)
968 for(
unsigned int y=0;y<fast_in;y++)
969 out[y*fast_out+x]=in[x*fast_in+y];
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.
int Dslash_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)
Evaluates in single 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.
int Dslashd_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)
Evaluates 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.
int Hdslashd_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)
Evaluates in single precision.
int Hdslashd(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)
Evaluates in double precision.
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.
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.
int Hdslash(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)
Evaluates in double precision.
int Dslashd(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)
Evaluates 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.
int Hdslash_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)
Evaluates in single precision.
int Dslash(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)
Evaluates in double precision.
void Transpose_c(Complex_f *out, const int fast_in, const int fast_out)
In place transpose used to convert from AoS to SoA memory layout.
void Transpose_U(unsigned int *out, const int fast_in, const int fast_out)
In place transpose used to convert from AoS to SoA memory layout.
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__ __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.
void Transpose_f(float *out, const int fast_in, const int fast_out)
In place transpose used to convert from AoS to SoA memory layout.
void Transpose_z(Complex *out, const int fast_in, const int fast_out)
In place transpose used to convert from AoS to SoA memory layout.
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 Transpose_d(double *out, const int fast_in, const int fast_out)
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.
void Transpose_I(int *out, const int fast_in, const int fast_out)
In place transpose used to convert from AoS to SoA memory layout.
int CHalo_swap_all(Complex_f *c, int ncpt)
Calls the functions to send data to both the up and down halos.
int ZHalo_swap_all(Complex *z, int ncpt)
Calls the functions to send data to both the up and down halos.
Matrix multiplication and related declarations.
#define AVX
Alignment of arrays. 64 for AVX-512, 32 for AVX/AVX2. 16 for SSE. Since AVX is standard on modern x86...
#define ngorkov
Gor'kov indices.
#define kvol
Sublattice volume.
#define Complex
Double precision complex number.
#define ndirac
Dirac indices.
#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.