2016-08-18 63 views
1

this answer,我竟然有三個循環更復雜的代碼:是否有可能「交叉崩潰」並行迴路?

!$omp parallel 
!$omp do 
do i=1,4 ! can be parallelized 
    ... 
    do k=1,1000 !to be executed sequentially 
    ... 
    do j=1,4 ! can be parallelized 
    call job(i,j) 

的外環快速完成,除了i=4。所以我想在最裏面的循環中啓動線程,但是在每個循環內依次保留k -loop。實際上,k在隨機數發生器的變化狀態上循環,所以這不能被並行化。

我怎樣才能摺疊ij循環?我懷疑ordered子句在這裏很有用,但我擔心它會再次影響內部循環,但仍然不確定語法。

回答

1

我無法想象如何工作。無論如何,collapse語法絕對不支持。

如果您有負載平衡問題,請考慮使用動態調度,OpenMP任務或嵌套並行重新排序循環。沒有足夠的代碼來說明哪些可能適用於此。

+0

也許未來的OpenMP版本?從技術上講,應該可以在最內層循環中創建新線程,而外層空閒線程釋放CPU容量。 –

+0

是的,這是可能的,使用嵌套並行。 –

+0

或者只是並行化內部循環。我只關心它可能不夠有效,要麼只是從1到4的'j'循環是可並行化的,並且它運行得太頻繁。 (但是嵌套並行也是如此,如果不是更多。) –

1

如果1,4是您在外部循環中使用的真實值,那麼我建議只並行化內部循環(可以並行化),因爲這樣不會有太多開銷。

另一個建議是交換ki循環,如果有可能,所以外環將環路ki兩個新內環和j可以用崩盤來並行在一起。

1

這種情況下的輕量級和統一方法是使用OpenMP任務。
您可以將它們用於並行循環或僅用於內部循環。在第二種情況下,我們將有fortask構造的組合。該解決方案利用嵌套並行性,但避免了嵌套並行區域的影響。 taskloop構建是一個等效的和更自動化的方法。