.NET4.0平行計算技術基礎(1)

iDotNetSpace發表於2009-10-26
  .NET4.0平行計算技術基礎(1) 收藏 
開篇語:
 
   這是一個系列文章,系統介紹.NET 4.0中引入的並行擴充套件(包括任務並行庫TPL和PLINQ)開發技術。
   本系列文章中所有示例程式碼在VS2010 BETA1+Windows 7 RC下除錯通過。所有示例原始碼將在本系列文章貼完以後,統一壓縮上傳到CSDN下載頻道。
 
   本系列文章的主要內容來自是本人將在電子工業出版社出版的新作中的一章,出於技術共享與交流目的釋出,期望業界對平行計算有豐富經驗的工程師指出疏漏,也希望網友對提出寶貴建議。
 
   作者金旭亮擁有本系列文章所有版權,未經本人許可,不允許將此序列文章及相關示例用於商業目的,除此之外,在網路上出於知識共享目的的複製轉貼不受限制。
 
  反饋方式: 
   
   在我的本技術部落格上直接回貼 或發郵件至:
 
      JinXuLiang@bit.edu.cn
 
                           2009.9.9
===================================================
隨著多核CPU的普及和網際網路的迅速發展,計算已經進入並行的時代,這種平行計算有兩種主要的形式,一種著眼於充分挖掘單臺計算機的硬體潛力,通常以多執行緒協作的方式完成指定的工作任務;另一種著眼於利用互聯的計算機所共同擁有的計算能力,將一個工作任務分發到多臺計算機上同時處理,通過多臺計算機的相互協作完成單臺計算機所無法完成的工作任務。
         第一種計算形式在過去一直都是使用執行緒來實現的,而在.NET 4.0中,又線上程的基礎上向軟體工程師提供了一個“並行擴充套件(Parallel Extensions)”,從一個更高的抽象層次簡化多執行緒應用程式的開發,這也是本章要介紹的主要內容。
         第二種計算形式依賴於多臺計算機的相互協作,本質上是一種分散式的軟體系統,在.NET平臺上,WCF是開發這型別軟體系統的強大工具。本書第9篇的相關章節將介紹WCF技術。 
19.1 平行計算概述
 
人們在談論到計算機技術的飛速進步時,經常引用美國著名科幻小說作家Bruce Sterling[1]的一段名言:
 
“I used to think that cyberspace was fifty years away. What I thought was fifty years away, was only ten years away. And what I thought was ten years away... it was already here. I just wasn't aware of it yet.” 
 
    譯為中文,這段話的大致含義是:
    “我曾經認為網際空間(cyberspace,指網際網路這個虛擬的空間)至少要有50年才會影響到我們。那些我認為要50年之後才會影響我們的東西,往往只需要10年就成為現實……。而那些我認為10年之後才會影響我們的東西,現在已經在那兒擺著了,而我甚至還沒有意識到它已成為現實!”
         平行計算就是這樣的一個例子,它靜悄悄地走來,卻於靜寞中引發了一場軟體技術的變革,當人們開始意識到平行計算對日常生活的影響時,才突然發現,原來平行計算已無所不在。


--------------------------------------------------------------------------------

[1] http://en.wikipedia.org/wiki/Bruce_Sterling 有對Bruce Sterling本人及其作品的介紹。
  
19.1.1 平行計算是計算的未來
         從積體電路滲透到計算機領域開始,CPU的計算能力一直在持續地增長。其中有一個著名的“摩爾定律”描述了這一發展趨勢。
趣聞軼事:
“摩爾定律”的提出者是Intel公司的創始人之一Gordon E. Moore,1965年他發表了一篇論文,在論文中他針對積體電路技術說過這麼一段話:
       “使用最低成本設計出來的元件其複雜性每年大約增加一倍。可以確信,即便不是有所加快,在短期內這一增長率也會繼續保持。從長遠的觀點來看,這一增長率應該會略有變動。儘管沒有充分的理由來證明,(但我認為)這一增長率至少在未來十年內幾乎維持為一個常數。這意味著到1975年時,以最小的成本製作出來的單個積體電路將擁有65000個元件,而我相信這麼龐大的電路將可以被整合到一塊小小的晶片中”。
       這就是“摩爾定律”的原型。1975年,Gordon E. Moore將修改了“定律”,將其中的“每年”改為“每兩年”。而他的另外一名同事,在“摩爾定律”的基礎上又提出了一個“修訂版”的“摩爾定律”,新版定律指出,每18個月,積體電路的效能將提升一倍。儘管摩爾本人堅持:“我從沒說過積體電路中的元件數量每18個月增加一倍”,但他的聲音很快被淹沒了,“18個月”作為積體電路的“發展週期”,開始以“摩爾定律”廣為人知。
       從1965年至今,雖然期間有許多人都曾說:摩爾定律已不再有效,但事實卻證明這一定律與積體電路技術發展的實際情況相當吻合。到底摩爾定律能用多少年,現在誰也無法下這個結論,還是隻能交給時間。但不管怎樣,從“摩爾定律”上面人們還是能看到電腦科學家那種深邃的洞察力和讓人佩服的預見能力。
對於傳統的(非並行)應用程式,往往會隨著硬體執行速度的提升而執行得更快。舉個例子,許多早期的跑在286/386/486上的一些動作類和射擊類遊戲,如果不作修改地執行於現在的高效能CPU上,其執行速度可能會快到沒有人再能玩這些遊戲了。這就是計算機硬體技術的發展給軟體所帶來的直接好處:程式碼不用或僅略加修改,程式就擁有更快的執行速度。 
         然而,這種免費的午餐是無法永遠提供的,其原因在於CPU速度無法無限提升。因為現有的CPU技術需要受到物理法則的限制:
    當電晶體“瘦身”到很小時,由於控制電流的電晶體門(transistor gate) 以及氧化柵極(gate oxide)距離將非常貼近,因此,將發生電子漂移現象(electrons drift)。如果發生這種情況,電晶體會失去可靠性,原因是電晶體在這種條件下無法有效控制電子的運動,從而難於讓其能維持穩定的“1”或“0”狀態。
         為了能突破這一物理限制而繼續提升CPU的計算能力,CPU走向了另一個條路——多核,將多個CPU處理核心整合為單一的整體,稱其為“多核CPU”。這樣一下,雖然每個CPU處理核心的主頻都沒有提高,但通過將計算任務合理地分配在多個CPU處理核心上執行,我們同樣能達到加快CPU處理效能的目的。
         雙核CPU是第一個得到廣泛應用的產品,當前幾乎所有的新購置的個人電腦都配置了雙核CPU,而Intel宣佈2009年將為桌上型電腦和膝上型電腦生產四核CPU(新四核CPU基於一個代號為“Nehalem”的微架構)。
簡言之: 
    如果不對CPU技術作顛覆性的變革,那麼,基於現有技術架構的CPU已基本走完了“通過提升主頻而獲取更高效能”之路,必須走向多核之路,其特點是:
         (1)每個“核”的主頻都不算高
         (2)在設計CPU架構時,針對並行的工作負載進行了專門優化。
         CPU的“多核”發展趨勢對軟體技術有重大影響。
    因為CPU的多核化要想真正地發揮效益,必須依賴於精心設計的軟體,這種軟體本身必須具備將工作任務劃分為多個可並行執行的子任務的能力,在作業系統(或特定的軟體執行平臺)的支援下,將這些任務分配給計算機所配備的多個CPU處理核心併發執行,並且能夠在這些子任務執行結束後,將這些結果組合起來,得到最終的處理結果。這就是擁有“平行計算”能力的軟體系統。
         開發“平行計算”軟體系統,對軟體工程師提出了新的挑戰,因為開發並行程式要比序列程式難得多。軟體工程師必須轉換思路,在開發新的軟體系統時,從一開始就考慮到平行計算的特點,並對此進行特定的設計,才能充分利用現有硬體基礎設施的強大處理能力,開發出高效能與高可靠性的軟體系統,這是一個軟體技術發展的必然趨勢,也是任何一名軟體工程師們都必須認真面對的挑戰!
19.1.2 平行計算的基本原理
平行計算的基本思想並不複雜,那就是將一個複雜的工作任務進行分解,然後,在多核CPU上同時執行這些分解後的子任務。
 首先,我們先談談多核CPU中的“核”。
1 CPU與“核”
         現在人們常說:最近我買了一臺雙核膝上型電腦。這裡面的“核(core)”指代什麼,它與CPU是什麼關係?還有,人們還常說到“處理器(processor)”,貌似這三個都是指同樣的東西。
         下面我們就來討論一下這些概念的含義,弄清楚它們到底指代什麼。
         學過物理的人都知道,現代計算機是構造於積體電路技術基礎之上,任何一個積體電路,最底層的也是最小的工作單元是一個個的電晶體,多個電晶體構成邏輯模組(logic block),一組邏輯模組進而構成功能單元(functional unit),例如可完成基本算術運算功能的ALU(Arithmetic Logic Unit,算術邏輯單元)就是功能單元的一個例子。
         多個功能單元組合起來,就構成了微處理器(micro-processor),微處理器最廣為人知的名字就是CPU(Central Processing Unit,中央處理單元)。
         最終生產出來的微處理器實際上是一塊物理基片(die),經過封裝之後就叫作處理器(processor)。
         那麼什麼是“核(core)”呢?
         核是微處理器中所有可用的功能單元的集合。
         那些直接參與指令執行的功能單元的集合稱為“執行核(execution core)”。
         很明顯,每個微處理器必定要有一個執行核,否則,它無法執行任何指令,也就不能稱其為微處理器了。

現在就可很清楚“多核”的含義了。所謂多核,其實就是在同一塊物理基片上整合兩個以上的“執行核”,從而使處理器具備並行執行指令的能力。多核CPU,就是指擁有多個執行核的微處理器,基片封裝好之後,就稱為“多核處理器”。
         再區分一下另兩個概念:多處理器與多核處理器系統。
         如前所述,多核處理器系統是指計算機中的處理器中包容了多個執行核,通常這種計算機只包容有一個多核處理器,否則,此係統應歸入“多處理器”系統。
         多處理器系統是指由多個處理器構成的計算機系統,每個處理器自身可以是單核或多核的。
         簡單地說:多處理器系統可以看作是一個主機板上具有多個處理器插槽的計算機系統。
         從應用軟體開發者角度來看,多處理器與多核處理器系統其實是一樣的,可以統一地將其看成是計算機中擁有多個可供使用的CPU。
         下面,我們再來區分一下另外兩個很容易弄混的概念——“併發”與“並行”。
2 併發與並行
         “並行(Parallelism)”是指多個工作任務在擁有多核CPU(或多個單核CPU)的多處理器計算機上同時執行。在這些工作任務執行的過程中,除非有任務提前結束或者延遲啟動,否則,在任一時間點總有兩個以上的工作任務同時執行。
    簡單地說:只要是“同時”執行的,就可以稱之為是“並行”的。
    圖 19‑1展示了並行執行的三個工作任務在三個處理器上同時執行的情形,圖中黑色的長條表示任務的執行過程。

  
“併發(Concurrent)”,指“巨集觀”上計算機可以同時執行多個不相關的工作任務(是“並行”的),但在“微觀”角度來看,這些工作任務並不是始終都在執行,每個工作任務都呈現出“走走停停”這種相互交替的狀態。
         這裡的“巨集觀”,是指從應用程式開發者層次上看的,時間尺度較大,而“微觀”則是指從作業系統的執行緒管理角度和計算機硬體工程師層次上看的,時間尺度很小。
         圖 19‑2展示了3個工作任務在單個處理器上交替執行的情形。

  
圖 19‑2中,可以看到通過輪流使用單個處理器,儘管在任何時刻都只有一個工作任務在執行,但在一個比較長的時間間隔內,所有的工作任務都在“並行”執行中。由此可見,“併發”的好處之一就是使有限的處理器資源可以“並行”執行超過處理器個數的多個工作任務。正是由於“併發”有這樣的好處,所以在作業系統級別,不管計算機本身是單核系統還是多核系統,都是採用微觀上的“併發”來實現巨集觀上的“並行”,絕不允許一個工作任務長時間地獨佔某個處理器直到其執行結束。
         再詳細解釋一下如何利用“併發”實現“並行”。
 
    在單核計算機系統中,作業系統通過“微觀”上讓每個執行緒分時使用處理器實現“巨集觀”上工作任務的“併發”執行(因為工作任務具體是由執行緒負責完成的),而在多核計算機系統中,儘管在物理架構上直接支援“並行”,允許同時執行多個執行緒,但由於大多數情況下負責執行工作任務的執行緒數往往大於可獲取的處理器個數,所以,作業系統仍是使用同樣的分時排程策略為執行緒分配處理器。這時,同一個執行緒有可能在不同的時間段內在不同的處理器上執行。圖 19‑3展示了屬於同一工作任務的多個執行緒在4個處理器上“跳越”執行的情形。

理解“並行”與“併發”的區別,是我們開發 “並行程式”的第一步。


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/bitfan/archive/2009/09/09/4534359.aspx

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617461/,如需轉載,請註明出處,否則將追究法律責任。

相關文章