clang 10 & OpenMP on range-based for error(文档说应该没问题)

Posted

技术标签:

【中文标题】clang 10 & OpenMP on range-based for error(文档说应该没问题)【英文标题】:clang 10 & OpenMP on range-based for error (docs say should be ok) 【发布时间】: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> ii0,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 【参考方案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,但采用基于范围的并行循环而不会出错。

以上是关于clang 10 & OpenMP on range-based for error(文档说应该没问题)的主要内容,如果未能解决你的问题,请参考以下文章

Mac 运行 OpenMP,“clang:错误:不支持的选项 '-fopenmp'”

铿锵声、openMP 和 CMake

使用 clang-cl 用 openmp 编译 C 代码

将 OpenMP 与 clang 一起使用

使用 clang-cl 在 Visual Studio 2019 中使用 Openmp 4/5

启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误