diff --git a/src/OPENMP/thr_omp.h b/src/OPENMP/thr_omp.h index 9528dc3dd2..4a2d044f46 100644 --- a/src/OPENMP/thr_omp.h +++ b/src/OPENMP/thr_omp.h @@ -50,142 +50,138 @@ class ThrOMP { double memory_usage_thr(); - inline void sync_threads() - { + inline void sync_threads(){ #if defined(_OPENMP) #pragma omp barrier #endif - { - ; - } - }; + {; +} +}; // namespace LAMMPS_NS - enum { - THR_NONE = 0, - THR_PAIR = 1, - THR_BOND = 1 << 1, - THR_ANGLE = 1 << 2, - THR_DIHEDRAL = 1 << 3, - THR_IMPROPER = 1 << 4, - THR_KSPACE = 1 << 5, - THR_CHARMM = 1 << 6, /*THR_PROXY=1<<7,THR_HYBRID=1<<8, */ - THR_FIX = 1 << 9, - THR_INTGR = 1 << 10 - }; - - protected: - // extra ev_tally setup work for threaded styles - void ev_setup_thr(int, int, int, double *, double **, double **, ThrData *); - - // compute global per thread virial contribution from per-thread force - void virial_fdotr_compute_thr(double *const, const double *const *const, - const double *const *const, const int, const int, const int); - - // reduce per thread data as needed - void reduce_thr(void *const style, const int eflag, const int vflag, ThrData *const thr); - - // thread safe variant error abort support. - // signals an error condition in any thread by making - // thr_error > 0, if condition "cond" is true. - // will abort from thread 0 if thr_error is > 0 - // otherwise return true. - // returns false if no error found on any thread. - // use return value to jump/return to end of threaded region. - - bool check_error_thr(const bool cond, const int tid, const char *fname, const int line, - const char *errmsg) - { - if (cond) { -#if defined(_OPENMP) -#pragma omp atomic - ++thr_error; -#endif - if (tid > 0) - return true; - else - lmp->error->one(fname, line, errmsg); - } else { - if (thr_error > 0) { - if (tid == 0) - lmp->error->one(fname, line, errmsg); - else - return true; - } else - return false; - } - return false; - }; - - protected: - // threading adapted versions of the ev_tally infrastructure - // style specific versions (need access to style class flags) - - // Pair - void e_tally_thr(Pair *const, const int, const int, const int, const int, const double, - const double, ThrData *const); - void v_tally_thr(Pair *const, const int, const int, const int, const int, const double *const, - ThrData *const); - - void ev_tally_thr(Pair *const, const int, const int, const int, const int, const double, - const double, const double, const double, const double, const double, - ThrData *const); - void ev_tally_full_thr(Pair *const, const int, const double, const double, const double, - const double, const double, const double, ThrData *const); - void ev_tally_xyz_thr(Pair *const, const int, const int, const int, const int, const double, - const double, const double, const double, const double, const double, - const double, const double, ThrData *const); - void ev_tally_xyz_full_thr(Pair *const, const int, const double, const double, const double, - const double, const double, const double, const double, const double, - ThrData *const); - void v_tally2_thr(Pair *const, const int, const int, const double, const double *const, - ThrData *const); - void v_tally2_newton_thr(Pair *const, const int, const double *const, const double *const, - ThrData *const); - void ev_tally3_thr(Pair *const, const int, const int, const int, const double, const double, - const double *const, const double *const, const double *const, - const double *const, ThrData *const); - void v_tally3_thr(Pair *const, const int, const int, const int, const double *const, - const double *const, const double *const, const double *const, ThrData *const); - void ev_tally4_thr(Pair *const, const int, const int, const int, const int, const double, - const double *const, const double *const, const double *const, - const double *const, const double *const, const double *const, ThrData *const); - void v_tally4_thr(Pair *const, const int, const int, const int, const int, const double *const, - const double *const, const double *const, const double *const, - const double *const, const double *const, ThrData *const); - - // Bond - void ev_tally_thr(Bond *const, const int, const int, const int, const int, const double, - const double, const double, const double, const double, ThrData *const); - - // Angle - void ev_tally_thr(Angle *const, const int, const int, const int, const int, const int, - const double, const double *const, const double *const, const double, - const double, const double, const double, const double, const double, - ThrData *const thr); - void ev_tally13_thr(Angle *const, const int, const int, const int, const int, const double, - const double, const double, const double, const double, ThrData *const thr); - - // Dihedral - void ev_tally_thr(Dihedral *const, const int, const int, const int, const int, const int, - const int, const double, const double *const, const double *const, - const double *const, const double, const double, const double, const double, - const double, const double, const double, const double, const double, - ThrData *const); - - // Improper - void ev_tally_thr(Improper *const, const int, const int, const int, const int, const int, - const int, const double, const double *const, const double *const, - const double *const, const double, const double, const double, const double, - const double, const double, const double, const double, const double, - ThrData *const); - - // style independent versions - void ev_tally_list_thr(Pair *const, const int, const int *const, const double *const, - const double, const double, ThrData *const); +enum { + THR_NONE = 0, + THR_PAIR = 1, + THR_BOND = 1 << 1, + THR_ANGLE = 1 << 2, + THR_DIHEDRAL = 1 << 3, + THR_IMPROPER = 1 << 4, + THR_KSPACE = 1 << 5, + THR_CHARMM = 1 << 6, /*THR_PROXY=1<<7,THR_HYBRID=1<<8, */ + THR_FIX = 1 << 9, + THR_INTGR = 1 << 10 }; +protected: +// extra ev_tally setup work for threaded styles +void ev_setup_thr(int, int, int, double *, double **, double **, ThrData *); + +// compute global per thread virial contribution from per-thread force +void virial_fdotr_compute_thr(double *const, const double *const *const, const double *const *const, + const int, const int, const int); + +// reduce per thread data as needed +void reduce_thr(void *const style, const int eflag, const int vflag, ThrData *const thr); + +// thread safe variant error abort support. +// signals an error condition in any thread by making +// thr_error > 0, if condition "cond" is true. +// will abort from thread 0 if thr_error is > 0 +// otherwise return true. +// returns false if no error found on any thread. +// use return value to jump/return to end of threaded region. + +bool check_error_thr(const bool cond, const int tid, const char *fname, const int line, + const char *errmsg) +{ + if (cond) { +#if defined(_OPENMP) +#pragma omp atomic + ++thr_error; +#endif + if (tid > 0) + return true; + else + lmp->error->one(fname, line, errmsg); + } else { + if (thr_error > 0) { + if (tid == 0) + lmp->error->one(fname, line, errmsg); + else + return true; + } else + return false; + } + return false; +}; + +protected: +// threading adapted versions of the ev_tally infrastructure +// style specific versions (need access to style class flags) + +// Pair +void e_tally_thr(Pair *const, const int, const int, const int, const int, const double, + const double, ThrData *const); +void v_tally_thr(Pair *const, const int, const int, const int, const int, const double *const, + ThrData *const); + +void ev_tally_thr(Pair *const, const int, const int, const int, const int, const double, + const double, const double, const double, const double, const double, + ThrData *const); +void ev_tally_full_thr(Pair *const, const int, const double, const double, const double, + const double, const double, const double, ThrData *const); +void ev_tally_xyz_thr(Pair *const, const int, const int, const int, const int, const double, + const double, const double, const double, const double, const double, + const double, const double, ThrData *const); +void ev_tally_xyz_full_thr(Pair *const, const int, const double, const double, const double, + const double, const double, const double, const double, const double, + ThrData *const); +void v_tally2_thr(Pair *const, const int, const int, const double, const double *const, + ThrData *const); +void v_tally2_newton_thr(Pair *const, const int, const double *const, const double *const, + ThrData *const); +void ev_tally3_thr(Pair *const, const int, const int, const int, const double, const double, + const double *const, const double *const, const double *const, + const double *const, ThrData *const); +void v_tally3_thr(Pair *const, const int, const int, const int, const double *const, + const double *const, const double *const, const double *const, ThrData *const); +void ev_tally4_thr(Pair *const, const int, const int, const int, const int, const double, + const double *const, const double *const, const double *const, + const double *const, const double *const, const double *const, ThrData *const); +void v_tally4_thr(Pair *const, const int, const int, const int, const int, const double *const, + const double *const, const double *const, const double *const, + const double *const, const double *const, ThrData *const); + +// Bond +void ev_tally_thr(Bond *const, const int, const int, const int, const int, const double, + const double, const double, const double, const double, ThrData *const); + +// Angle +void ev_tally_thr(Angle *const, const int, const int, const int, const int, const int, const double, + const double *const, const double *const, const double, const double, + const double, const double, const double, const double, ThrData *const thr); +void ev_tally13_thr(Angle *const, const int, const int, const int, const int, const double, + const double, const double, const double, const double, ThrData *const thr); + +// Dihedral +void ev_tally_thr(Dihedral *const, const int, const int, const int, const int, const int, const int, + const double, const double *const, const double *const, const double *const, + const double, const double, const double, const double, const double, + const double, const double, const double, const double, ThrData *const); + +// Improper +void ev_tally_thr(Improper *const, const int, const int, const int, const int, const int, const int, + const double, const double *const, const double *const, const double *const, + const double, const double, const double, const double, const double, + const double, const double, const double, const double, ThrData *const); + +// style independent versions +void ev_tally_list_thr(Pair *const, const int, const int *const, const double *const, const double, + const double, ThrData *const); +} +; + // set loop range thread id, and force array offset for threaded runs. -static inline void loop_setup_thr(int &ifrom, int &ito, int &tid, int inum, int nthreads) +inline void loop_setup_thr(int &ifrom, int &ito, int &tid, int inum, int nthreads) { #if defined(_OPENMP) tid = omp_get_thread_num(); @@ -204,22 +200,21 @@ static inline void loop_setup_thr(int &ifrom, int &ito, int &tid, int inum, int // helpful definitions to help compilers optimizing code better -typedef struct { +using dbl3_t = struct _dbl3_t { double x, y, z; -} dbl3_t; -typedef struct { +}; +using dbl4_t = struct _dbl4_t { double x, y, z, w; -} dbl4_t; -typedef struct { +}; +using int3_t = struct _int3_t { int a, b, t; -} int3_t; -typedef struct { +}; +using int4_t = struct _int4_t { int a, b, c, t; -} int4_t; -typedef struct { +}; +using int5_t = struct _int5_t { int a, b, c, d, t; -} int5_t; - +}; } // namespace LAMMPS_NS #endif