2013-05-26 56 views
1

假設您有一個並行for循環實現,例如, ConcRT parallel_for,是否最好把所有的工作放在一個循環體中?並行for循環體的最佳大小

看看下面的例子:

for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomething(a[i], b[i]); 
} 
for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomethingElse(a[i], b[i]); 
} 

for(size_t i = 0; i < size(); ++i) 
{ 
    DoSomething(a[i], b[i]); 
    DoSomethingElse(a[i], b[i]); 
} 

第二方案是要走的明顯的方式相比,但是當涉及到並行處理可能有其他的考慮?

我剛剛通過parallel_for的情況下,選項1比第二個(平均約〜30ms到〜38ms)快。但是我並不擅長基準並行算法,所以也許我測量錯了。無論如何,不​​幸的是我不能發佈這個觀察的實際代碼示例。

是否有一些經驗法則,額外的考慮因素,或只是嘗試和基準?

+0

我認爲如果'DoSomething'不是太雜亂,我認爲第二種選擇具有更好的局部性。 – Elazar

+0

看起來像你試圖猜測編譯器。你的問題依賴於編譯器,尤其是優化級別。有些編譯器可能足夠聰明,可以在第二個例子中識別並行機會,有些則不是。研究更多關於您的編譯器的知識,以及如何幫助識別並行代碼片段。也許是'#pragma'參與? –

+0

相關:http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than-two-loops/8547993#8547993 – inf

回答

0

它每很大程度上取決於你在DoSomething做什麼,DoSomethingElse

比方說,DoSomething需要的東西,從內存,所以當你運行它,在它的上環,對象將是在緩存中,但是當你從DoSomethin切換到DoSomethingElse,這也需要內存中的某些內容,緩存中的對象發生更改並需要將其從內存中取出。

再次 - 不確定這種情況非常取決於你在這些方法中做什麼。 從一見鍾情 - 性能不應該有任何不同