2014-01-21 76 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

你不必以保證只有一個線程計算if條件,只要條件給出了球隊的線程之間相同的結果。更明確地說:

!$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

如果condition_var在並行區域內沒有改變,是否需要第一個循環後進行同步? – John

+1

@John不可以。你必須確保的唯一一件事情是,要麼所有的threads_評估if條件爲真或者全部評估爲false。 – Massimiliano