0

如何使用 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
  }

获得更好的性能和速度是目标。

4

1 回答 1

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]); 
});

但是,这可能不会运行得更快,实际上可能运行得更慢,因为您很容易引入错误共享,因为所有内容都在读取和写入相同的数组。

于 2014-12-22T22:00:40.143 回答