2013-12-12 92 views
0

內並行的內部「做循環」我有一個代碼,在僞是某事像這樣:一個「do while循環」使用OpenMP

Do while loop 
    if condition 
    call subroutinex(In) 
    else 
    do i=2,max 
     ln=i 
     call subroutinex(ln) 
    end do 
    endif 
    other serial work 
end do 

我已經設法成功地並行內環像

Do while loop 
    if condition 
    call subroutinex(In) 
    else 
!$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables) 
!$OMP DO 
    do i=2,max 
     ln=i 
     call subroutinex(ln) 
    end do 
!$OMP END DO 
!$OMP END PARALLEL 
    endif 
    other serial work 
end do 

此代碼適用於我生產正確的結果,並且運行在優化的自動並行化NO-OMP版本(最大= 5)的大約一半時間。我懷疑(雖然不太確定)在「Do while循環」內產生並行區域可能會導致一些不必要的開銷,我可以避免使用不同的方法(產生外部循環之外的並行區域並使用!$ OMP CRITICAL或!$ OMP MASTER)。我似乎無法理解如何正確的語法是這樣的。任何建議都非常受歡迎。

最好的問候, 阿波斯托

回答

0

我覺得你的僞代碼的這種修改應該工作

!$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables) 
Do while loop 
    if condition 
    !$OMP SINGLE 
    call subroutinex(In) 
    !$OMP END SINGLE 
    else 
!$OMP DO 
    do i=2,max 
     ln=i 
     call subroutinex(ln) 
    end do 
!$OMP END DO 
    endif 
    !$OMP SINGLE 
    other serial work 
    !$OMP END SINGLE 
end do 
!$OMP END PARALLEL 

你需要仔細檢查的變量可訪問性。

這可能不會顯着提高速度。進入並行區域的開銷通常不包括啓動一組線程的時間,而是激活在程序初始化時建立的團隊。但是,請報告並讓我知道這(a)是否有效,(b)是否提高了執行速度。

0

或者,您可以探索OpenMP任務,例如,

!$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables) 
!$OMP SINGLE 
Do while loop 
    if condition 
    call subroutinex(In) 
    else 
    do i=2,max 
     ln=i 
!$OMP TASK firstprivate(ln) 
     call subroutinex(ln) 
!$OMP END TASK 
    end do 
!$OMP TASKWAIT 
    endif 
    other serial work 
end do 
!$OMP END SINGLE nowait 
!$OMP END PARALLEL