diff --git a/CHANGES/v2.4.md b/CHANGES/v2.4.md index 3b490f48c356ee46992c6d96982ce1ec747e36bd..4c364dd08104bce986ef864108c915c5bbe852ee 100644 --- a/CHANGES/v2.4.md +++ b/CHANGES/v2.4.md @@ -203,6 +203,9 @@ For users: ## Version 2.4.4 (to be released) +For users: + - Fix some performances regression issue with OpenMP + For developers: - Small fix in LDFLAGS when enabling coverage. diff --git a/src/tools/OpenMP.cpp b/src/tools/OpenMP.cpp index 52e6c8ce3ca344af55a570efbee044808c4eb9eb..9d61de34504f9f57d4ad3b72db6bad38aeb10b2a 100644 --- a/src/tools/OpenMP.cpp +++ b/src/tools/OpenMP.cpp @@ -29,16 +29,37 @@ namespace PLMD { + +struct OpenMPVars { + unsigned cacheline_size=512; + bool cache_set=false; + unsigned num_threads=1; + bool nt_env_set=false; +}; + +static OpenMPVars & getOpenMPVars() { + static OpenMPVars vars; + return vars; +} + +void OpenMP::setNumThreads(const unsigned nt) { + getOpenMPVars().num_threads=nt; +} + unsigned OpenMP::getCachelineSize() { - static unsigned cachelineSize=512; - if(std::getenv("PLUMED_CACHELINE_SIZE")) Tools::convert(std::getenv("PLUMED_CACHELINE_SIZE"),cachelineSize); - return cachelineSize; + if(!getOpenMPVars().cache_set) { + if(std::getenv("PLUMED_CACHELINE_SIZE")) Tools::convert(std::getenv("PLUMED_CACHELINE_SIZE"),getOpenMPVars().cacheline_size); + getOpenMPVars().cache_set = true; + } + return getOpenMPVars().cacheline_size; } unsigned OpenMP::getNumThreads() { - static unsigned numThreads=1; - if(std::getenv("PLUMED_NUM_THREADS")) Tools::convert(std::getenv("PLUMED_NUM_THREADS"),numThreads); - return numThreads; + if(!getOpenMPVars().nt_env_set) { + if(std::getenv("PLUMED_NUM_THREADS")) Tools::convert(std::getenv("PLUMED_NUM_THREADS"),getOpenMPVars().num_threads); + getOpenMPVars().nt_env_set = true; + } + return getOpenMPVars().num_threads; } unsigned OpenMP::getThreadNum() { diff --git a/src/tools/OpenMP.h b/src/tools/OpenMP.h index 702f8d38f9199e64bb63ee8301d95fb69e404801..c36d13873314f474c948e1c75833a0505c88ce82 100644 --- a/src/tools/OpenMP.h +++ b/src/tools/OpenMP.h @@ -30,6 +30,9 @@ class OpenMP { public: +/// Set number of threads that can be used by openMP + static void setNumThreads(const unsigned nt); + /// Get number of threads that can be used by openMP static unsigned getNumThreads();