在给定每次迭代的常量输入数据的情况下,如何在N个偶数部分中分割FOR循环以进行并行执行?

JBe*_*rer 4 .net c# parallel-processing multithreading task-parallel-library

我有一个耗时的循环,我想并行执行.伪代码:

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

如何在C等分中划分这个循环,其中C是CPU核心数?

在C#,.net中执行此操作的最佳和最优雅的方法是什么?

Muh*_*han 7

使用Parallel.For TPL

Parallel.For( 0, 2048, n=>
   {
         output_data[n] = function(constant_input_data, n);
    });
Run Code Online (Sandbox Code Playgroud)

TPL尝试生成与no一样多的线程.你拥有的cpu核心,然后你的工作分为在这些线程上安排的任务.因此可能是 x不是2048个任务.x是否的线程数.核心.

  • @jbeurer不能保证循环将被分成相等的部分.对于此类高级方案,您需要实现自定义分区.见http://channel9.msdn.com/Blogs/philpenn/Speeding-up-ParallelFor-using-the-Range-Partitioner (2认同)