introduce theta chunking for MPI jobs

This commit is contained in:
Martin Reinecke 2013-01-16 12:58:29 +01:00
parent 842b790b1f
commit 2353da0042

View file

@ -216,14 +216,37 @@ static void sharp_execute_job_mpi (sharp_job *job, MPI_Comm comm)
MPI_Barrier(comm);
double timer=wallTime();
int lmax = job->ainfo->lmax;
job->norm_l = sharp_Ylmgen_get_norm (lmax, job->spin);
job->opcnt=0;
sharp_mpi_info minfo;
sharp_make_mpi_info(comm, job, &minfo);
/* clear output arrays if requested */
if (minfo.npairtotal>minfo.ntasks*300)
{
int nsub=(minfo.npairtotal+minfo.ntasks*200-1)/(minfo.ntasks*200);
for (int isub=0; isub<nsub; ++isub)
{
sharp_job ljob=*job;
if ((isub>0)&&(job->type==SHARP_MAP2ALM)) ljob.flags|=SHARP_ADD;
sharp_geom_info lginfo;
lginfo.pair=RALLOC(sharp_ringpair,(job->ginfo->npairs/nsub)+1);
lginfo.npairs=0;
while (lginfo.npairs*nsub+isub<job->ginfo->npairs)
{
lginfo.pair[lginfo.npairs]=job->ginfo->pair[lginfo.npairs*nsub+isub];
++lginfo.npairs;
}
ljob.ginfo=&lginfo;
sharp_execute_job_mpi (&ljob,comm);
job->opcnt+=ljob.opcnt;
DEALLOC(lginfo.pair);
}
}
else
{
int lmax = job->ainfo->lmax;
job->norm_l = sharp_Ylmgen_get_norm (lmax, job->spin);
/* clear output arrays if requested */
init_output (job);
alloc_phase_mpi (job,job->ainfo->nm,job->ginfo->npairs,minfo.mmax+1,
@ -239,7 +262,7 @@ static void sharp_execute_job_mpi (sharp_job *job, MPI_Comm comm)
mlim[i] = sharp_get_mlim(lmax, job->spin, sth[i], cth[i], 100.);
}
/* map->phase where necessary */
/* map->phase where necessary */
map2phase (job, minfo.mmax, 0, job->ginfo->npairs);
map2alm_comm (job, &minfo);
@ -254,14 +277,14 @@ static void sharp_execute_job_mpi (sharp_job *job, MPI_Comm comm)
#pragma omp for schedule(dynamic,1)
for (int mi=0; mi<job->ainfo->nm; ++mi)
{
/* alm->alm_tmp where necessary */
/* alm->alm_tmp where necessary */
alm2almtmp (&ljob, lmax, mi);
/* inner conversion loop */
/* inner conversion loop */
inner_loop (&ljob, minfo.ispair, cth, sth, 0, minfo.npairtotal,
&generator, mi, mlim);
/* alm_tmp->alm where necessary */
/* alm_tmp->alm where necessary */
almtmp2alm (&ljob, lmax, mi);
}
@ -274,7 +297,7 @@ static void sharp_execute_job_mpi (sharp_job *job, MPI_Comm comm)
alm2map_comm (job, &minfo);
/* phase->map where necessary */
/* phase->map where necessary */
phase2map (job, minfo.mmax, 0, job->ginfo->npairs);
DEALLOC(mlim);
@ -282,6 +305,7 @@ static void sharp_execute_job_mpi (sharp_job *job, MPI_Comm comm)
DEALLOC(sth);
DEALLOC(job->norm_l);
dealloc_phase (job);
}
sharp_destroy_mpi_info(&minfo);
job->time=wallTime()-timer;
}