2011-07-20 40 views
0

我有一個串行代碼看起來就像這樣總結:英特爾Parallel Studio 2011 - 並行

sum = a; 
sum += b; 
sum += c; 
sum += d; 

我想它並行,以類似的東西:

temp1 = a + b  and in the same time  temp2 = c + d 
sum = temp1 + temp2 

我如何使用英特爾並行工作室工具做它?

謝謝!

回答

1

假設所有變量都是整型或浮點類型,那麼並行化這些代碼是絕對沒有意義的(在由不同線程/內核執行的意義上),因爲開銷遠高於任何好處的。本例中適用的並行性處於單個CPU上的多個計算單元和/或矢量化級別。優化編譯器現在已經足夠複雜,可以自動利用它,而不需要更改代碼;但是如果你希望你可以明確地使用臨時變量,就像問題的第二部分一樣。

如果您只是出於好奇而問:Intel Parallel Studio提供了幾種並行化代碼的方法。例如,讓我們使用Cilk關鍵字連同C++ 11的lambda函數:

#include <cilk/cilk.h> 
... 
temp = cilk_spawn [=]{ return a+b; }(); 
sum = c+d; 
cilk_sync; 
sum += temp; 

不要指望得到表現出來的是(見上文),除非你使用類與計算重型超載operator+

+0

謝謝!當你說:'現在優化編譯器足夠複雜來自動利用它'究竟意味着什麼?編譯器是否自動執行類似於SIMD命令的操作? –

+0

我的意思是編譯器可以生成可以使用多個算術單元或/和向量(SIMD)單元(如果目標處理器上可用)的代碼。或者換句話說,一個好的優化編譯器可以認識到源代碼可以被轉換/分割成可以並行執行的獨立部分,因此它可以生成利用目標處理器並行性的代碼。 –