gpt4 book ai didi

c++ - 从代码中覆盖 OMP_NUM_THREADS - 真实

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:50 26 4
gpt4 key购买 nike

到目前为止我能找到的所有答案都建议调用 omp_set_num_threads。虽然在大多数情况下这是一个正确的答案,但它对我不起作用。在内部,调用 omp_set_num_threads 会导致创建每线程 ICV(或修改,如果当前线程已经有一个),并且线程数存储在那里。这意味着如果有一个不同的线程启动了一个并行区域,它将看不到我们的新值。所以调用 omp_set_num_threads != 设置 OMP_NUM_THREADS 环境变量。

有没有办法改变全局 ICV?

旁注 - 我为什么要这样做:我正在使用一个库为我生成一个工作线程,所以我并不能真正控制它的生命周期。

最简单的重现示例:

导出 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

最佳答案

您尝试实现的问题超出了 OpenMP 的规范。 OpenMP 假定它是应用程序进程中唯一的编程模型,因此它确实知道当您创建一个也执行 OpenMP 代码的新线程时会发生什么。

具体来说,对于您的问题:ICV num-threads 是线程私有(private)的 ICV,这意味着调用 omp_set_num_threads() 只会影响存储的 ICV在调用 omp_set_num_threads() 的线程中。

因此,新的 std::thread 将收到一个从环境变量初始化的新拷贝。您将无法从生成新线程的主线程更改它。

关于c++ - 从代码中覆盖 OMP_NUM_THREADS - 真实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56361293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com