14 typedef int (Getter)(void);
15 typedef void (Setter)(int);
17 Getter* getOpenBlasThreads = NULL;
18 Setter* setOpenBlasThreads = NULL;
19 Getter* getMklThreads = NULL;
20 Setter* setMklThreads = NULL;
28 getOpenBlasThreads = loadSymbol<Getter>(
"libopenblas",
"goto_get_num_procs");
34 setOpenBlasThreads = loadSymbol<Setter>(
"libopenblas",
"openblas_set_num_threads");
35 }
catch (LibraryException
const&) {
53 getMklThreads = loadSymbol<Getter>(
"libiomp5",
"omp_get_max_threads");
54 setMklThreads = loadSymbol<Setter>(
"libiomp5",
"omp_set_num_threads");
55 }
catch (LibraryException
const&) {
61 bool disableImplicitThreadingImpl(
68 for (
auto&& ss : envvars) {
73 unsigned int numThreads = getter();
74 if (numThreads <= 1) {
78 std::cerr <<
"WARNING: You are using " <<
package << " with multiple threads (" << numThreads <<
79 "), but have not\n" <<
80 "specified the number of threads using one of the " << package <<
81 " environment variables:\n";
87 for (
auto iter = envvars.begin() + 1;
iter != envvars.end(); ++
iter) {
92 "This may indicate that you are unintentionally using multiple threads, which may\n"
93 "cause problems. WE HAVE THEREFORE DISABLED " <<
package << " THREADING. If you know\n" <<
94 "what you are doing and want threads enabled implicitly, set the environment\n" <<
95 "variable " << allowEnvvar << ".\n";
113 setOpenBlasThreads(numThreads);
116 setMklThreads(numThreads);
122 unsigned int numThreads = 0;
124 numThreads =
std::max(numThreads,
static_cast<unsigned int>(getOpenBlasThreads()));
127 numThreads =
std::max(numThreads,
static_cast<unsigned int>(getMklThreads()));
138 bool intervened =
false;
140 intervened |= disableImplicitThreadingImpl(
142 {
"OPENBLAS_NUM_THREADS",
"GOTO_NUM_THREADS",
"OMP_NUM_THREADS"},
148 intervened |= disableImplicitThreadingImpl(
150 {
"MKL_NUM_THREADS",
"MKL_DOMAIN_NUM_THREADS",
"OMP_NUM_THREADS"},