我在c#中有一个CFD(计算流体动力学),它需要太多的时间来计算结果。为了改进我的代码,我开始学习TPL并使用并行代码。对于顺序不重要的循环,我可以使用TPL和PLINQ命令的循环,这是唯一的方法。 我正确吗?为什么在C#中并行For循环比简单For循环需要更多时间?
作为第一步,我将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个输出。
需要提供实际的代码而不仅仅是一个骨架结构来确定其表现糟糕的原因。这可能是因为线程的开销超过了您的计算量(http://stackoverflow.com/questions/10763184/how-does-sequential-loop-run-faster-than-parallel-loop-in-c)。这可能是因为你使用了太多的全局变量(http://stackoverflow.com/questions/10846550/disappointing-performance-with-parallel-for)。这可能是因为您已将线程池大小设置得太低。或者其他一些原因,只有深入了解你正在做的事情才能发现。 – Sybeus
你正在使用什么CPU?并行计算需要硬件支持。 – Johnny
我有一个电脑与核心i7 CPU。 如果TPL无法帮助我提高计算速度,那么我的其他解决方案是什么? – user3803849