2010-05-21 72 views
10

我是.Net平台的新手。我做了搜索,发现有几种方法在.net做并行计算:.Net中的可用并行技术

  1. 在任务并行库,这是NET 3.5的并行任务。

  2. PLINQ,.NET 4.0

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

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

您可以对这些做一些简短的评论或者在这个列表中添加更多的方法吗?谢谢。

+1

原始数据一些有用的链接:http://msdn.microsoft.com/en-us/concurrency/ee851578.aspx http://channel9.msdn.com/shows/The +知识+商会/多核心和并行编程实践/ http://blogs.msdn.com/pfxteam/rss.xml – Brian 2010-05-21 16:16:53

+0

那么,PLINQ /''Parallel'绝对是最容易使用的,但不是在所有情况下都适用 – 2010-05-21 16:19:08

回答

16

您确实需要做相当数量的研究才能确定如何有效地实现多线程。有一些好的technical articlesMicrosoft Parallel Computing team's site的一部分。

关闭我的头顶,有多种方法去了解多线程:

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

更新:有一篇文章Understanding and Applying Parallel Patterns with the .NET Framework 4可供下载,它提供了哪些解决方案用于哪种类型的并行场景(尽管它假定.NET 4并不包括Rx)。

+1

+1对于广泛的列表 – 2010-05-21 16:31:31

3

也有Reactive Extensions for .NET (Rx)

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

Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx)很好地概括了Rx的全部内容。

编辑:另一个图书馆值得一提的是并发与协调运行时(CCR),它已经存在很长一段时间(比06年更早),并附带为Microsoft Robotics Studio的一部分。

Rx拥有很多与CCR相同的酷想法,但在我看来,它有更好的API。在CCR中仍然有一些有趣的东西,但它可能值得一试。还有一个分布式服务框架可以与CCR一起工作,这可能会使它很有用,具体取决于你在做什么。

Expert to Expert: Meijer and Chrysanthakopoulos - Concurrency, Coordination and the CCR

+0

我不知道如何为此得到一个downvote,Rx使并行编程在某些情况下更容易 - 我广泛使用它。 – 2010-05-21 16:26:48

+0

+1是第一个提及Rx的人。 ;) – 2010-05-21 16:29:10

+0

@Mauricio他们是高度相关的,如果你不能协调你的结果,那么并行运行一切都是没用的。从问题中可以清楚地看到,OP也对这方面感兴趣。他指出“F#有一个简洁的语法支持这个”,指的是继续monad,Rx本质上是所有支持LINQ的.NET语言的延续monad。 – 2010-05-21 17:30:16

2

还有一个是在.NET 4.0中,这是类似的,沿着你已经发现了线的新任务并行库,但是这可能是一个有趣的阅读:

Task Parallel Library

11

严格地说,并行,异步和并发之间的区别应该在这里进行。

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

异步意味着任务运行时不会互相阻塞。 F#的异步表达式,Rx,开始/结束模式都是用于异步编程的API。

并发是一个比并行化和异步更广泛的概念。并发意味着几个“任务”同时运行,彼此交互。但是这些“任务”不必在单独的物理计算单元上运行,就像在并行化中一样。例如,即使在单核单CPU计算机上,多任务操作系统也可以使用时间片同时执行多个进程。 例如,使用Actor模型和消息传递(例如F#的邮箱,Erlang进程(.Net中的Retlang))可以实现并发性。与上述概念相比,线程是一个相对较低级别的概念。线程是在进程中运行的任务,并行运行并由操作系统的调度程序直接管理。您可以在操作系统通过在每个线程上实现消息队列,路由等将每个线程映射到单独的核心或Actor模型时实现并行化。

+1

我发布它作为社区wiki,以便其他人可以更正和改进我的定义... – 2010-05-21 18:41:00

4

还有用于靶向的图形处理单元(GPU)的数据并行编程一些.NET库包括:

Microsoft Accelerator 为数据并行编程和可以针对任一GPU或多核处理器。

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

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

-1

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

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

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

最好的文章解释了新的任务调度程序及其顶部的所有库,Visual Studio 2010和新的TPL .NET 4.0基于任务的并行性的新体系结构在此处(作者:Steve Teixeira,并行产品部经理在微软开发工具):

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

否则布斯博士一直致力于并行编程节在这里:比如线程和新任务之间基于并行编程http://www.drdobbs.com/go-parallel/index.jhtml

的主要区别是,你不需要想nymore在线程方面,你如何管理池和底层操作系统和硬件了。 TPL照顾你只是使用任务。这是包括抽象在内的任何级别上进行并行处理的巨大变化。因此,在.NET

其实你没有太多的选择:

  1. 螺纹
  2. 新的基于任务的,任务调度。

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

欢呼 Valko