.Net中可用的并行技术

我是.Net平台的新手。 我做了一个搜索,发现有几种方法可以在.Net中进行并行计算:

  1. 任务并行库中的并行任务,即.Net 3.5。

  2. PLINQ,.Net 4.0

  3. Asynchounous Programming,.Net 2.0,(async主要用于执行I / O繁重的任务,F#有一个简洁的语法支持这个)。 我列出这个是因为在Mono中,似乎没有TPL或PLINQ。 因此,如果我需要编写跨平台并行程序,我可以使用async。

  4. .Net线程。 没有版本限制。

您能否对这些做一些简短评论或在此列表中添加更多方法?

您需要做大量的研究才能确定如何有效地进行multithreading。 有一些很好的技术文章 ,是Microsoft Parallel Computing团队网站的一部分 。

在我的脑海中,有多种方法可以实现multithreading:

  1. Thread类。
  2. ThreadPool ,它还支持I / O绑定操作和I / O完成端口。
  3. Begin* / End*异步操作。
  4. 基于事件的异步编程(或“EBAP”)组件,它们使用SynchronizationContext
  5. BackgroundWorker ,它是定义异步操作的EBAP。
  6. .NET 4中的Task类(任务并行库)。
  7. 并行LINQ。 关于Parallel.ForEach(任务并行库)与PLINQ的文章很好 。
  8. Rx或“LINQ to Events”,它还没有非Beta版本但已接近完成且看起来很有希望。
  9. (仅限F#)异步工作流程。

更新:有一篇文章了解和应用.NET Framework 4的并行模式可供下载,它为哪些解决方案用于哪种并行方案提供了一些指导(尽管它假定为.NET 4并且不包括Rx)。

严格地说,应该在这里区分并行,异步和并发。

并行意味着“任务”被分成几个可以同时运行的较小子任务。 这需要多核CPU或多CPU计算机,其中每个任务都有其专用的核心或CPU。 或多台电脑。 PLINQ(数据并行)和TPL(任务并行)属于这一类。

异步意味着任务在不相互阻塞的情况下运行。 F#的异步表达式,Rx,Begin / End模式都是异步编程的API。

并发是一个比并行化和异步更广泛的概念。 并发意味着几个“任务”同时运行,彼此交互。 但是这些“任务”不必在单独的物理计算单元上运行,就像在并行化中那样。 例如,多任务操作系统甚至可以使用时间片在单核单CPU计算机上同时执行多个进程。 例如,使用Actor模型和消息传递(例如F#的邮箱,Erlang进程(在.Net中的Retlang))可以实现并发性

与上述概念相比,线程是一个相对低级的概念。 线程是在进程内运行的任务,由操作系统的调度程序直接并行运行。 当操作系统将每个线程映射到单独的核心时,可以实现并行化,或者通过在每个线程上实现消息队列,路由等来实现Actor模型。

还有一些用于数据并行编程的.NET库,它们以图形处理单元(GPU)为目标,包括:

Microsoft Accelerator用于数据并行编程,可以针对GPU或多核处理器。

Brama用于在GPU上运行的LINQ样式数据转换。

CUDA.NET提供了一个包装器,允许从.NET程序中使用CUDA。

还有.NET的反应扩展(Rx)

Rx基本上是事件的linq查询。 它允许您以与linq允许您使用集合相同的方式处理和组合异步数据流。 因此,您可能会将其与其他并行技术结合使用,作为将并行操作的结果集中在一起的方法,而不必担心锁和其他低级线程原语。

专家专家:Brian Beckman和Erik Meijer – .NET Reactive Framework(Rx)内部概述了Rx的全部内容。

编辑:值得一提的另一个库是并发和协调运行时(CCR),它已存在很长时间(早于’06)并作为Microsoft Robotics Studio的一部分提供。

Rx有很多与CCR相同的很酷的想法,但在我看来,它有更好的API。 CCR中仍然有一些有趣的东西,所以它可能值得一试。 还有一个与CCR一起使用的分布式服务框架,可能会根据您正在做的事情使其有用。

专家专家:Meijer和Chrysanthakopoulos – 并发,协调和CCR

还有一个是.NET 4.0中的新任务并行库,它与您已经发现的类似,但这可能是一个有趣的读物:

任务并行库

并行的两种主要方式是线程和基于新任务的库TPL。

您提到的异步编程只不过是线程池中的一个新线程。

提到的PLINQ,Rx和其他实际上是位于新任务调度程序顶部的扩展。

最好的文章完全解释了新任务调度程序的新架构以及其上的所有库,Visual Studio 2010和新的TPL .NET 4.0基于任务的并行机构(由Microsoft的并行开发人员工具产品部经理Steve Teixeira撰写) ):

http://www.drdobbs.com/visualstudio/224400670

否则Dobbs博士在这里有专门的并行编程部分: http : //www.drdobbs.com/go-parallel/index.jhtml

说线程和基于新任务的并行编程之间的主要区别在于您不需要再考虑线程,如何管理池以及底层操作系统和硬件。 TPL负责您只使用任务。 这是您在任何级别(包括抽象)上进行并行操作的方式的巨大变化。

所以在.NET中实际上你没有很多选择:

  1. 线
  2. 基于新任务的任务调度程序。

显然,任务基础是要走的路。

欢呼Valko