2014-12-22 74 views
0

重新實現一個循環如何使用Parallel.For重新實現下面的循環?使用Parallel.For

for (int i = 0; i < data.Length; ++i) 
    { 
     int cluster = clustering[i]; 
     for (int j = 0; j < data[i].Length; ++j) 
      means[cluster][j] += data[i][j]; // accumulate sum 
    } 

獲得更好的性能和加速是目標。

+0

我們不直接在這裏爲你做你的工作。你需要告訴我們你已經嘗試了什麼。 – cost

+0

做谷歌搜索,並學習如何使用Parallel.ForEach – MethodMan

+0

你的數組有多大?你真的需要平行嗎? (*加法*是最便宜的指令之一) –

回答

3

你可以主要只是替換外部循環。但是,你需要照顧與設置,因爲您從多個線程設定值:

Parallel.For(0, data.Length, i => 
{ 
    int cluster = clustering[i]; 
    for (int j = 0; j < data[i].Length; ++j) 
     Interlocked.Add(ref means[cluster][j], data[i][j]); 
}); 

然而,這可能不是跑得更快,並且可以實際運行顯著慢,你可以很容易地介紹false sharing因爲一切都在讀取和寫入相同的數組。

+0

謝謝; Interlocked.Add方法重載不支持double類型,因爲名爲「data」的數組是double的。我在這種情況下閱讀了相關文章,但對於我如何完全重寫您的建議循環並不清楚。 – Araz

+0

這個循環是我算法的一個瓶頸,因爲我有興趣使用並行性來管理它,以加快速度。考慮假共享和緩存有什麼更好的解決方案? – Araz

+0

@Araz沒有interlocked.add,你需要做一些其他形式的同步(可能使用鎖定)。可能需要重新考慮算法的設計,以便將工作分離出來,以便更輕鬆地進行並行處理。 –