如何将 FOR 循环分成 N 个均等部分以进行并行执行,每次迭代的输入数据都是常量?

5

我有一个耗时很长的循环,希望能够并行执行。

伪代码:

for(int n = 0; n < 2048; n++)
{
  output_data[n] = function(constant_input_data, n)
}
  • 每次迭代的输入数据完全相同。
  • 第N次迭代的输出存储在索引为N的数组中。

如何将这个循环平均分成C份,其中C是CPU核心数?

在C#、.net中,最好和最优雅的方法是什么?

1个回答

8

使用 TPL 的 Parallel.For

Parallel.For( 0, 2048, n=>
   {
         output_data[n] = function(constant_input_data, n);
    });

TPL试图生成与CPU核心数量相同的线程,然后将您的工作分成任务,这些任务在这些线程上进行调度。因此,它是2048个任务,可能在x个线程上,其中x是核心数量。

这会将循环分成4个相等的部分,以便每个核心都可以处理吗?Parallel.For是如何工作的? - JBeurer
1
@JBeurer 还有更多 - 它甚至使用 .net 4.0 的任务窃取功能,如果一个核心变得空闲(以及更多的预测...):) - user57508
谢谢,这确实看起来是一个非常简单而优雅的解决方案,正是我所需要的。 - JBeurer
2
@jbeurer 不能保证循环会被平均分割。对于这种高级场景,您需要实现自定义分区。请参见http://channel9.msdn.com/Blogs/philpenn/Speeding-up-ParallelFor-using-the-Range-Partitioner - softveda
使用Parallel.For进行时间优化,四核心处理器上的运行时间从46004毫秒降至14703毫秒。不错! - JBeurer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接