gpt4 book ai didi

c++ - 在运行时设置 OMP_THREAD_LIMIT 的问题 (c++ gcc 4.4.7)

转载 作者:行者123 更新时间:2023-11-30 01:57:30 29 4
gpt4 key购买 nike

嘿嘿嘿,

我有一个相当大的程序,我正在尝试线程化。到目前为止,这是成功的,并且基础都按预期工作。

我现在想在嵌套模式下使用级联线程做一些奇特的工作。本质上,我希望主并行区域使用较低并行区域中的任何空闲线程。

详细说明当前系统,主并行区域启动了 10 个线程。我有 12 个内核,所以我可以多使用 2 个线程。还有第二个并行区域,其中进行了一些繁重的计算,我希望前两个线程达到这一点以在那里启动一个新团队,每个团队都有 2 个线程。在此之后进入较低并行区域的每个新条目都将继续串行。

因此,这应该如下所示。
主要区域:10 个线程已启动。
较低区域:2 个新线程已启动。

线程 1:下部区域有 2 个线程。
线程 2:下部区域有 2 个线程。
线程 3-10:下部区域有 1 个线程。

请记住,这些数字是为了清楚地提供我的情况的具体描述,而不是程序运行的绝对和唯一情况。

代码:

main() {
...
...
omp_set_num_threads(n);
omp_set_dynamic(x);

#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < iterations; i++) {
...
Compute();
...
}
}
}

在计算中

bool Compute() {
...
float nThreads = omp_get_thread_limit() - omp_get_num_threads();
nThreads = ceil(nThreads / omp_get_num_threads());
omp_set_num_threads((int)nThreads);
#pragma omp parallel
{
...
#pragma omp for
for (int i = 0; i < nReductSize; i++) {
...
}
}
}

现在,我的问题是设置整个程序的上限(即 OMP_THREAD_LIMIT)只能在程序外部起作用。使用

export OMP_THREAD_LIMIT=5  

来自 bash 命令行的效果很好。但我想在内部进行。到目前为止,我已经尝试过了

putenv("OMP_THREAD_LIMIT=12");
setenv("OMP_THREAD_LIMIT", "12", 1);

但是当我调用 omp_get_thread_limit() 或 getenv("OMP_THREAD_LIMIT") 时,我得到了古怪的返回值。即使我用导出设置变量,调用 getenv("OMP_THREAD_LIMIT");返回 0。
因此,我想在这方面寻求您的帮助:如何在运行时正确设置 OMP_THREAD_LIMIT?

这是我设置线程默认值的主要功能。它在任何线程发生之前执行得很好:

#ifdef _OPENMP
const char *name = "OMP_THREAD_LIMIT";
const char *value = "5";
int overwrite = 1;
int success = setenv(name, value, overwrite);
cout << "Var set (0 is success): " << success << endl;
#endif

哦,setenv 报告变量设置成功。

编译器说
gcc44 (海湾合作委员会) 4.4.7 20120313 (红帽 4.4.7-1)

旗帜
CCFLAGS = -c -O0 -fopenmp -g -msse -msse2 -msse3 -mfpmath=sse -std=c++0x

OpenMP 版本为 3.0。

最佳答案

这是 OpenMP 的正确实现,它忽略了程序内部环境的变化。如 OpenMP 3.1 标准第 159 页所述:

Modifications to the environment variables after the program has started, even if modified by the program itself, are ignored by the OpenMP implementation.

您所做的正是本段中所说的。

OpenMP 仅允许通过 omp_set_* 函数更改此类参数,但 thread-limit-var ICV 没有此类函数:

However, the settings of some of the ICVs can be modified during the execution of the OpenMP program by the use of the appropriate directive clauses or OpenMP API routines.

我想,你可以使用 #pragma omp parallelnum_threads 子句来实现你想要的。

关于c++ - 在运行时设置 OMP_THREAD_LIMIT 的问题 (c++ gcc 4.4.7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18654540/

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