Сокращение предложения в OpenMP, когда параллельно и для принадлежат два разных оператора - PullRequest
0 голосов
/ 10 декабря 2018

Я запутался с поведением предложения 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...