Я запутался с поведением предложения reduction
, потому что когда я компилирую
int main() {
//default(none) shared(suma)
int suma = 0;
#pragma parallel omp default(shared) num_threads(2)
{
#pragma omp for reduction(+:suma)
for (int n = 0; n<20; n++ ) {
for ( int j = 0; j < 30; j++ ) {
suma += 1;
}
}
}
printf("suma = %d\n", suma);
assert( suma == 20*30);
return 0;
}
, компилятор говорит, что я должен объявить suma
как общий, тогда как я явно указал его как общий.
reduction.cpp:28:33: error: reduction variable must be shared
#pragma omp for reduction(+:suma)
^
Что меня бесит, так это то, что когда я пишу код, который предположительно неверен (чрезмерно распараллелен), он работает
int main() {
//default(none) shared(suma)
int suma = 0;
#pragma parallel omp default(shared) num_threads(2)
{
#pragma parallel omp for reduction(+:suma)
for (int n = 0; n<20; n++ ) {
for ( int j = 0; j < 30; j++ ) {
suma += 1;
}
}
}
printf("suma = %d\n", suma);
assert( suma == 20*30);
return 0;
}
На данный момент я не знаю, прав ли япропустить что-то или если есть ошибка в компиляторе.Во всяком случае, я компилирую с clang++ -fopenmp reduction.cpp
clang version 7.0.0 (https://git.llvm.org/git/clang.git/ bb7269ae797f282e27e47eb4ebedfa6abe826e9e) (https://git.llvm.org/git/llvm.git/ 37d8f03a3676034f21f0a652359ec4ace8d0521f)
Target: x86_64-unknown-linux-gnu
Thread model: posix