2010-05-21 43 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