如何最有效地利用多核来进行 .NET 中的短计算?

2024-01-07

上下文如下:我正在用 C# 为一个小型项目编写一个解释器称为 Heron 的编程语言 http://www.heron-language.com,并且它有一些可以并行执行的原始列表操作。

我面临的最大挑战之一是,每当遇到可并行操作时,如何将评估器完成的工作有效地分配到不同的核心上。这可能是短期或长期操作,很难提前确定。

我不必担心的一件事是同步数据:明确不允许并行操作修改数据。

所以我的主要问题是:

  • 跨线程分配工作的最有效方法是什么,以便我可以保证计算机将工作分配到两个核心?

我也对一个相关问题感兴趣:

  • 在我们可以开始克服将工作分离到另一个线程上的开销之前,一个操作大约需要多长时间?

如果您想通过并行操作做很多事情,您将需要从 .Net 4.0 开始。这是.Net 并行编程文档 http://blogs.msdn.com/pfxteam/archive/2009/05/20/9633092.aspx。你会想要不过从这里开始 http://msdn.microsoft.com/en-us/library/dd460693(VS.100).aspx。 .Net 4.0 在多核利用率方面增加了很多。这是一个简单的例子:

目前3.5串口方式:

for(int i = 0; i < 30000; i++)
{
  doSomething(i);
}

新的.Net 4.0并行方法:

Parallel.For(0, 30000, (i) => doSomething(i));

The 并行.For http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for(VS.100).aspx方法会自动扩展可用核心的数量,您可以看到开始利用这一点的速度有多快。框架中有数十个新库,也支持完整的线程/任务管理,如您的示例(包括用于同步、取消等的所有管道)。

有一些库并行 LINQ (PLINQ) http://msdn.microsoft.com/en-us/library/dd460688(VS.100).aspx, 任务工厂 http://msdn.microsoft.com/en-us/library/ee782519(VS.100).aspx, 任务调度程序 http://msdn.microsoft.com/en-us/library/dd997402(VS.100).aspx和其他一些。简而言之,对于您布置的具体任务,.Net 4.0 为您带来了巨大的好处,我会继续获取免费的 Beta 2 http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx (RC 即将推出 http://blogs.msdn.com/somasegar/archive/2009/12/17/visual-studio-2010-and-net-framework-4-beta-period-extended.aspx)并开始。(不,我不在 Microsoft 工作……但我很少看到即将发布的版本能够如此完美地满足需求,因此我强烈推荐您使用 .Net 4.0)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何最有效地利用多核来进行 .NET 中的短计算? 的相关文章

随机推荐