multithreading demonstrated to work, but not safe yet

This commit is contained in:
Martin Reinecke 2020-01-03 18:26:53 +01:00
parent 0f8051fc28
commit 54cbae0534
3 changed files with 65 additions and 64 deletions

View file

@ -24,7 +24,7 @@ libsharp2_la_SOURCES = \
# any backward-compatible change: increase age # any backward-compatible change: increase age
# any backward-incompatible change: age=0 # any backward-incompatible change: age=0
# ==> age <= current # ==> age <= current
libsharp2_la_LDFLAGS = -version-info 0:0:0 libsharp2_la_LDFLAGS = -version-info 0:0:0 -lpthread
AM_CXXFLAGS = @AM_CXXFLAGS@ AM_CXXFLAGS = @AM_CXXFLAGS@

View file

@ -33,6 +33,7 @@
#include "libsharp2/sharp_utils.h" #include "libsharp2/sharp_utils.h"
#include "libsharp2/sharp_almhelpers.h" #include "libsharp2/sharp_almhelpers.h"
#include "libsharp2/sharp_geomhelpers.h" #include "libsharp2/sharp_geomhelpers.h"
#include "mr_util/threading.h"
typedef complex<double> dcmplx; typedef complex<double> dcmplx;
typedef complex<float> fcmplx; typedef complex<float> fcmplx;
@ -760,31 +761,31 @@ NOINLINE static void map2phase (sharp_job *job, int mmax, int llim, int ulim)
} }
else else
{ {
#pragma omp parallel mr::execDynamic(ulim-llim, 0, 1, [&](mr::Scheduler &sched)
{
ringhelper helper;
ringhelper_init(&helper);
int rstride=job->ginfo->nphmax+2;
double *ringtmp=RALLOC(double,job->nmaps*rstride);
#pragma omp for schedule(dynamic,1)
for (int ith=llim; ith<ulim; ++ith)
{ {
int dim2 = job->s_th*(ith-llim); ringhelper helper;
ring2ringtmp(job,&(job->ginfo->pair[ith].r1),ringtmp,rstride); ringhelper_init(&helper);
for (int i=0; i<job->nmaps; ++i) int rstride=job->ginfo->nphmax+2;
ringhelper_ring2phase (&helper,&(job->ginfo->pair[ith].r1), double *ringtmp=RALLOC(double,job->nmaps*rstride);
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i],pstride,job->flags);
if (job->ginfo->pair[ith].r2.nph>0) while (auto rng=sched.getNext()) for(auto ith=rng.lo+llim; ith<rng.hi+llim; ++ith)
{ {
ring2ringtmp(job,&(job->ginfo->pair[ith].r2),ringtmp,rstride); int dim2 = job->s_th*(ith-llim);
ring2ringtmp(job,&(job->ginfo->pair[ith].r1),ringtmp,rstride);
for (int i=0; i<job->nmaps; ++i) for (int i=0; i<job->nmaps; ++i)
ringhelper_ring2phase (&helper,&(job->ginfo->pair[ith].r2), ringhelper_ring2phase (&helper,&(job->ginfo->pair[ith].r1),
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i+1],pstride,job->flags); &ringtmp[i*rstride],mmax,&job->phase[dim2+2*i],pstride,job->flags);
if (job->ginfo->pair[ith].r2.nph>0)
{
ring2ringtmp(job,&(job->ginfo->pair[ith].r2),ringtmp,rstride);
for (int i=0; i<job->nmaps; ++i)
ringhelper_ring2phase (&helper,&(job->ginfo->pair[ith].r2),
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i+1],pstride,job->flags);
}
} }
} DEALLOC(ringtmp);
DEALLOC(ringtmp); ringhelper_destroy(&helper);
ringhelper_destroy(&helper); }); /* end of parallel region */
} /* end of parallel region */
} }
} }
@ -805,31 +806,31 @@ NOINLINE static void phase2map (sharp_job *job, int mmax, int llim, int ulim)
} }
else else
{ {
#pragma omp parallel mr::execDynamic(ulim-llim, 0, 1, [&](mr::Scheduler &sched)
{
ringhelper helper;
ringhelper_init(&helper);
int rstride=job->ginfo->nphmax+2;
double *ringtmp=RALLOC(double,job->nmaps*rstride);
#pragma omp for schedule(dynamic,1)
for (int ith=llim; ith<ulim; ++ith)
{ {
int dim2 = job->s_th*(ith-llim); ringhelper helper;
for (int i=0; i<job->nmaps; ++i) ringhelper_init(&helper);
ringhelper_phase2ring (&helper,&(job->ginfo->pair[ith].r1), int rstride=job->ginfo->nphmax+2;
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i],pstride,job->flags); double *ringtmp=RALLOC(double,job->nmaps*rstride);
ringtmp2ring(job,&(job->ginfo->pair[ith].r1),ringtmp,rstride);
if (job->ginfo->pair[ith].r2.nph>0) while (auto rng=sched.getNext()) for(auto ith=rng.lo+llim; ith<rng.hi+llim; ++ith)
{ {
int dim2 = job->s_th*(ith-llim);
for (int i=0; i<job->nmaps; ++i) for (int i=0; i<job->nmaps; ++i)
ringhelper_phase2ring (&helper,&(job->ginfo->pair[ith].r2), ringhelper_phase2ring (&helper,&(job->ginfo->pair[ith].r1),
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i+1],pstride,job->flags); &ringtmp[i*rstride],mmax,&job->phase[dim2+2*i],pstride,job->flags);
ringtmp2ring(job,&(job->ginfo->pair[ith].r2),ringtmp,rstride); ringtmp2ring(job,&(job->ginfo->pair[ith].r1),ringtmp,rstride);
if (job->ginfo->pair[ith].r2.nph>0)
{
for (int i=0; i<job->nmaps; ++i)
ringhelper_phase2ring (&helper,&(job->ginfo->pair[ith].r2),
&ringtmp[i*rstride],mmax,&job->phase[dim2+2*i+1],pstride,job->flags);
ringtmp2ring(job,&(job->ginfo->pair[ith].r2),ringtmp,rstride);
}
} }
} DEALLOC(ringtmp);
DEALLOC(ringtmp); ringhelper_destroy(&helper);
ringhelper_destroy(&helper); }); /* end of parallel region */
} /* end of parallel region */
} }
} }
@ -871,32 +872,32 @@ NOINLINE static void sharp_execute_job (sharp_job *job)
/* map->phase where necessary */ /* map->phase where necessary */
map2phase (job, mmax, llim, ulim); map2phase (job, mmax, llim, ulim);
#pragma omp parallel mr::execDynamic(job->ainfo->nm, 0, 1, [&](mr::Scheduler &sched)
{
sharp_job ljob = *job;
ljob.opcnt=0;
sharp_Ylmgen_C generator;
sharp_Ylmgen_init (&generator,lmax,mmax,ljob.spin);
alloc_almtmp(&ljob,lmax);
#pragma omp for schedule(dynamic,1)
for (int mi=0; mi<job->ainfo->nm; ++mi)
{ {
/* alm->alm_tmp where necessary */ sharp_job ljob = *job;
alm2almtmp (&ljob, lmax, mi); ljob.opcnt=0;
sharp_Ylmgen_C generator;
sharp_Ylmgen_init (&generator,lmax,mmax,ljob.spin);
alloc_almtmp(&ljob,lmax);
inner_loop (&ljob, ispair, cth, sth, llim, ulim, &generator, mi, mlim); while (auto rng=sched.getNext()) for(auto mi=rng.lo; mi<rng.hi; ++mi)
{
/* alm->alm_tmp where necessary */
alm2almtmp (&ljob, lmax, mi);
inner_loop (&ljob, ispair, cth, sth, llim, ulim, &generator, mi, mlim);
/* alm_tmp->alm where necessary */ /* alm_tmp->alm where necessary */
almtmp2alm (&ljob, lmax, mi); almtmp2alm (&ljob, lmax, mi);
} }
sharp_Ylmgen_destroy(&generator); sharp_Ylmgen_destroy(&generator);
dealloc_almtmp(&ljob); dealloc_almtmp(&ljob);
#pragma omp critical //#pragma omp critical
//FIXME!!!!
job->opcnt+=ljob.opcnt; job->opcnt+=ljob.opcnt;
} /* end of parallel region */ }); /* end of parallel region */
/* phase->map where necessary */ /* phase->map where necessary */
phase2map (job, mmax, llim, ulim); phase2map (job, mmax, llim, ulim);

View file

@ -36,10 +36,10 @@ using std::complex;
#include <experimental/simd> #include <experimental/simd>
using std::experimental::native_simd; using std::experimental::native_simd;
using std::experimental::reduce; using std::experimental::reduce;
static constexpr size_t VLEN=native_simd<double>::size();
using Tv=native_simd<double>; using Tv=native_simd<double>;
using Tm=Tv::mask_type; using Tm=Tv::mask_type;
typedef double Ts; using Ts=Tv::value_type;
static constexpr size_t VLEN=Tv::size();
#define vload(a) (a) #define vload(a) (a)
#define vzero 0. #define vzero 0.