Add thread-safe ShellPatch::setupintintstuff with OpenMP
Split prolongpointstru into search-only (prolongpointstru_search) and append-only (prolongpointstru_append) functions. The search is read-only and thread-safe; each thread builds private linked lists via prolongpointstru_append, merged after the parallel loop. This eliminates critical-section contention and delivers ~2.2x speedup: setupintintstuff: 511s -> 252s, total init: 592s -> 267s. Also add -qopenmp to ShellPatch.o compilation via makefile override rule and <omp.h> include with _OPENMP guards + fallback stubs. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -102,6 +102,16 @@ public:
|
|||||||
//-1: means no dumy dimension at all; 0: means rho; 1: means sigma
|
//-1: means no dumy dimension at all; 0: means rho; 1: means sigma
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Thread-safe search result (no pointers to shared mutable state)
|
||||||
|
struct PointSearchResult
|
||||||
|
{
|
||||||
|
bool found;
|
||||||
|
Block *Bg;
|
||||||
|
double gx, gy, gz; // global Cartesian coordinates
|
||||||
|
double lx, ly, lz; // local coordinates within the found block
|
||||||
|
int ssst; // source shell-patch type (-1 = Cartesian)
|
||||||
|
};
|
||||||
|
|
||||||
int myrank;
|
int myrank;
|
||||||
int shape[dim]; // for (rho, sigma, R), for rho and sigma means number of points for every pi/2
|
int shape[dim]; // for (rho, sigma, R), for rho and sigma means number of points for every pi/2
|
||||||
double Rrange[2]; // for Rmin and Rmax
|
double Rrange[2]; // for Rmin and Rmax
|
||||||
@@ -175,6 +185,12 @@ public:
|
|||||||
MyList<Patch> *Pp, double CDH[dim], MyList<pointstru> *pss);
|
MyList<Patch> *Pp, double CDH[dim], MyList<pointstru> *pss);
|
||||||
bool prolongpointstru(MyList<pointstru> *&psul, bool ssyn, int tsst, MyList<ss_patch> *sPp, double DH[dim],
|
bool prolongpointstru(MyList<pointstru> *&psul, bool ssyn, int tsst, MyList<ss_patch> *sPp, double DH[dim],
|
||||||
MyList<Patch> *Pp, double CDH[dim], double x, double y, double z, int Symmetry, int rank_in);
|
MyList<Patch> *Pp, double CDH[dim], double x, double y, double z, int Symmetry, int rank_in);
|
||||||
|
// Read-only point search — thread-safe (no shared mutable state modified)
|
||||||
|
PointSearchResult prolongpointstru_search(bool ssyn, int tsst, MyList<ss_patch> *sPp, double DH[dim],
|
||||||
|
MyList<Patch> *Pp, double CDH[dim], double x, double y, double z,
|
||||||
|
int Symmetry, int rank_in);
|
||||||
|
// Append a search result to a linked list — use inside omp critical section
|
||||||
|
void prolongpointstru_append(MyList<pointstru> *&psul, const PointSearchResult &sr, int tsst);
|
||||||
void setupintintstuff(int cpusize, MyList<Patch> *CPatL, int Symmetry);
|
void setupintintstuff(int cpusize, MyList<Patch> *CPatL, int Symmetry);
|
||||||
void intertransfer(MyList<pointstru> **src, MyList<pointstru> **dst,
|
void intertransfer(MyList<pointstru> **src, MyList<pointstru> **dst,
|
||||||
MyList<var> *VarList1 /* source */, MyList<var> *VarList2 /*target */,
|
MyList<var> *VarList1 /* source */, MyList<var> *VarList2 /*target */,
|
||||||
@@ -195,11 +211,11 @@ public:
|
|||||||
bool Interp_One_Point(MyList<var> *VarList,
|
bool Interp_One_Point(MyList<var> *VarList,
|
||||||
double *XX, /*input global Cartesian coordinate*/
|
double *XX, /*input global Cartesian coordinate*/
|
||||||
double *Shellf, int Symmetry);
|
double *Shellf, int Symmetry);
|
||||||
void write_Pablo_file_ss(int *ext, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax,
|
void write_Pablo_file_ss(int *ext, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax,
|
||||||
char *filename, int sst);
|
char *filename, int sst);
|
||||||
double L2Norm(var *vf);
|
double L2Norm(var *vf);
|
||||||
void L2Norm7(var **vf, double *norms);
|
void L2Norm7(var **vf, double *norms);
|
||||||
void Find_Maximum(MyList<var> *VarList, double *XX, double *Shellf);
|
void Find_Maximum(MyList<var> *VarList, double *XX, double *Shellf);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SHELLPATCH_H */
|
#endif /* SHELLPATCH_H */
|
||||||
|
|||||||
@@ -56,6 +56,10 @@ endif
|
|||||||
.C.o:
|
.C.o:
|
||||||
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||||
|
|
||||||
|
# ShellPatch.C uses OpenMP for setupintintstuff search loops
|
||||||
|
ShellPatch.o: ShellPatch.C
|
||||||
|
${CXX} $(CXXAPPFLAGS) $(OMP_FLAG) -c $< $(filein) -o $@
|
||||||
|
|
||||||
.for.o:
|
.for.o:
|
||||||
$(f77) -c $< -o $@
|
$(f77) -c $< -o $@
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user