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)快。但是我並不擅長基準並行算法,所以也許我測量錯了。無論如何,不幸的是我不能發佈這個觀察的實際代碼示例。
是否有一些經驗法則,額外的考慮因素,或只是嘗試和基準?
我認爲如果'DoSomething'不是太雜亂,我認爲第二種選擇具有更好的局部性。 – Elazar
看起來像你試圖猜測編譯器。你的問題依賴於編譯器,尤其是優化級別。有些編譯器可能足夠聰明,可以在第二個例子中識別並行機會,有些則不是。研究更多關於您的編譯器的知識,以及如何幫助識別並行代碼片段。也許是'#pragma'參與? –
相關:http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than-two-loops/8547993#8547993 – inf