#c #c 17 #openmp #clang
#c #c 17 #openmp #clang
Вопрос:
Я тестирую clang 10.0 в проекте c 17 и OpenMP и получаю ошибки при #pragma omp parallel for
использовании на основе диапазона для.
Примечания к выпуску для clang 10 в разделе Поддержки OpenMP в разделе Clang достаточно четко указано:
- Добавлена поддержка циклов на основе диапазона.
Когда я компилирую MWE с clang -10 -fopenmp -std=c 17
помощью (см. 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(intamp; i: ii){
std::cerr<<i<<std::endl;
}
}
Я получаю:
<source>:6:5: error: statement after '#pragma omp parallel for' must be a for loop
for(intamp; i: ii){
^
1 error generated.
Compiler returned: 1
Что случилось?
Комментарии:
1. Похоже, что вы не используете OpenMP 5.0 (даже если вы используете версию clang, которая поддерживает ее новые функции). Вы пробовали явно выбрать OpenMP 5.0 (где была добавлена поддержка циклов for на основе диапазона) ?
clang -10 -fopenmp -fopenmp-version=50 -std=c 17
.2. @dfri Да, это работает: godbolt.org/z/Erax36
Ответ №1:
Поддержка циклов for на основе диапазона была добавлена в OpenMP 5.0, и, как также описано в примечаниях к выпуску Clang 10, на которые вы ссылаетесь, вам необходимо явно использовать эту -fopenmp-version=50
опцию, чтобы активировать ее поддержку:
Поддержка OpenMP в Clang
Используйте
-fopenmp-version=50
опцию, чтобы активировать поддержку OpenMP 5.0.
Таким образом, если мы расширим вашу команду компиляции до clang -10 -fopenmp -fopenmp-version=50 -std=c 17
, прагма OMP принимает цикл for на основе диапазона, который следует за ним.
Комментарии:
1. Большое спасибо. Я привык к gcc, который не требует спецификации версии OpenMP. AFAIK он формально поддерживает OpenMP 4.5, но принимает параллельный цикл на основе диапазона без ошибок.