2014-03-27 38 views
1

我有3次嵌套循環,而兩個外循環只循環很少幾次,而不是最內循環。事情是這樣的:parallel_for - 哪個循環要並行化?

for (int i = 0; i < I; i++) { 
     for (int j = 0; j < J; j++) { 
      for (int k = 0; k < K; k++) { 

       //Do stuff 
      } 
     } 
    } 

I〜= j的< < K,即我大致等於Ĵ,但K是非常大(的幾千倍)

由於所有的數據都是獨立的彼此,我想使用parallel_for ppl.h庫並行化它們。現在問題出現了,我並行化哪個循環?我傾向於最內層的循環,因爲它是最大的循環,但我認爲每當外層循環循環時,整個線程開銷就會重新開始。那麼更高效的是什麼?

+0

嘗試所有3種方式,基準(跨越各種數據),然後挑選出任何令人驚訝的結果。 「爲什麼......」的問題通常比「哪些是...」的問題更有趣。 – user2864740

回答

4

現在問題出現了,我並行化哪個循環?

通常,您希望並行化最有意義的最外層循環。如果並行化內部循環,則會引入額外開銷。通過讓「循環體」儘可能大,您將獲得更好的整體吞吐量。這實際上歸結爲Amdahl's law - 在這種情況下,調度並行工作項所涉及的開銷並不是可並行化的,因此您做的工作越多,整體潛在效率就越低。

這樣做的風險是,如果外循環中的項目太少,則最終可能無法並行運行工作項目,因爲會有一個項目比處理核心的項目少你的系統。

如果你的外部循環足以保持內核繁忙,那麼這是最好的選擇 - 特別是當每個循環體中的工作量相對一致時。

+2

問題中未顯示的寫入衝突將是我考慮的另一個主要因素。 –

+0

@ BenVoigt True - 儘管一般來說,只有在較低級別進行並行化纔會使這些更糟糕。 –

+0

你的正確。我只是測試了每個循環,並且最外面的循環並行化是最快的,儘管它迭代到4,而最裏面的迭代直到20k左右。 – spurra