【发布时间】:2019-05-29 13:00:13
【问题描述】:
到目前为止我能找到的所有答案都建议致电omp_set_num_threads。虽然对于大多数情况来说这是一个正确的答案,但它对我不起作用。在内部,调用omp_set_num_threads 会导致创建每线程ICV(或修改,如果当前线程已经有一个),并且线程数存储在那里。这意味着如果有一个不同的线程启动一个并行区域,它将看不到我们的新值。所以调用 omp_set_num_threads != 设置 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
【问题讨论】:
标签: c++ multithreading openmp