clang 10 & OpenMP on range-based for error(文档说应该没问题)
clang 10 & OpenMP on range-based for error (docs say should be ok)
我正在 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 中添加了对 range-based for 循环的支持,并且,正如您 link 的 Clang 10 Release Notes 中所述,您需要明确使用 -fopenmp-version=50
激活支持的选项:
OpenMP Support in Clang
Use -fopenmp-version=50
option to activate support for OpenMP 5.0.
因此,如果我们将您的编译命令扩展为 clang++-10 -fopenmp -fopenmp-version=50 -std=c++17
,OMP pragma 接受其后的基于范围的 for 循环。
DEMO.
我正在 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 中添加了对 range-based for 循环的支持,并且,正如您 link 的 Clang 10 Release Notes 中所述,您需要明确使用 -fopenmp-version=50
激活支持的选项:
OpenMP Support in Clang
Use
-fopenmp-version=50
option to activate support for OpenMP 5.0.
因此,如果我们将您的编译命令扩展为 clang++-10 -fopenmp -fopenmp-version=50 -std=c++17
,OMP pragma 接受其后的基于范围的 for 循环。
DEMO.