簡體   English   中英

使用openmp並行化內部循環

[英]parallelize inner loop using openmp

我有三個嵌套循環但只有最里面的可並行化。 外圈和中圈循環條件取決於最內圈的計算,因此我不能改變順序。

我在最里面的循環之前使用了一個OPENMP pragma指令,但是兩個線程的性能比一個線程的性能差。 我想這是因為在外循環的每次迭代中都會創建線程。

有沒有辦法在外部循環外創建線程,但只是在最里面的循環中使用它?

提前致謝

OpenMP 應該使用線程池,因此每次執行循環時都不會重新創建線程。 但是,嚴格來說,這可能取決於您正在使用的OpenMP實現(我知道GNU編譯器使用池)。 我建議你尋找其他常見問題,比如虛假分享。

不幸的是,當前的多核計算機系統對於這種細粒度的內環並行性並不好。 這不是因為線程創建/分叉問題。 正如Itjax所指出的,幾乎所有OpenMP實現都利用線程池,即它們預先創建了許多線程,並且線程被停放。 因此,實際上沒有創建線程的開銷。

但是,這種並行化內部循環的問題是以下兩個開銷:

  • 將作業/任務分派給線程:即使我們不需要物理創建線程,至少我們必須將作業(=創建邏輯任務)分配給主要需要同步的線程。
  • 連接線程:在團隊中的所有線程之后,應該連接這些線程(除非使用現在的OpenMP指令)。 這通常實現為屏障操作,這也是非常密集的同步。

因此,應該最小化線程分配/加入的實際數量。 您可以通過增加每次調用的內部循環的工作量來減少此類開銷。 這可以通過一些代碼更改來完成,例如循環展開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM