2016-05-31 3 views
0

У меня есть следующий код, который обновляет что-то внутри цикла for, а другой - для цикла, следующего за ним. Тем не менее, я получил ошибку: «ожидается объявление» в начале второго цикла. Проблема, кажется, в «критической» части, потому что, если я ее удалю, ошибка исчезнет. Я новичок в openMP, и здесь я приведу пример: http://www.viva64.com/en/a/0054/#ID0EBUEM (см. «5. Слишком много записей в критические разделы»). Кто-нибудь знает, что я здесь делаю неправильно?критический раздел openmp внутри цикла

Кроме того, верно ли, что «если сравнение выполняется до критической секции, критическая секция не будет введена во время всех итераций цикла»?

Другое дело, что я на самом деле хочу параллельно распараллеливать две петли, но поскольку операции внутри циклов различны, я использую здесь две команды потоков, надеясь, что если есть потоки, которые не нужны в первый цикл, они могут сразу начать выполнение второго цикла. Будет ли это работать?

double maxValue = 0.0; 
#pragma omp parallel for schedule (dynamic) //first loop 
    for (int i = 0; i < n; i++){ 
     if (some condition satisfied) 
     { 
      #pragma omp atomic 
      count++; 
      continue; 
     } 

     double tmp = getValue(i); 

     #pragma omp flush(maxValue) 
     if (tmp > maxValue){ 
      #pragma omp critical(updateMaxValue){ 
      if (tmp > maxValue){ 
       maxValue = tmp; 
       //update some other variables 
        ... 
      } 
      } 
     } 
    } 
#pragma omp parallel for schedule (dynamic) //second loop 
    for (int i = 0; i < m; i++){ 
     //some operations... 
    } 
#pragma omp barrier 

Извините, что у меня так много вопросов и спасибо заранее!

+0

У вас есть ошибка синтаксиса, положить, что '{ 'в новой строке (тот, который приходит после 'критического (updateMaxValue)'), или удаляет брекеты вообще –

+1

Спасибо, это работает! Я не знал, что openmp работает таким образом ... – pumpkinjuice

ответ

0

However, I got the error: "expected a declaration" at the beginning of the second loop.

У вас есть ошибка синтаксиса - открывающую скобку, если таковые имеются, должны быть перемещены на новую строку:

#pragma omp critical(updateMaxValue){ 
//         ~^~ 

должен быть изменен на:

#pragma omp critical(updateMaxValue) 
{ 

(Вы надеваете На самом деле это не нужно, так как последующий if-оператор представляет собой структурированный блок ).


Another thing is that I actually want to parallelize the two loops at the same time, but since the operations inside the loops are different, I use two thread teams here, hoping that if there are threads that are not needed in the first loop, they can start executing the second loop immediately.

Использование одной параллельной области, а затем пункт на первом для цикла nowait:

#pragma omp parallel 
{ 
    #pragma omp for schedule(dynamic) nowait 
    //        ~~~~~^ 
    for (int i = 0; i < n; i++) 
    { 
     // ... 
    } 

    #pragma omp for schedule(dynamic) 
    for (int i = 0; i < m; i++) 
    { 
     // ... 
    } 
}