为什么c#中的并行For循环比简单的For循环花费更多的时间

本文关键字:For 循环 时间 简单 并行 为什么 | 更新日期: 2023-09-27 18:11:19

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

作为第一步,我将For循环更改为Parallel。有趣的是,我们发现运行时间增加了!

我的代码示例:
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个输出。

为什么c#中的并行For循环比简单的For循环花费更多的时间

对于小循环,管理线程的开销可能会影响总体执行时间。如果每次迭代都花费更长的时间来执行,那么您可能会看到不同的结果。

对于大型数据集(例如至少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
        }
     }
 }

查看这里的解释:为什么循环的顺序会影响在二维数组上迭代的性能?