【发布时间】:2020-07-21 14:21:16
【问题描述】:
我在尝试使我的 C/C++ 项目同时支持 gcc-8(使用 OpenMP 4.5)和 gcc-9(使用 OpenMP 5.0)时遇到了一个不寻常的问题。它是由定义为const 的变量引起的,这些变量将在线程之间共享。
例如,这里有一些代码与 OpenMP 5 兼容,但在 OpenMP 4.5 中失败(错误为 'x' is predetermined 'shared' for 'shared'):
const x = 10;
int i;
# pragma omp parallel \
default (none) \
shared (x) \
private (i)
{
# pragma omp for schedule (static)
for (i=0; i<x; i++)
// etc
}
以上结果也与clang-10 兼容,但与clang-3.7 不兼容。
这是与 OpenMP 4.5 兼容的相同代码(仅排除 shared 中的 x),但在 OpenMP 5 中失败(出现错误 error: 'numTasks' not specified in enclosing 'parallel'):
const x = 10;
int i;
# pragma omp parallel \
default (none) \
private (i)
{
# pragma omp for schedule (static)
for (i=0; i<x; i++)
// etc
}
OpenMP 5 似乎不再智能地假定const 变量是共享的。唯一可以同时编译的代码是将x 放入firstprivate:
const x = 10;
int i;
# pragma omp parallel \
default (none) \
firstprivate (x) \
private (i)
{
# pragma omp for schedule (static)
for (i=0; i<x; i++)
// etc
}
这似乎是一个糟糕的解决方案,因为现在我付钱将x 复制到每个线程中,而它永远不会被修改!另请注意,我不能将x 设为非const,因为它实际上是调用函数的const 参数。
这是怎么回事,制作不可知代码的正确/有效方法是什么?
【问题讨论】: