【发布时间】:2014-07-04 05:47:55
【问题描述】:
我的代码有一个真正的问题,它非常慢并且毫无用处。我必须在下周提供我的结果,而按照这个代码,它需要超过 4 周的时间! 由于此代码计算流体运动,我们处理超过 100 万个细胞。因此,我的主要 For 循环(顺序很重要)计算量很大,现在每个输出都需要 12 分钟。 想象一下,我需要至少 5000 个输出!
谁能帮我提高计算速度? 或者 您能帮我理解如何将 For 循环更改为 PLINQ 语法吗?
我很沮丧
//implementation of time nt = 1,000,000
For (int t=0; t<nt; t++)
{
// main calculations, 2 dimensional
for (int i = 0; i < nx; i++)
{
for (int j = 0; j < ny; j++)
{
if (!Cells[i, j, 0].IsVirtual)
{
// calculate x velocity - nx = 1,000,000 & ny = 1,000,000
// calculate y velocity
// Data for each (i,j) affect (i+1,j+1)
}
}
}
}
【问题讨论】:
-
第一个问题将是计算可以并行完成,正如您提到的顺序很重要,那么一次运行循环会影响下一次运行吗?还有大部分时间花在哪里,实际计算或者您是否访问对象来进行计算
-
代码非常大,但最多的计算是在两个 For 循环中,并且对于每个输出(它有一个更大的 For 循环,一次工作)这两个内部 For 循环应该完成。这些 For 循环计算 100 万个点的速度。其他 For 循环对速度没有影响。
-
您是否有从分析当前实现的热门路径?使用并行处理可以给您带来边际加速,但优化实际实现可能会产生额外的改进。
-
您确定每个内部部件都独立于其他内部部件吗?
-
我同意@GregC,也许你的算法是问题,而不是实现。您是否研究过解决问题的数值方法?