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'”
使用 clang-cl 在 Visual Studio 2019 中使用 Openmp 4/5
启用 openmp 时出错 - “ld: library not found for -lgomp”和 Clang 错误