2014-01-21 2 views
0

У меня есть набор циклов severak for-loops, из которых один выполняется только в том случае, если выполнено определенное условие.OpenMP: условная петля внутри параллельной области

Как обеспечить, чтобы только один поток (возможно, с использованием SINGLE) выполнял оператор if, но все потоки доступны для DO.

!$omp parallel 
!$omp do 
do i=0,512 
    something to do 
end do 
!$omp end do nowait 

if (condition_var) then 
    !$omp do 
    do i=0,512 
     only do sometimes 
    end do 
    !$omp end do 
fi 
!$omp end parallel 

ответ

2

Вы не должны гарантировать, что только один поток оценивает, если состояние, до тех пор, пока условие дает одинаковый результат среди нитей в команде. Чтобы быть более явным:

!$omp parallel 
!$omp do 
do i=0,512 
    something to do 
end do 
!$omp end do 
! Synchronize here to ensure shared variables 
! will not be changed while evaluating the if condition 

if (condition_var) then 
! All threads evaluate the if condition and either enter 
! the block or skip it 
    !$omp do 
    do i=0,512 
     only do sometimes 
    end do 
    !$omp end do 
fi 
!$omp end parallel 
+0

Требуется ли синхронизация после первого цикла, если условие_var не изменяется внутри параллельной области? – John

+1

@ John No. Единственное, что вы должны убедиться в том, что либо _всеми нитями_ оцениваете условие if if, либо все оценивают его как false. – Massimiliano

Смежные вопросы