为什么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个输出。
对于小循环,管理线程的开销可能会影响总体执行时间。如果每次迭代都花费更长的时间来执行,那么您可能会看到不同的结果。
对于大型数据集(例如至少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
}
}
}
查看这里的解释:为什么循环的顺序会影响在二维数组上迭代的性能?