【问题标题】:reimplement a loop using Parallel.For使用 Parallel.For 重新实现循环
【发布时间】:2014-12-22 21:55:50
【问题描述】:

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

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

【问题讨论】:

  • 我们不会在这里直接为您工作。您需要向我们展示您已经尝试过的内容。
  • 进行谷歌搜索并学习如何使用 Parallel.ForEach
  • 您的阵列有多大?你真的需要并行性吗? (加法是最便宜的指令之一)
  • 这与 Parallel.ForEach 循环无关。
  • data.Length 在百万左右。

标签: c# parallel.for


【解决方案1】:

您几乎可以只替换外部循环。但是,您需要注意设置,因为您正在从多个线程设置值:

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,因为所有内容都在读取和写入相同的数组。

【讨论】:

  • 谢谢; Interlocked.Add 方法重载不支持双精度类型,因为我的名为“数据”的数组是双精度的。在这种情况下,我阅读了相关帖子,但我不清楚如何准确地重写您建议的循环。
  • 这个循环是我算法的瓶颈之一,因为我有兴趣使用并行性来管理它以加快速度。考虑到虚假共享和缓存,有什么更好的解决方案?
  • @Araz 如果没有 interlocked.add,您需要进行其他形式的同步(可能使用锁定)。可能值得重新考虑算法的设计以分离工作,以便更轻松地并行化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多