我试图在下面的图片上实现算法:
我的问题是,当我在算法中做Sum时,它需要花费很多时间。拜托,你能查一下,我做错了什么?
Parallel.For(0, n, i =>
{
Parallel.For(0, n, j =>
{
double sum1 = 0;
double sum2 = 0;
if (i > j)
{
for (int a = 1; a < j - 1; a++)
{
sum1 = sum1 + (matrixL[i, a] * matrixU[a, j]);
}
matrixL[i, j] = (matrixA[i, j] - sum1) / matrixU[j, j];
}
else
{
for (int a = 1; a < i - 1; a++)
{
sum2 = sum2 + (matrixL[i, a] * matrixU[a, j]);
}
matrixU[i, j] = matrixA[i, j] - sum2;
}
});
});
答案 0 :(得分:1)
这里有一些项目。
首先,正如@MalteR在评论中指出的那样,伪代码并没有说外环必须是并行的。我读过关于这样做是否真的可以接受的相互矛盾的事情;来自Microsoft的this blog post表示可以“嵌套”Parallel.For循环,但我已经看到其他Stack Overflow问题(例如this one)抱怨这样做会降低性能。
澄清一下,现在你有:
Parallel.For(0, n, i =>
{
Parallel.For(0, n, j =>
{
而不是
for (int i = 0; i < n; i++)
{
Parallel.For(0, n, j =>
{
请记住,对并行化实际获得的数量存在严格限制。机器一次只能完成有限数量的事情(让我们称之为 x ),所以如果你试图为一个CPU绑定的事情做多次 x 事情任务你实际上不会提高绩效。
你可以尝试一下,看看我链接的文章,看看外部的Parallel.For循环是否有助于或损害你的表现。
我在这里看到的最大优化是伪代码特别指出你只循环直到收敛,但你总是循环 n 次(即使它实际上不是必需的)。所以你可以这样做:
for (int i = 0; i < n; i++)
{
Parallel.For(0, n, j =>
{
// Do the algo
}
if ([test for convergence]) {
break; // No need to keep going
}
}