【发布时间】:2020-01-08 00:58:57
【问题描述】:
我正在尝试使用 OpenMP(4.5,通过 GCC 7.2.0)管理嵌套的并行区域,但在关闭嵌套时遇到了一些问题。
示例程序:
#include <stdio.h>
#include <omp.h>
void foobar() {
int tid = omp_get_thread_num();
#pragma omp parallel for
for (int i = 0; i < 4; i++) {
int otid = omp_get_thread_num();
printf("%d | %d\n", tid, otid);
}
}
int main(void) {
omp_set_nested(0);
#pragma omp parallel
{
foobar();
}
printf("\n");
foobar();
return 0;
}
我期望在这里发生的是对 foobar() 的并行区域和非并行调用都会吐出 4 行,这与
// parallel region foobar()
0 | 0
1 | 1
2 | 2
3 | 3
// serial region foobar()
0 | 0
0 | 1
0 | 2
0 | 3
因为我不允许嵌套并行。但是,我在具有正确 TID 的并行区域内得到了 16 行,但 OTID 始终为 0(即每个线程都生成 4 个自己的线程,并在其上执行整个循环),我在外部得到 4 行(即并行正如我所料,for 正在产生 4 个线程)
我觉得我在这里遗漏了一些非常明显的东西,有人可以为我解释一下吗?禁用嵌套是否应该将 omp parallel for 转换为常规 omp for,并相应地分配工作?
【问题讨论】:
-
而不是描述你得到的输出,edit这个问题要包括实际输出。