我在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个输出。
答案 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?