为什么并行For循环在C#中需要比简单For循环更多的时间?

时间:2014-07-04 02:55:23

标签: c# performance parallel-processing task-parallel-library

我在c#中有一个CFD(计算流体动力学),它花费了太多时间来计算结果。为了改进我的代码,我开始学习TPL并使用并行代码。对于顺序不重要的循环,我可以使用TPL,对于循环顺序,PLINQ是唯一的方法。 我是对的吗?

作为第一步,我将For循环更改为Parallel.For并且有趣地发现运行时间增加了!

我的代码示例:

for (int i = 0; i < nx; i++)
{
    for (int j = 0; j < ny; j++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity

        }
     }
 }

使用并行任务:

Parallel.for (0,nx, i =>
{
    for (int j = 0; j < ny; j++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity
        }
    }
});

如何加快代码速度? 我的每个输出需要10分钟,这是非常长的时间,并且至少有5000个输出。

2 个答案:

答案 0 :(得分:3)

对于小型循环,管理线程的开销可能会影响整个执行时间。如果每次迭代执行时间较长,您可能会看到不同的结果。

答案 1 :(得分:0)

在大型数据集(例如至少500,000个单元格)上,您可能遇到缓存失效问题,因为您无法有效地迭代内存。

如果将其更改为此值,您可能会看到性能提升(无论您是否使用TPL)(请注意我如何将迭代从i,j转换为j,i):

for (int j = 0; j < ny; j++)
{
    for (int i = 0; i < nx; i++)
    {
        if (!Cells[i, j, 0].IsVirtual)
        {
            // calculate x velocity
            // calculate y velocity

        }
     }
 }

请参阅此处获取解释:Why does the order of the loops affect performance when iterating over a 2D array?