2008年6月19日

[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. 我們輸入下列的程式碼:


string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };
var MyQuery = from word in words select word;

foreach (string str in MyQuery)
{
Console.Write(str + '\n');
}

Console.Read();

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

seq

3. 變更成PLINQ的寫法:



string[] words = new[] { "Hello", "World", "PLINQ", "IS", "Very", "NOT", "BAD", "!!", "Test", "GOOD" };

var MyQuery = from word in words.AsParallel() select word;

MyQuery.ForAll(word => { Console.WriteLine(word); });

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功能上隨時仍會作調整。

3 則留言:

  1. 首先 先跟您說聲對不起 因為我這篇文章跟你PO的內容是不相關的 (因為我找不到怎樣可以留言的方式 來請教您問題)

    這是我的問題

    想請問一下關於 頁籤的問題
    HeaderTemplate>
    test1
    /HeaderTemplate>
    關於這個地方...我想請問一下 這樣你可以把 頁籤變成 test1 這個我懂
    但是想請問一下 如果這個是動態從資料庫要撈出來的資料呢 而且可能有很多個 頁籤 就要同時動態新增
    cc1:TabPanel ID="TabPanel3" runat="server" HeaderText="TabPanel3">
    cc1:TabPanel>
    cc1:TabPanel ID="TabPanel4" runat="server" HeaderText="TabPanel4">
    /cc1:TabPanel>
    然後放進去不同的頁籤名稱 而不是用 拉的(Design就拉好的呢)..
    請問一下我應該要怎樣寫呢 ??
    或是有其他可以參考的網址或是其他資料呢??
    另外我有找到一篇關於您的回文
    http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=2584403&SiteID=14
    我有看 但是我用過不行 = =
    因為我找嚕滿多的文章 但是都沒有人說這個頁籤要動態產生而且要在 ContentTemplate>
    放一個 Gridview
    /ContentTemplate>
    還是說他根本就不能動態產生呢??
    謝謝你 的幫忙 感激 ^^

    回覆刪除
  2. 您可以參考下列做法,可能是沒有設定ActiveTab, 所以畫面不會出現相關控制項:
    Protected Sub TabContainer1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabContainer1.Load
    Dim tb1 As New TabPanel
    tb1.ID = "tab1"
    tb1.HeaderText = "Tab1"
    tb1.Width = 10
    Dim bt As New Button
    bt.Text = "Hello"
    tb1.Controls.Add(bt)

    Dim tb2 As New TabPanel
    tb2.ID = "tab6"
    tb2.HeaderText = "Tab2"
    tb2.Width = 10
    Dim Gv As New GridView
    Dim ar As New ArrayList
    ar.Add(10)
    ar.Add(20)
    ar.Add(40)
    Gv.DataSource = ar
    Gv.DataBind()
    tb2.Controls.Add(Gv)

    CType(sender, TabContainer).Tabs.Add(tb1)
    CType(sender, TabContainer).Tabs.Add(tb2)
    CType(sender, TabContainer).ActiveTab = tb1
    End Sub

    回覆刪除

[Info] 如何快速找到Fix it?

  台灣微軟目前提供了很多的Fix it,讓許多消費者可以不用看完整篇KB,只要按下一個按鈕,就可以幫使用者自動修正許多問題. 現在在Vista以及Windows 7上,微軟也提供了SideBar工具,讓你用最短的時間找到能修正您的電腦的Fix it.(目前為英文版本) ...