Все ответы, которые я смог найти до сих пор, предлагают позвонить omp_set_num_threads
.Хотя это правильный ответ для большинства случаев, он не работает для меня.Внутренне, вызов omp_set_num_threads
вызывает создание ICV для каждого потока (или модификацию, если текущий поток уже имеет один), и количество потоков сохраняется там.Это означает, что если есть другой поток, который запускает параллельную область, он не увидит наше новое значение.Так что вызов omp_set_num_threads! = Установка переменной env OMP_NUM_THREADS.
Есть ли способ изменить глобальный ICV?
Примечание: зачем мне это делать: я работаю с библиотекойрабочий поток для меня, поэтому я не контролирую его жизненный цикл.
Простейший пример для воспроизведения:
export OMP_NUM_THREADS=3
#include <omp.h>
#include <iostream>
#include <thread>
void job() {
#pragma omp parallel
{
if (omp_get_thread_num() == 0) {
std::cout << "Num threads:" << omp_get_num_threads() << std::endl;
}
};
}
int main () {
omp_set_num_threads(2);
#pragma omp parallel
{
if (omp_get_thread_num() == 0) {
std::cout << "Num threads:" << omp_get_num_threads() << std::endl;
}
};
std::thread t(job);
t.join();
}
Это производит
Num threads:2
Num threads:3