[KB][PLINQ]Parallel LINQ介紹(1)

[KB][PLINQ]Parallel LINQ介紹(1)

 

 

 

隨著多核心的CPU逐漸成為主流,為了要充分利用CPU的效能,在去年大約七月的時候,微軟發佈了Microsoft Parallel Extensions to Framework 3.5,目前的版本為June 2008 CTP版本。其中的PLINQ是大家要注意的地方。

PLINQ可能是下一代.NET Framework 4.0 的內建功能(Parallel FX Library, PFX)之一,它包含了Parallel LINQ (PLINQ) and Task Parallel Library (TPL)再搭配F#,下一代能帶給程式設計師提升效能及減少程式複雜的好特性實在不少。

NextDotNet

從它的字義上,我們可以知道它是用來做平行處理。針對哪部分做處理呢?主要是針對LINQ to Objects以及LINQ to XML作並行的處理。它提供了並行處理的類別以及方法,讓你過去操作thread以及同步所需處理的複雜程式碼簡化。類別及方法在System.Threading這個組件中實作。

接下來,我以一個簡單的範例來作說明:

1. 首先,開啟一個Console專案,然後在專案中引用System.Threading 這個dll 組件。

2. 我們輸入下列的程式碼

   1:   string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };
   2:   var MyQuery = from word in words select word;
   3:     
   4:   foreach (string str in MyQuery)
   5:  {
   6:       Console.Write(str + '\n');
   7:  }

然後,根據處理器循序處理的特性,我們可以看到輸出的結果的順序如下(如同在陣列中的順序):

seq

3. 變更成PLINQ的寫法:

   1:   string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };
   2:    var MyQuery = from word in words.AsParallel() select word;
   3:   
   4:  MyQuery.ForAll<string>(word => { Console.WriteLine(word); });
   5:  Console.Read();

然後我們去查看"單一個CPU"的呈現情形,看來是跟原來循序處理一樣。

 

 

 

seq1

如果我們把這個執行檔放到一個擁有雙核CPU的電腦上,執行的結果如下圖:

seq2

我們可以看到,透過平行處理,把這個陣列分成兩部分處理,一部分是NOT, Hello, World, PLINQ, IS, Very,另一部分則是BAD, !!, Test, GOOD。

如果你再運行一次,你會發現執行的順序變得不一樣了,因為在平行處理時,會切割成兩部分(如果是雙核心CPU)作處理,但不是每次順序都一樣。

seq3

4. 如果放在四核心的CPU上執行,執行的順序就更複雜了。(執行了三次,順序都不一樣)

image

image

image 

隨著硬體的功能提升,如何充分利用硬體來加速軟體? 微軟打算在下一代Framework中,透過平行運算充分的利用到硬體作加速及效能的提升。

未來這個系列將會介紹PLINQ的一些相關特性。

注意:基於是CTP版本,微軟在PLINQ功能上隨時仍會作調整。

 

 

如果您有微軟技術開發的問題,可以到MSDN Forum發問。

如果您有微軟IT管理的問題,可以到TechNet Forum發問喔。