【问题标题】:Can't support both OpenMP v4 and v5 in GCC在 GCC 中不能同时支持 OpenMP v4 和 v5
【发布时间】: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 参数。

这是怎么回事,制作不可知代码的正确/有效方法是什么?

【问题讨论】:

    标签: c++ c openmp


    【解决方案1】:

    移植到gcc-9 的地址为here。为了保持与两个版本的 OpenMP 的兼容性,我必须:

    • 删除default (none)
    • 删除所有const

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 2020-01-23
      • 1970-01-01
      • 2021-05-08
      • 2015-01-14
      • 2013-05-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多