void DiracStaggeredPC::MdagM(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { if (!initDslash){ initDslashConstants(*fatGauge, in.Stride()); initStaggeredConstants(*fatGauge, *longGauge); } bool reset = newTmp(&tmp1, in); QudaParity parity = QUDA_INVALID_PARITY; QudaParity other_parity = QUDA_INVALID_PARITY; if (matpcType == QUDA_MATPC_EVEN_EVEN) { parity = QUDA_EVEN_PARITY; other_parity = QUDA_ODD_PARITY; } else if (matpcType == QUDA_MATPC_ODD_ODD) { parity = QUDA_ODD_PARITY; other_parity = QUDA_EVEN_PARITY; } else { errorQuda("Invalid matpcType(%d) in function\n", matpcType); } Dslash(*tmp1, in, other_parity); DslashXpay(out, *tmp1, parity, in, 4*mass*mass); deleteTmp(&tmp1, reset); }
void DiracStaggered::MdagM(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { if (!initDslash){ initDslashConstants(*fatGauge, in.Stride()); initStaggeredConstants(*fatGauge, *longGauge); } bool reset = newTmp(&tmp1, in); cudaColorSpinorField* mytmp = dynamic_cast<cudaColorSpinorField*>(&(tmp1->Even())); cudaColorSpinorField* ineven = dynamic_cast<cudaColorSpinorField*>(&(in.Even())); cudaColorSpinorField* inodd = dynamic_cast<cudaColorSpinorField*>(&(in.Odd())); cudaColorSpinorField* outeven = dynamic_cast<cudaColorSpinorField*>(&(out.Even())); cudaColorSpinorField* outodd = dynamic_cast<cudaColorSpinorField*>(&(out.Odd())); //even Dslash(*mytmp, *ineven, QUDA_ODD_PARITY); DslashXpay(*outeven, *mytmp, QUDA_EVEN_PARITY, *ineven, 4*mass*mass); //odd Dslash(*mytmp, *inodd, QUDA_EVEN_PARITY); DslashXpay(*outodd, *mytmp, QUDA_ODD_PARITY, *inodd, 4*mass*mass); deleteTmp(&tmp1, reset); }
Dirac::Dirac(const DiracParam ¶m) : gauge(*(param.gauge)), kappa(param.kappa), mass(param.mass), matpcType(param.matpcType), dagger(param.dagger), flops(0), tmp1(param.tmp1), tmp2(param.tmp2), tune(QUDA_TUNE_NO), verbose(param.verbose) { for (int i=0; i<4; i++) commDim[i] = param.commDim[i]; initLatticeConstants(gauge); initGaugeConstants(gauge); initDslashConstants(); }
Dirac::Dirac(const Dirac &dirac) : gauge(dirac.gauge), kappa(dirac.kappa), matpcType(dirac.matpcType), dagger(dirac.dagger), flops(0), tmp1(dirac.tmp1), tmp2(dirac.tmp2), tune(QUDA_TUNE_NO), verbose(dirac.verbose) { for (int i=0; i<4; i++) commDim[i] = dirac.commDim[i]; initLatticeConstants(gauge); initGaugeConstants(gauge); initDslashConstants(); }
// Protected method, also used for applying cloverInv void DiracClover::cloverApply(cudaColorSpinorField &out, const FullClover &clover, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) initDslashConstants(gauge, in.stride); if (!initClover) initCloverConstants(clover.even.stride); checkParitySpinor(in, out, clover); cloverCuda(&out, gauge, clover, &in, parity, blockClover); flops += 504*in.volume; }
// Public method to apply the clover term only void DiracClover::Clover(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) initDslashConstants(gauge, in.Stride()); if (!initClover) initCloverConstants(clover.Stride()); checkParitySpinor(in, out, clover); // regular clover term FullClover cs; cs.even = clover.even; cs.odd = clover.odd; cs.evenNorm = clover.evenNorm; cs.oddNorm = clover.oddNorm; cs.precision = clover.precision; cs.bytes = clover.bytes, cs.norm_bytes = clover.norm_bytes; cloverCuda(&out, gauge, cs, &in, parity); flops += 504*in.Volume(); }
// Full staggered operator void DiracStaggered::M(cudaColorSpinorField &out, const cudaColorSpinorField &in) const { if (!initDslash){ initDslashConstants(*fatGauge, in.Stride()); initStaggeredConstants(*fatGauge, *longGauge); } bool reset = newTmp(&tmp1, in.Even()); DslashXpay(out.Even(), in.Odd(), QUDA_EVEN_PARITY, *tmp1, 2*mass); DslashXpay(out.Odd(), in.Even(), QUDA_ODD_PARITY, *tmp1, 2*mass); deleteTmp(&tmp1, reset); }
void DiracStaggered::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) { initDslashConstants(*fatGauge, in.Stride()); initStaggeredConstants(*fatGauge, *longGauge); } checkParitySpinor(in, out); setFace(face); // FIXME: temporary hack maintain C linkage for dslashCuda staggeredDslashCuda(&out, *fatGauge, *longGauge, &in, parity, dagger, 0, 0, commDim); flops += 1146*in.Volume(); }
// Public method void DiracCloverPC::CloverInv(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) initDslashConstants(gauge, in.Stride()); if (!initClover) initCloverConstants(clover.Stride()); checkParitySpinor(in, out, clover); // needs to be cloverinv FullClover cs; cs.even = clover.evenInv; cs.odd = clover.oddInv; cs.evenNorm = clover.evenInvNorm; cs.oddNorm = clover.oddInvNorm; cs.precision = clover.precision; cs.bytes = clover.bytes, cs.norm_bytes = clover.norm_bytes; cloverCuda(&out, gauge, cs, &in, parity, tuneClover); flops += 504*in.Volume(); }
// apply hopping term, then clover: (A_ee^-1 D_eo) or (A_oo^-1 D_oe), // and likewise for dagger: (A_ee^-1 D^dagger_eo) or (A_oo^-1 D^dagger_oe) // NOTE - this isn't Dslash dagger since order should be reversed! void DiracCloverPC::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) initDslashConstants(gauge, in.stride); if (!initClover) initCloverConstants(clover.even.stride); checkParitySpinor(in, out, cloverInv); checkSpinorAlias(in, out); setFace(face); // FIXME: temporary hack maintain C linkage for dslashCuda cloverDslashCuda(&out, gauge, cloverInv, &in, parity, dagger, 0, 0.0, blockDslash, blockDslashFace); flops += (1320+504)*in.volume; }
void DiracDomainWall::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if ( in.Ndim() != 5 || out.Ndim() != 5) errorQuda("Wrong number of dimensions\n"); if (!initDslash) initDslashConstants(gauge, in.Stride()); if (!initDomainWall) initDomainWallConstants(in.X(4)); checkParitySpinor(in, out); checkSpinorAlias(in, out); domainWallDslashCuda(&out, gauge, &in, parity, dagger, 0, mass, 0, tuneDslash); long long Ls = in.X(4); long long bulk = (Ls-2)*(in.Volume()/Ls); long long wall = 2*in.Volume()/Ls; flops += 1320LL*(long long)in.Volume() + 96LL*bulk + 120LL*wall; }
// apply hopping term, then clover: (A_ee^-1 D_eo) or (A_oo^-1 D_oe), // and likewise for dagger: (A_ee^-1 D^dagger_eo) or (A_oo^-1 D^dagger_oe) // NOTE - this isn't Dslash dagger since order should be reversed! void DiracCloverPC::Dslash(cudaColorSpinorField &out, const cudaColorSpinorField &in, const QudaParity parity) const { if (!initDslash) initDslashConstants(gauge, in.Stride()); if (!initClover) initCloverConstants(clover.Stride()); checkParitySpinor(in, out, clover); checkSpinorAlias(in, out); setFace(face); // FIXME: temporary hack maintain C linkage for dslashCuda FullClover cs; cs.even = clover.evenInv; cs.odd = clover.oddInv; cs.evenNorm = clover.evenInvNorm; cs.oddNorm = clover.oddInvNorm; cs.precision = clover.precision; cs.bytes = clover.bytes, cs.norm_bytes = clover.norm_bytes; cloverDslashCuda(&out, gauge, cs, &in, parity, dagger, 0, 0.0, commDim); flops += (1320+504)*in.Volume(); }