SU3<floatT> temp; gSite site1; site1=GInd::site_up(site,mu); temp = SU3Accessor.template getLinkPath<All, HaloDepth>(site1,mu, nu,Back(mu), Back(mu), Back(nu)); temp += SU3Accessor.template getLinkPath<All, HaloDepth>(site1,nu, nu,Back(mu), Back(nu), Back(nu)); result += tr_d(temp,SU3Accessor.getLink(GInd::getSiteMu(site, mu)));
Reduced Rectangle is: 0.139255
SU3<floatT> temp; temp = SU3Accessor.template getLinkPath<All, HaloDepth>(site,mu,mu, nu,Back(mu), Back(mu), Back(nu)); temp += SU3Accessor.template getLinkPath<All, HaloDepth>(site,mu,nu, nu,Back(mu), Back(nu), Back(nu)); result += tr_d(temp);
Reduced Rectangle is :269532
SU3<floatT> temp; SU3<floatT> link; gSite site1; site1=GInd::site_up(site,mu); temp = SU3Accessor.template getLinkPath<All, HaloDepth>(site1,mu, nu,Back(mu), Back(mu), Back(nu)); temp += SU3Accessor.template getLinkPath<All, HaloDepth>(site1,nu, nu,Back(mu), Back(nu), Back(nu)); link=SU3Accessor.getLink(GInd::getSiteMu(site, mu)); result += tr_d(temp,link);
Reduced Rectangle is: 0.139255
SU3<floatT> temp; SU3<floatT> link; gSite site1; site1=GInd::site_up(site,mu); temp = SU3Accessor.template getLinkPath<All, HaloDepth>(site1,mu, nu,Back(mu), Back(mu), Back(nu)); temp += SU3Accessor.template getLinkPath<All, HaloDepth>(site1,nu, nu,Back(mu), Back(nu), Back(nu)); link=SU3Accessor.getLink(GInd::getSiteMu(site, mu)); link=dagger(link); result += tr_d(temp,link);
Reduced Rectangle is: 0.000282382
SU3<floatT> temp;
gSite site1;
gSite site2;
gSite site3;
gSite site4;
gSite site5;
gSite site6;
gSite site8;
site1=site;
site2=GInd::site_up(site1,mu);
site3=GInd::site_up(site2,mu);
site4=GInd::site_up(site3,nu);
site5=GInd::site_up(site2,nu);
site6=GInd::site_up(site1,nu);
site8=GInd::site_up(site6,nu);
//temp=SU3Accessor.getLink(GInd::getSiteMu(site1,mu))*SU3Accessor.getLink(GInd::getSiteMu(site2,mu))*SU3Accessor.getLink(GInd::getSiteMu(site3,nu))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site5,mu)))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site6,mu)))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site,nu)));
temp=SU3Accessor.getLink(GInd::getSiteMu(site1,mu))
*SU3Accessor.getLink(GInd::getSiteMu(site2,mu))
*SU3Accessor.getLink(GInd::getSiteMu(site3,nu))
*dagger(SU3Accessor.getLink(GInd::getSiteMu(site5,mu)))
*dagger(SU3Accessor.getLink(GInd::getSiteMu(site6,mu)))
*dagger(SU3Accessor.getLink(GInd::getSiteMu(site,nu)));
temp += SU3Accessor.getLink(GInd::getSiteMu(site1,mu))*SU3Accessor.getLink(GInd::getSiteMu(site2,nu))*SU3Accessor.getLink(GInd::getSiteMu(site5,nu))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site8,mu)))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site6,nu)))*dagger(SU3Accessor.getLink(GInd::getSiteMu(site,nu)));
result +=tr_d(temp);
Reduced Rectangle is: 0.269532
SU3<floatT> temp; gSite site1; gSite site2; gSite site3; gSite site4; gSite site5; gSite site6; gSite site8; site1=site; site2=GInd::site_up(site1,mu); site3=GInd::site_up(site2,mu); site4=GInd::site_up(site3,nu); site5=GInd::site_up(site2,nu); site6=GInd::site_up(site1,nu); site8=GInd::site_up(site6,nu); temp=SU3Accessor.getLink(GInd::getSiteMu(site1,mu))*SU3Accessor.getLink(GInd::getSiteMu(site2,mu))*SU3Accessor.getLink(GInd::getSiteMu(site3,nu))*(SU3Accessor.getLinkDagger(GInd::getSiteMu(site5,mu)))*(SU3Accessor.getLinkDagger(GInd::getSiteMu(site6,mu)))*SU3Accessor.getLinkDagger(GInd::getSiteMu(site,nu)); temp += SU3Accessor.getLink(GInd::getSiteMu(site1,mu))*SU3Accessor.getLink(GInd::getSiteMu(site2,nu))*SU3Accessor.getLink(GInd::getSiteMu(site5,nu))*(SU3Accessor.getLinkDagger(GInd::getSiteMu(site8,mu)))*(SU3Accessor.getLinkDagger(GInd::getSiteMu(site6,nu)))*(SU3Accessor.getLinkDagger(GInd::getSiteMu(site,nu))); result +=tr_d(temp);
Reduced Rectangle is: 0.269532
I am copying the code of calculating ractangle from rhmc.cpp
temp = SU3Accessor.getLink(GInd::getSiteMu(GInd::site_up(site, mu), mu) )
* SU3Accessor.getLink(GInd::getSiteMu(GInd::site_2up(site, mu), nu) )
* SU3Accessor.getLinkDagger(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), mu))
* SU3Accessor.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), mu))
* SU3Accessor.getLinkDagger(GInd::getSiteMu(site, nu));
temp += SU3Accessor.getLink(GInd::getSiteMu(GInd::site_up(site, mu), nu) )
* SU3Accessor.getLink(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), nu) )
* SU3Accessor.getLinkDagger(GInd::getSiteMu(GInd::site_2up(site, nu), mu))
* SU3Accessor.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), nu))
* SU3Accessor.getLinkDagger(GInd::getSiteMu(site, nu));
result += tr_d(SU3Accessor.getLink(GInd::getSiteMu(site, mu)), temp);
Reduced Rectangle is: 0.269532
Remarks
- In rhmc calcuations they inherited frm gAcc, rather than from SU3Accessor class.
I am copying the code of calculating ractangle from rhmc.cpp
temp = gAcc.getLink(GInd::getSiteMu(GInd::site_up(site, mu), mu) )
* gAcc.getLink(GInd::getSiteMu(GInd::site_2up(site, mu), nu) )
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(site, nu));
temp += gAcc.getLink(GInd::getSiteMu(GInd::site_up(site, mu), nu) )
* gAcc.getLink(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), nu) )
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_2up(site, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), nu))
* gAcc.getLinkDagger(GInd::getSiteMu(site, nu));
result += tr_d(gAcc.getLink(GInd::getSiteMu(site, mu)), temp);
I have tried adding more parameter while defining template structure.
#include "../simulateqcd.h"
#include <string>
#define PREC double
template<class floatT, bool onDevice,size_t HaloDepth, CompressionType comp>
struct CalcPlaq{
//Gauge accessor to access the gauge field
/* SU3Accessor<floatT> SU3Accessor; */
SU3Accessor<floatT,comp> gAcc;
//Constructor to initialize all necessary members.
CalcPlaq(Gaugefield<floatT,true,HaloDepth,comp> &gauge) : gAcc(gauge.getAccessor()){
}
//This is the operator that is called inside the Kernel
__device__ __host__ floatT operator()(gSite site) {
/// We need to choose the type of indexer. The first template is the layout of the lattice.
typedef GIndexer<All, HaloDepth> GInd;
/// Define a SU(3) matrix
SU3<floatT> temp;
SU3<floatT> link;
floatT result = 0;
/// loop through all directions which are needed by the four link variables in the plaquette
for (int nu = 1; nu < 4; nu++) {
for (int mu = 0; mu < nu; mu++) {
temp = gAcc.getLink(GInd::getSiteMu(GInd::site_up(site, mu), mu) )
* gAcc.getLink(GInd::getSiteMu(GInd::site_2up(site, mu), nu) )
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(site, nu));
temp += gAcc.getLink(GInd::getSiteMu(GInd::site_up(site, mu), nu) )
* gAcc.getLink(GInd::getSiteMu(GInd::site_up_up(site, mu, nu), nu) )
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_2up(site, nu), mu))
* gAcc.getLinkDagger(GInd::getSiteMu(GInd::site_up(site, nu), nu))
* gAcc.getLinkDagger(GInd::getSiteMu(site, nu));
result += tr_d(gAcc.getLink(GInd::getSiteMu(site, mu)), temp);
}
}
return result*0.5;
}
};
//Function to compute the plaquette using the above struct CalcPlaq.
template<class floatT, size_t HaloDepth,CompressionType comp>
floatT gPlaq(Gaugefield<floatT,true, HaloDepth,comp> &gauge, LatticeContainer<true,floatT> &redBase){
typedef GIndexer<All,HaloDepth> GInd;
const size_t elems = GInd::getLatData().vol4;
std::cout << "Total number of sites are : "<<elems<< std::endl;
//Make sure, redBase is large enough
redBase.adjustSize(elems);
redBase.template iterateOverBulk<All, HaloDepth>(CalcPlaq<floatT,true,HaloDepth,comp>(gauge));
//Do the final reduction
floatT plaq;
redBase.reduce(plaq, elems);
//Normalize the result
plaq /= (GInd::getLatData().globalLattice().mult()*18);
return plaq;
}
int main(int argc, char *argv[]) {
stdLogger.setVerbosity(DEBUG);
/// Initialize parameter class. This class can also read parameter from textfiles!
LatticeParameters param;
/// Initialize the Lattice dimension
/* const int LatDim[] = {24, 24, 20, 20}; */
const int LatDim[] = {24, 24, 24, 6};
const int NodeDim[] = {1, 1, 1, 1};
/// Just pass these dimensions to the parameter class
param.latDim.set(LatDim);
param.nodeDim.set(NodeDim);
/// Initialize a timer
StopWatch<true> timer;
/// Initialize the CommunicationBase. This class handles the communitation between different Cores/GPU's.
CommunicationBase commBase(&argc, &argv, true);
commBase.init(param.nodeDim()); //it will print node dimension
/// Set the HaloDepth. It should be a constant values, since this value should be passed as an non-type template
/// parameter to each kernel.
const size_t HaloDepth = 1;
// Initialize the Indexer on GPU and CPU.
initIndexer(HaloDepth,param,commBase);
typedef GIndexer<All,HaloDepth> GInd;
/// Initialize the Gaugefield. Basically, this object holds all SU(3)-matrices of the gaugefield.
/// The second template parameter determines whether the gaugefield should be stored on GPU or CPU but this will
/// be changed in the future ...
rootLogger.info("Initialize Gaugefield");
Gaugefield<PREC, true,HaloDepth> gauge(commBase);
/// Initialize gaugefield with unity-matrices.
gauge.one();
/// Initialize LatticeContainer. This is in principle the "array", where the values of the plaquette are
/// stored which are summed up in the end
LatticeContainer<true,PREC> redBase(commBase);
/// We need to tell the Reductionbase how large our Array will be
redBase.adjustSize(GInd::getLatData().vol4);
grnd_state<false> h_rand;
grnd_state<true> d_rand;
h_rand.make_rng_state(1337); // 1337 is random number generator seed
d_rand = h_rand;
//let me write a program to find it for all gague files:stored at "/root/try_16_output_dir/after_eqm/node0/l246f21b6285m0039185m0783706a_0.") starting from 200. in seperation of 10.
/// Read a configuration from hard drive.
/// I am incluiding the for loop to do it for all files
for (int i=250; i<=250;i+=10)
{
rootLogger.info("Reading Gauge Configuration");
gauge.readconf_nersc("/root/try_16_output_dir/after_eqm/node0/l246f21b6285m0039185m0783706a_0."+std::to_string(i));
/* gauge.random(d_rand.state); */
/// start timer...
timer.start();
/// define variable where the plaquette should be stored.
PREC plaq = 0;
/// Exchange Halos before calculating the plaquette! , it gives nan values if we don't exchange halos.
gauge.updateAll();
timer.start();
/// compute plaquette
plaq = gPlaq<PREC,HaloDepth>(gauge, redBase);
/// stop timer and print time
timer.stop();
rootLogger.info("Time for operators " , timer);
rootLogger.info("Reduced Rectangle is: " , plaq);
/* rootLogger.info("Reduced Plaquette is: " , plaq); */
}
return 0;
}
Reduced Rectangle is: 0.269532