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();