【问题标题】:clang 10 & OpenMP on range-based for error (docs say should be ok)clang 10 & OpenMP on range-based for error(文档说应该没问题)
【发布时间】:2020-10-07 08:07:54
【问题描述】:

我正在一个 c++17 和 OpenMP 项目上测试 clang 10.0,当 #pragma omp parallel for 用于基于范围的 for 时出现错误。

clang 10 的发行说明,在OpenMP Support in Clang 部分,说得很清楚:

  • 增加了对基于范围的循环的支持。

当我使用 clang++-10 -fopenmp -std=c++17 编译 MWE 时(在线编译器见 https://godbolt.org/z/fdTeMo):

#include<vector>
#include<iostream>
int main(int argc, char** argv){
    std::vector<int> ii{0,11,22,33,44,55,66};
    #pragma omp parallel for
    for(int& i: ii){
        std::cerr<<i<<std::endl;
    }
}

我明白了:

<source>:6:5: error: statement after '#pragma omp parallel for' must be a for loop

    for(int& i: ii){

    ^

1 error generated.

Compiler returned: 1

怎么了?

【问题讨论】:

  • 看起来好像您没有使用 OpenMP 5.0(即使您使用的是支持其新功能的 clang 版本)。您是否尝试过明确选择 OpenMP 5.0(添加了对基于范围的 for 循环的支持)? clang++-10 -fopenmp -fopenmp-version=50 -std=c++17.
  • @dfri 是的,可行:godbolt.org/z/Erax36

标签: c++ c++17 openmp clang++


【解决方案1】:

OpenMP 5.0 添加了对基于范围的 for 循环的支持,并且正如您链接到的 Clang 10 Release Notes 中所述,您需要显式使用 -fopenmp-version=50 选项来激活对它的支持:

Clang 中的 OpenMP 支持

使用 -fopenmp-version=50 选项激活对 OpenMP 5.0 的支持。

因此,如果我们将编译命令扩展为 clang++-10 -fopenmp -fopenmp-version=50 -std=c++17,OMP 杂注将接受其后基于范围的 for 循环。

DEMO.

【讨论】:

  • 非常感谢。我习惯了不需要 OpenMP 版本规范的 gcc。 AFAIK 它正式支持 OpenMP 4.5,但采用基于范围的并行循环而不会出错。
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2015-07-21
  • 2018-10-14
  • 1970-01-01
  • 2020-06-12
  • 2022-12-02
相关资源
最近更新 更多