您的位置:首页 > 其它

越来越快的循环

2010-05-04 10:13 183 查看
    随着多核计算机变得越来越普遍,令人烦恼的是循环不能利用这些多余的内核资源。不过幸运的是微软的帅哥靓女为我们解决了这种困惑,他们已采取措施使我们循环可以利用这些额外的内核资源。我将展示一个代码示例,演示.NET 4.0中的一个新的功能叫做Task Parallel Library。有了这个库,可以非常容易编写托管语言来使用多内核。这样我们就可以编写并行任务的代码,它可以同时运行在可用的处理器上。一般来说,这样可以显着地加快了代码运行的速度。

这里有一个并行示例的代码:

using System;
namespace ParallelForSample
{
public class SingleCore
{
public static void Calculate(int calcVal)
{
Utility util = new Utility();
util.Start();

int[,] G = new int[calcVal, calcVal];
for (int k = 0; k < calcVal; k++)
for (int i = 0; i < calcVal; i++)
for (int j = 0; j < calcVal; j++)
G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
util.Stop();

}
}
}


正如你可以看到,这是一个相当简单的类 - 它用了三个循环填充数组。现在,使用TPL(Task Parallel Library)重写这段代码:

using System;
using System.Threading.Tasks;

namespace ParallelForSample
{
public class MultiCore
{
public static void Calculate(int calcVal)
{
Utility util = new Utility();
util.Start();

int[,] G = new int[calcVal, calcVal];

Parallel.For(0, calcVal,
delegate(int k)
{
Parallel.For(0, calcVal, delegate(int i)
{
for (int j = 0; j < calcVal; j++)
G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
});
}
);

util.Stop();
}
}
}
正如你可以看到,这是语法是稍有不同。 for循环分解成Parallel.For。这需要一个委托,实际上执行循环的行为的是这个委托。如果你下载并运行该示例,您可以观察到不同的行为和不同的循环计时。


不过需要有一个多核的机器,才可以看到这种差距,如果是一台单核的机器,你是观察不到的。


以下是译者加:


我的电脑配置如下图:






运行结果:






我们可以看到差距接近10秒之多。


代码:/Files/zhuqil/parallelforsample.zip


原文:faster-faster-loops
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: