我有一个嵌套的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;哪个可以帮我安全循环,但这个循环的哪个部分不安全?
答案 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亿倍的计算机,如果你希望它在你的一生中完成,那就是几千亿个处理器。