我应该修复Parallel.For的哪一部分并且不安全?

时间:2014-07-11 01:16:57

标签: c# for-loop task-parallel-library

我有一个嵌套的For循环如下:

    // This loop cannot be parallel because results of the next 
    // two loops will be used for next t
    for (int t= 0; t< 6000000; t++)
        // Calculations in the following two loops includes 75% of all time spend for.
        for (int i= 0; i< 1000; i++)
        {
            for (int j= 0; j< 1000; j++)
            {

                if (Vxcal){V.x= ............. // some calculations    }
                if (Vycal){V.y= ............. // some calculations    }
                // Vbar is a two dimensional array
                Vbar = V;
            }
        }

我将上面的代码更改为:

    // This loop cannot be parallel because results of the next 
    // two loops will be used for next t
    for (int t= 0; t< 6000000; t++)
        // Calculations in the following two loops includes 75% of all time spend for.
        Parallel.for (0, 1000, i=>
            {
                Parallel.for (0, 1000, j=>
                    {
                        if (Vxcal){V.x= ............. // some calculations    }
                        if (Vycal){V.y= ............. // some calculations    }
                        // Vbar is a two dimensional array
                        Vbar = V;
                    }
            }

当我运行代码时,结果不正确,需要数小时而不是10分钟。我的问题是: 这些For循环适合并行吗? 这些循环只是有一些数学计算。 如何使这个并行For循环安全?

我找到了一个关键字&#34; Lock&#34;哪个可以帮我安全循环,但这个循环的哪个部分不安全?

1 个答案:

答案 0 :(得分:4)

我看到你修改了你的问题以输入其他一些数字。所以你的内循环现在执行6000000 * 1000 * 1000,或6,000,000,000,000次。每秒40亿次计算(你的计算机无法做到),这需要1,500秒或25分钟。如果你与Parallel.For完全并行,你可以在4核机器上将其减少到8.25分钟。如果您的计算冗长而复杂,那么完成它需要数小时也就不足为奇了。

你的代码很慢,因为它做了很多工作。 您需要更好的算法!

原始答案

考虑你的嵌套循环:

for (int t= 0; t< 5000000000; t++)
    // Calculations in the following two loops includes 75% of all time spend for.
    for (int i= 0; i< 5000000000; i++)
    {
        for (int j= 0; j< 5000000000; j++)

内循环(您的计算)正在执行5,000,000,000 * 5,000,000,000 * 5,000,000,000次。 125,000,000,000,000,000,000,000,000,000,000是巨大号码。即使你的计算机每秒可以循环40亿次(它甚至不能关闭),也需要31,250,000,000,000,000,000秒,或者大约9,900亿才能完成。在四核机器上使用多个线程可以将其减少到仅2500亿年。

我不知道你要做什么,但是你需要一个更好的算法,一台比你拥有的算法快5000亿倍的计算机,如果你希望它在你的一生中完成,那就是几千亿个处理器。