如何将我的 For 循环分解为 Parallel.For 循环?

How to break my For loops into Parallel.For loops?

我有 3 个 For 循环 运行 用于很多迭代:

for (int i = 0; i < 1000000; i++) 
{
    for (int j = 0; j < 1000000; j++)
    {
      var myObj = new MyObj(i,j);
      var a = myObj.doSomething();
      for (int k = 0; k < 1000000; k++)
      {
       a.work();
      }
    }
} 

我必须 运行 总共 10^18 次迭代,这将花费很多时间才能完成。

是否有使用 Parallel.For 使循环 运行 更快的快速方法?如果是 - 如何更改我的代码?

如果要完成的工作太多fine-grained,与并行相关的开销可能大于并行执行的收益。因此,仅对外循环使用 Parallel.For 就足够了。它的优点是可以创建更大的工作块并最大程度地减少开销。

这仍然需要并行执行 100 万个任务。这已经足够了。

var options = new ParallelOptions {
    MaxDegreeOfParallelism = Environment.ProcessorCount
};
var result = Parallel.For(0, 1000000, options, (i, state) =>
{
    for (int j = 0; j < 1000000; j++)
    {
        var myObj = new MyObj(i,j);
        var a = myObj.doSomething();
        for (int k = 0; k < 1000000; k++)
        {
            a.work();
        }
    }
});

但请注意,如果 a.work() 使用需要独占访问的资源,那么所涉及的锁定可能会破坏优势。

如果工作主要 CPU 绑定,建议将并行度限制为处理器数量。