并行For循环,Sum函数表现不佳

时间:2016-12-15 17:02:35

标签: c# algorithm

我试图在下面的图片上实现算法:

Image of Algorithm

我的问题是,当我在算法中做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;
        }
    });               
});

1 个答案:

答案 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
    }
 }