71int main(
int argc,
char *argv[]){
73 const char funcname[] =
"main";
78 MPI_Comm_rank(comm, &
rank);
79 MPI_Comm_size(comm, &
size);
106 float akappa = 0.1780f;
111 float fmu = 0.0f;
int iread = 0;
int istart = 1;
116 float dt=0.004;
float c_sw = 0.0;
float delb=0;
117 float ajq = 0.0;
int stepl = 250;
int ntraj = 10;
121 const char *filename = (argc!=2) ?
"midout":argv[1];
123 if( !(midout = fopen(filename, fileop) ) ){
124 fprintf(stderr,
"Error %i in %s: Failed to open file %s for %s.\nExiting\n\n",\
133 fscanf(midout,
"%f %f %f %f %f %f %f %d %d %d %d %d", &dt, &beta, &akappa,\
134 &ajq, &c_sw, &fmu, &delb, &stepl, &ntraj, &istart, &icheck, &iread);
136 assert(stepl>0); assert(ntraj>0); assert(istart>=0); assert(icheck>0); assert(iread>=0);
141 fprintf(stderr,
"Error %i in %s: Multiple MPI Ranks are not currently supported for the clover action.\n"\
142 "This is due to the corner halo terms needed to compute the clover force not being implemented.\n"\
143 "Please recompile for a single MPI rank or run with c_sw=0.\n"\
144 "\nExiting...\n\n",
NOIMPL,funcname);
164 cudaGetDevice(&device);
170 cudaDeviceGetDefaultMemPool(&
mempool, device);
172 cudaMemPoolSetAttribute(
mempool, cudaMemPoolAttrReleaseThreshold, &threshold);
175 printf(
"jqq=%f+(%f)I\n",
creal(jqq),
cimag(jqq));
200 unsigned int *iu, *id;
205 cudaMallocManaged((
void**)&iu,
ndim*
kvol*
sizeof(
int),cudaMemAttachGlobal);
206 cudaMallocManaged((
void**)&
id,
ndim*
kvol*
sizeof(
int),cudaMemAttachGlobal);
208 cudaMallocManaged((
void **)&dk[0],(
kvolHalo)*
sizeof(
double),cudaMemAttachGlobal);
209 cudaMallocManaged((
void **)&dk[1],(
kvolHalo)*
sizeof(
double),cudaMemAttachGlobal);
211 cudaMallocManaged((
void **)&dk_f[0],(
kvolHalo)*
sizeof(
float),cudaMemAttachGlobal);
212 cudaMallocManaged((
void **)&dk_f[1],(
kvolHalo)*
sizeof(
float),cudaMemAttachGlobal);
214 cudaMalloc((
void **)&dk_f[0],(
kvolHalo)*
sizeof(
float));
215 cudaMalloc((
void **)&dk_f[1],(
kvolHalo)*
sizeof(
float));
219 cudaMallocManaged((
void **)&gamval_f,5*4*
sizeof(
Complex_f),cudaMemAttachGlobal);
220 cudaMallocManaged((
void **)&gamval,5*4*
sizeof(
Complex),cudaMemAttachGlobal);
221 cudaMallocManaged((
void **)&gamin,4*4*
sizeof(
short),cudaMemAttachGlobal);
223 cudaMallocManaged((
void **)&u[0],
ndim*
kvol*
sizeof(
Complex),cudaMemAttachGlobal);
224 cudaMallocManaged((
void **)&u[1],
ndim*
kvol*
sizeof(
Complex),cudaMemAttachGlobal);
238 id = (
unsigned int*)aligned_alloc(
AVX,
ndim*
kvol*
sizeof(
int));
239 iu = (
unsigned int*)aligned_alloc(
AVX,
ndim*
kvol*
sizeof(
int));
243 dk[0] = (
double *)aligned_alloc(
AVX,(
kvolHalo)*
sizeof(
double));
244 dk[1] = (
double *)aligned_alloc(
AVX,(
kvolHalo)*
sizeof(
double));
245 dk_f[0] = (
float *)aligned_alloc(
AVX,(
kvolHalo)*
sizeof(
float));
246 dk_f[1] = (
float *)aligned_alloc(
AVX,(
kvolHalo)*
sizeof(
float));
268 Init(istart,ibound,iread,beta,fmu,akappa,ajq,c_sw,u,ut,ut_f,gamval,gamval_f,gamin,dk,dk_f,iu,
id);
275 Init_CUDA(ut[0],ut[1],gamval,gamval_f,gamin,dk[0],dk[1],iu,
id);
282 for(
unsigned short mu=0;mu<
ndim;mu++){
291 for(
unsigned short mu=0;mu<
ndim;mu++){
301 Diagnostics(istart, u, ut, ut_f, iu,
id,
hu,
hd, dk,\
302 dk_f, gamin, gamval, gamval_f, sigval, sigval_f, sigin, jqq, akappa, beta, c_sw,ancg_diag);
310 if(!
rank) printf(
"Initial Polyakov loop evaluated as %e\n", poly);
312 double hg, avplaqs, avplaqt;
316 double traj=stepl*dt;
318 double proby = 2.5/stepl;
320 int buffer;
char buff2[7];
322 buffer = (int)round(100*beta);
323 sprintf(buff2,
"b%03d",buffer);
324 strcat(suffix,buff2);
326 buffer = (int)round(10000*akappa);
327 sprintf(buff2,
"k%04d",buffer);
328 strcat(suffix,buff2);
330 buffer = (int)round(1000*fmu);
331 sprintf(buff2,
"mu%04d",buffer);
332 strcat(suffix,buff2);
334 buffer = (int)round(1000*ajq);
335 sprintf(buff2,
"j%03d",buffer);
336 strcat(suffix,buff2);
339 buffer = (int)round(100*c_sw);
340 sprintf(buff2,
"c%03d",buffer);
341 strcat(suffix,buff2);
344 sprintf(buff2,
"s%02d",
nx);
345 strcat(suffix,buff2);
347 sprintf(buff2,
"t%02d",
nt);
348 strcat(suffix,buff2);
349 char outname[
FILELEN] =
"Output.";
char *outop=
"a";
350 strcat(outname,suffix);
353 if(!(output=fopen(outname, outop) )){
354 fprintf(stderr,
"Error %i in %s: Failed to open file %s for %s.\nExiting\n\n",
OPENERROR,funcname,outname,outop);
361 printf(
"hg = %e, <Ps> = %e, <Pt> = %e, <Poly> = %e\n", hg, avplaqs, avplaqt, poly);
362 fprintf(output,
"ksize = %i ksizet = %i Nf = %i Halo =%i\nTime step dt = %e Trajectory length = %e\n"\
363 "No. of Trajectories = %i β = %e\nκ = %e μ = %e\nDiquark source = %e Clover coefficient = %e\n"\
364 "Stopping Residuals: Guidance: %e Acceptance: %e, Estimator: %e\nSeed = %ld\n",
365 ksize,
ksizet,
nf,
halo, dt, traj, ntraj, beta, akappa, fmu, ajq, c_sw,
rescgg,
rescga,
respbp,
seed);
368 printf(
"ksize = %i ksizet = %i Nf = %i Halo = %i\nTime step dt = %e Trajectory length = %e\n"\
369 "No. of Trajectories = %i β = %e\nκ = %e μ = %e\nDiquark source = %e Clover coefficient = %e\n"\
370 "Stopping Residuals: Guidance: %e Acceptance: %e, Estimator: %e\nSeed = %ld\n",
371 ksize,
ksizet,
nf,
halo, dt, traj, ntraj, beta, akappa, fmu, ajq, c_sw,
rescgg,
rescga,
respbp,
seed);
376 double actiona = 0.0;
double vel2a = 0.0;
double pbpa = 0.0;
double endenfa = 0.0;
double denfa = 0.0;
378 double e_dH=0;
double e_dH_e=0;
380 double yav = 0.0;
double yyav = 0.0;
382 int naccp = 0;
int ipbp = 0;
int itot = 0;
395 cudaMallocManaged((
void **)&X0,
nf*
kferm2*
sizeof(
Complex),cudaMemAttachGlobal);
396 cudaMallocManaged((
void **)&Phi,
nf*
kferm*
sizeof(
Complex),cudaMemAttachGlobal);
397 cudaMallocManaged((
void **)&dSdpi,
kmom*
sizeof(
double),cudaMemAttachGlobal);
403 cudaMalloc((
void **)&dSdpi,
kmom*
sizeof(
double));
406 cudaMallocManaged((
void **)&pp,
kmom*
sizeof(
double),cudaMemAttachGlobal);
412 dSdpi = aligned_alloc(
AVX,
kmom*
sizeof(
double));
414 pp = aligned_alloc(
AVX,
kmom*
sizeof(
double));
425 start_time = MPI_Wtime();
427 start_time = omp_get_wtime();
433 double ancg,ancgh,totancg,totancgh;
434 ancg=ancgh=totancg=totancgh=0;
435 for(
int itraj = iread+1; itraj <= ntraj+iread; itraj++){
440 printf(
"Starting itraj %i\n", itraj);
444 Clover(clover,ut_f,iu,
id);
445 for(
int na=0; na<
nf; na++){
455 cudaMallocManaged((
void **)&R1,
kferm*
sizeof(
Complex),cudaMemAttachGlobal);
456 cudaMallocManaged((
void **)&R1_f,
kferm*
sizeof(
Complex_f),cudaMemAttachGlobal);
472#if (defined USE_GPU && defined _DEBUG)
479 Dslashd_f(R1_f,R,ut_f,iu,
id,gamval_f,gamin,dk_f,jqq,akappa);
481 ByClover_f(R1_f,R,clover,sigval_f,akappa,sigin,
true);
492 cudaFreeAsync(R1_f,
streams[0]);
497#pragma omp simd aligned(R1_f,R1:AVX)
498 for(
int i=0;i<
kferm;i++)
525 for(
unsigned short mu=0;mu<
ndim;mu++){
535 for(
unsigned short mu=0;mu<
ndim;mu++){
548 Hamilton(&H0,&S0,
rescga,pp,X0,X1,Phi,ut,ut_f,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,\
549 jqq,akappa,beta,c_sw,&ancgh,itraj);
551 if(!
rank) printf(
"H0: %e S0: %e\n", H0, S0);
558#if (defined INT_LPFR && defined INT_OMF2) ||(defined INT_LPFR && defined INT_OMF4)||(defined INT_OMF2 && defined INT_OMF4)
559#error "Only one integrator may be defined"
560#elif defined INT_LPFR
561 Leapfrog(ut,ut_f,X0,X1,Phi,dk,dk_f,dSdpi,pp,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,\
562 jqq,beta,akappa,c_sw,stepl,dt,&ancg,&itot,proby);
563#elif defined INT_OMF2
564 OMF2(ut,ut_f,X0,X1,Phi,dk,dk_f,dSdpi,pp,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,\
565 jqq,beta,akappa,c_sw,stepl,dt,&ancg,&itot,proby);
566#elif defined INT_OMF4
567#warning "OMF4 can be less efficient than OMF2 in certain cases. Use with caution. See http://dx.doi.org/10.1103/PhysRevE.73.036706"
568 OMF4(ut,ut_f,X0,X1,Phi,dk,dk_f,dSdpi,pp,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,\
569 jqq,beta,akappa,c_sw,stepl,dt,&ancg,&itot,proby);
571#error "No integrator defined. Please define {INT_LPFR.INT_OMF2,INT_OMF4}"
579 Hamilton(&H1,&S1,
rescga,pp,X0,X1,Phi,ut,ut_f,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,\
580 jqq,akappa,beta,c_sw,&ancgh,itraj);
584 printf(
"H0-H1=%f-%f",H0,H1);
592 fprintf(output,
"dH = %e dS = %e\n", dH, dS);
594 printf(
"dH = %e dS = %e\n", dH, dS);
597 e_dH+=dH; e_dH_e+=dH*dH;
607 printf(
"New configuration accepted on trajectory %i.\n", itraj);
613 for(
unsigned short mu=0;mu<
ndim;mu++){
622 for(
unsigned short mu=0;mu<
ndim;mu++){
634 printf(
"New configuration rejected on trajectory %i.\n", itraj);
643#elif defined USE_BLAS
644 vel2 = cblas_dnrm2(
kmom, pp, 1);
648 for(
int i=0; i<
kmom; i++)
661 for(
unsigned short mu=0;mu<
ndim;mu++){
671 for(
unsigned short mu=0;mu<
ndim;mu++){
680 printf(
"Starting measurements\n");
689 measure_check =
Measure(&pbp,&endenf,&denf,&qq,&qbqb,
respbp,&itercg,ut,ut_f,iu,
id,\
690 gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,jqq,akappa,c_sw,Phi);
693 printf(
"Finished measurements\n");
695 pbpa+=pbp; endenfa+=endenf; denfa+=denf; ipbp++;
705#pragma omp parallel for
706 for(
int i=0; i<4; i++)
715 fprintf(output,
"Measure (CG) %i Update (CG) %.3f Hamiltonian (CG) %.3f\n", itercg, ancg, ancgh);
721 char fortname[
FILELEN] =
"fermi.";
722 strcat(fortname,suffix);
723 const char *fortop= (itraj==1) ?
"w" :
"a";
724 if(!(fortout=fopen(fortname, fortop) )){
725 fprintf(stderr,
"Error %i in %s: Failed to open file %s for %s.\nExiting\n\n",\
734 fprintf(fortout,
"pbp\tendenf\tdenf\n");
736 fprintf(fortout,
"%e\t%e\t%e\n", NAN, NAN, NAN);
738 fprintf(fortout,
"%e\t%e\t%e\n", pbp, endenf, denf);
748 char fortname[
FILELEN] =
"bose.";
749 strcat(fortname,suffix);
750 const char *fortop= (itraj==1) ?
"w" :
"a";
751 if(!(fortout=fopen(fortname, fortop) )){
752 fprintf(stderr,
"Error %i in %s: Failed to open file %s for %s.\nExiting\n\n",\
756 fprintf(fortout,
"avplaqs\tavplaqt\tpoly\n");
757 fprintf(fortout,
"%e\t%e\t%e\n", avplaqs, avplaqt, poly);
764 char fortname[
FILELEN] =
"diq.";
765 strcat(fortname,suffix);
766 const char *fortop= (itraj==1) ?
"w" :
"a";
767 if(!(fortout=fopen(fortname, fortop) )){
768 fprintf(stderr,
"Error %i in %s: Failed to open file %s for %s.\nExiting\n\n",\
777 fprintf(fortout,
"Re(qq)\n");
779 fprintf(fortout,
"%e\n", NAN);
781 fprintf(fortout,
"%e\n",
creal(qq));
789 Par_swrite(itraj,icheck,beta,fmu,akappa,ajq,c_sw,u[0],u[1]);
798 elapsed = MPI_Wtime()-start_time;
800 elapsed = omp_get_wtime()-start_time;
808 cudaFree(dk[0]); cudaFree(dk[1]); cudaFree(dSdpi); cudaFree(pp);
809 cudaFree(Phi); cudaFree(ut[0]); cudaFree(ut[1]);
810 cudaFree(X0); cudaFree(X1); cudaFree(u[0]); cudaFree(u[1]);
811 cudaFree(
id); cudaFree(iu);
812 cudaFree(dk_f[0]); cudaFree(dk_f[1]); cudaFree(ut_f[0]); cudaFree(ut_f[1]);
813 cudaFree(gamin); cudaFree(gamval); cudaFree(gamval_f);
815 cudaFree(sigval); cudaFree(sigval_f); cudaFree(sigin);
819 free(dk[0]); free(dk[1]);free(dSdpi); free(pp);
820 free(Phi); free(ut[0]); free(ut[1]);
821 free(X0); free(X1); free(u[0]); free(u[1]);
823 free(dk_f[0]); free(dk_f[1]); free(ut_f[0]); free(ut_f[1]);
825 free(sigval); free(sigval_f); free(sigin);
834 FILE *sa3at = fopen(
"Bench_times.csv",
"a");
837 int cuversion; cudaRuntimeGetVersion(&cuversion);
838 sprintf(version,
"CUDA %d\tBlock: (%d,%d,%d)\tGrid: (%d,%d,%d)\n%s\n",cuversion,\
841 char *version=__VERSION__;
843 fprintf(sa3at,
"%s\nβ%0.3f κ:%0.4f μ:%0.4f j:%0.3f s:%i t:%i kvol:%ld\n"
844 "npx:%i npt:%i nthread:%i ncore:%i time:%f traj_time:%f\n\n",\
845 version,beta,akappa,fmu,ajq,
nx,
nt,
kvol,
npx,
npt,
nthreads,
npx*
npy*
npz*
npt*
nthreads,elapsed,elapsed/ntraj);
850 actiona/=ntraj; vel2a/=ntraj; pbpa/=ipbp; endenfa/=ipbp; denfa/=ipbp;
851 totancg/=ntraj; totancgh/=ntraj;
852 e_dH/=ntraj; e_dH_e=sqrt((e_dH_e/ntraj-e_dH*e_dH)/(ntraj-1));
853 yav/=ntraj; yyav=sqrt((yyav/ntraj - yav*yav)/(ntraj-1));
854 float traj_cost=totancg/dt;
855 double atraj=dt*itot/ntraj;
858 fprintf(output,
"Averages for the last %i trajectories\n"\
859 "Number of acceptances: %i\tAverage Trajectory Length = %e\n"\
860 "<dH>=%e+/-%e\t<exp(dH)>=%e+/-%e\tTrajectory cost=N_cg/dt =%e\n"\
861 "Average number of congrad iter guidance: %.3f acceptance %.3f\n"\
863 "Mean Square Velocity = %e\tAction Per Site = %e\n"\
864 "Energy Density = %e\tNumber Density %e\n\n\n",\
865 ntraj, naccp, atraj, e_dH,e_dH_e, yav, yyav, traj_cost, totancg, totancgh, pbpa, vel2a, actiona, endenfa, denfa);