開篇語:
這是一個(gè)系列文章,系統(tǒng)介紹.NET 4.0中引入的并行擴(kuò)展(包括任務(wù)并行庫TPL和PLINQ)開發(fā)技術(shù)。
本系列文章中所有示例代碼在VS2010 BETA1+Windows 7 RC下調(diào)試通過。所有示例源碼將在本系列文章貼完以后,統(tǒng)一壓縮上傳到CSDN下載頻道。
本系列文章的主要內(nèi)容來自是本人將在電子工業(yè)出版社出版的新作中的一章,出于技術(shù)共享與交流目的發(fā)布,期望業(yè)界對(duì)并行計(jì)算有豐富經(jīng)驗(yàn)的工程師指出疏漏,也希望網(wǎng)友對(duì)提出寶貴建議。
作者金旭亮擁有本系列文章所有版權(quán),未經(jīng)本人許可,不允許將此序列文章及相關(guān)示例用于商業(yè)目的,除此之外,在網(wǎng)絡(luò)上出于知識(shí)共享目的的復(fù)制轉(zhuǎn)貼不受限制。
反饋方式:
在我的本技術(shù)博客上直接回貼
或發(fā)郵件至:
2009.9.9
===================================================
隨著多核
CPU
的普及和互聯(lián)網(wǎng)的迅速發(fā)展,計(jì)算已經(jīng)進(jìn)入并行的時(shí)代,這種并行計(jì)算有兩種主要的形式,一種著眼于充分挖掘單臺(tái)計(jì)算機(jī)的硬件潛力,通常以多線程協(xié)作的方式完成指定的工作任務(wù);另一種著眼于利用互聯(lián)的計(jì)算機(jī)所共同擁有的計(jì)算能力,將一個(gè)工作任務(wù)分發(fā)到多臺(tái)計(jì)算機(jī)上同時(shí)處理,通過多臺(tái)計(jì)算機(jī)的相互協(xié)作完成單臺(tái)計(jì)算機(jī)所無法完成的工作任務(wù)。
第一種計(jì)算形式在過去一直都是使用線程來實(shí)現(xiàn)的,而在
.NET 4.0
中,又在線程的基礎(chǔ)上向軟件工程師提供了一個(gè)“并行擴(kuò)展(
Parallel Extensions
)”,從一個(gè)更高的抽象層次簡(jiǎn)化多線程應(yīng)用程序的開發(fā),這也是本章要介紹的主要內(nèi)容。
第二種計(jì)算形式依賴于多臺(tái)計(jì)算機(jī)的相互協(xié)作,本質(zhì)上是一種分布式的軟件系統(tǒng),在
.NET
平臺(tái)上,
WCF
是開發(fā)這類型軟件系統(tǒng)的強(qiáng)大工具。本書第
9
篇的相關(guān)章節(jié)將介紹
WCF
技術(shù)。
19.1 并行計(jì)算概述
“
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.
”
譯為中文
,
這段話的大致含義是
:
“
我曾經(jīng)認(rèn)為網(wǎng)際空間
(
cyberspace
,
指互聯(lián)網(wǎng)這個(gè)虛擬的空間
)
至少要有
50
年才會(huì)影響到我們。那些我認(rèn)為要50年之后才會(huì)影響我們的東西,往往只需要10年就成為現(xiàn)實(shí)……。而那些我認(rèn)為10年之后才會(huì)影響我們的東西,現(xiàn)在已經(jīng)在那兒擺著了,而我甚至還沒有意識(shí)到它已成為現(xiàn)實(shí)!
”
并行計(jì)算就是這樣的一個(gè)例子,它靜悄悄地走來,卻于靜寞中引發(fā)了一場(chǎng)軟件技術(shù)的變革,當(dāng)人們開始意識(shí)到并行計(jì)算對(duì)日常生活的影響時(shí),才突然發(fā)現(xiàn),原來并行計(jì)算已無所不在。
[1]
http://en.wikipedia.org/wiki/Bruce_Sterling
有對(duì)
Bruce Sterling
本人及其作品的介紹。
19.1.1 并行計(jì)算是計(jì)算的未來
從集成電路滲透到計(jì)算機(jī)領(lǐng)域開始,
CPU
的計(jì)算能力一直在持續(xù)地增長(zhǎng)。其中有一個(gè)著名的“摩爾定律”描述了這一發(fā)展趨勢(shì)。
趣聞?shì)W事:
“摩爾定律”的提出者是
Intel
公司的創(chuàng)始人之一
Gordon E. Moore
,
1965
年他發(fā)表了一篇論文,在論文中他針對(duì)集成電路技術(shù)說過這么一段話:
“使用最低成本設(shè)計(jì)出來的元件其復(fù)雜性每年大約增加一倍。可以確信,即便不是有所加快,在短期內(nèi)這一增長(zhǎng)率也會(huì)繼續(xù)保持。從長(zhǎng)遠(yuǎn)的觀點(diǎn)來看,這一增長(zhǎng)率應(yīng)該會(huì)略有變動(dòng)。盡管沒有充分的理由來證明,(但我認(rèn)為)這一增長(zhǎng)率至少在未來十年內(nèi)幾乎維持為一個(gè)常數(shù)。這意味著到
1975
年時(shí),以最小的成本制作出來的單個(gè)集成電路將擁有
65000
個(gè)元件,而我相信這么龐大的電路將可以被集成到一塊小小的芯片中”。
這就是“摩爾定律”的原型。
1975
年,
Gordon E. Moore
將修改了“定律”,將其中的“每年”改為“每?jī)赡辍薄6牧硗庖幻拢凇澳柖伞钡幕A(chǔ)上又提出了一個(gè)“修訂版”的“摩爾定律”,新版定律指出,每
18
個(gè)月,集成電路的性能將提升一倍。盡管摩爾本人堅(jiān)持:“我從沒說過集成電路中的元件數(shù)量每
18
個(gè)月增加一倍”,但他的聲音很快被淹沒了,“
18
個(gè)月”作為集成電路的“發(fā)展周期”,開始以“摩爾定律”廣為人知。
從
1965
年至今,雖然期間有許多人都曾說:摩爾定律已不再有效,但事實(shí)卻證明這一定律與集成電路技術(shù)發(fā)展的實(shí)際情況相當(dāng)吻合。到底摩爾定律能用多少年,現(xiàn)在誰也無法下這個(gè)結(jié)論,還是只能交給時(shí)間。但不管怎樣,從“摩爾定律”上面人們還是能看到計(jì)算機(jī)科學(xué)家那種深邃的洞察力和讓人佩服的預(yù)見能力。
對(duì)于傳統(tǒng)的(非并行)應(yīng)用程序,往往會(huì)隨著硬件運(yùn)行速度的提升而運(yùn)行得更快。舉個(gè)例子,許多早期的跑在
286/386/486
上的一些動(dòng)作類和射擊類游戲,如果不作修改地運(yùn)行于現(xiàn)在的高性能
CPU
上,其運(yùn)行速度可能會(huì)快到?jīng)]有人再能玩這些游戲了。這就是計(jì)算機(jī)硬件技術(shù)的發(fā)展給軟件所帶來的直接好處:代碼不用或僅略加修改,程序就擁有更快的運(yùn)行速度。
然而,這種免費(fèi)的午餐是無法永遠(yuǎn)提供的,其原因在于
CPU
速度無法無限提升。因?yàn)楝F(xiàn)有的
CPU
技術(shù)需要受到物理法則的限制:
當(dāng)晶體管“瘦身”到很小時(shí),由于控制電流的晶體管門
(transistor gate)
以及氧化柵極
(gate oxide)
距離將非常貼近,因此,將發(fā)生電子漂移現(xiàn)象
(electrons drift)
。如果發(fā)生這種情況,晶體管會(huì)失去可靠性,原因是晶體管在這種條件下無法有效控制電子的運(yùn)動(dòng),從而難于讓其能維持穩(wěn)定的“
1
”或“
0
”狀態(tài)。
為了能突破這一物理限制而繼續(xù)提升
CPU
的計(jì)算能力,
CPU
走向了另一個(gè)條路——多核,將多個(gè)
CPU
處理核心集成為單一的整體,稱其為“多核
CPU
”。這樣一下,雖然每個(gè)
CPU
處理核心的主頻都沒有提高,但通過將計(jì)算任務(wù)合理地分配在多個(gè)
CPU
處理核心上運(yùn)行,我們同樣能達(dá)到加快
CPU
處理性能的目的。
雙核
CPU
是第一個(gè)得到廣泛應(yīng)用的產(chǎn)品,當(dāng)前幾乎所有的新購置的個(gè)人電腦都配置了雙核
CPU
,而
Intel
宣布
2009
年將為臺(tái)式機(jī)和筆記本電腦生產(chǎn)四核
CPU
(新四核
CPU
基于一個(gè)代號(hào)為“
Nehalem
”的微架構(gòu))。
簡(jiǎn)言之:
如果不對(duì)
CPU
技術(shù)作顛覆性的變革,那么,基于現(xiàn)有技術(shù)架構(gòu)的
CPU
已基本走完了
“
通過提升主頻而獲取更高性能
”
之路,必須走向多核之路,其特點(diǎn)是:
(
1
)每個(gè)
“
核
”
的主頻都不算高
(
2
)在設(shè)計(jì)
CPU
架構(gòu)時(shí),針對(duì)并行的工作負(fù)載進(jìn)行了專門優(yōu)化。
CPU
的“多核”發(fā)展趨勢(shì)對(duì)軟件技術(shù)有重大影響。
因?yàn)?
CPU
的多核化要想真正地發(fā)揮效益
,
必須依賴于精心設(shè)計(jì)的軟件,這種軟件本身必須具備將工作任務(wù)劃分為多個(gè)可并行執(zhí)行的子任務(wù)的能力,在操作系統(tǒng)(或特定的軟件運(yùn)行平臺(tái))的支持下,將這些任務(wù)分配給計(jì)算機(jī)所配備的多個(gè)
CPU
處理核心并發(fā)執(zhí)行
,
并且能夠在這些子任務(wù)運(yùn)行結(jié)束后,將這些結(jié)果組合起來,得到最終的處理結(jié)果。這就是擁有“并行計(jì)算”能力的軟件系統(tǒng)。
開發(fā)“并行計(jì)算”軟件系統(tǒng),對(duì)軟件工程師提出了新的挑戰(zhàn),因?yàn)殚_發(fā)并行程序要比串行程序難得多。軟件工程師必須轉(zhuǎn)換思路,在開發(fā)新的軟件系統(tǒng)時(shí),從一開始就考慮到并行計(jì)算的特點(diǎn),并對(duì)此進(jìn)行特定的設(shè)計(jì),才能充分利用現(xiàn)有硬件基礎(chǔ)設(shè)施的強(qiáng)大處理能力,開發(fā)出高性能與高可靠性的軟件系統(tǒng),這是一個(gè)軟件技術(shù)發(fā)展的必然趨勢(shì),也是任何一名軟件工程師們都必須認(rèn)真面對(duì)的挑戰(zhàn)!
19.1.2
并行計(jì)算的基本原理
并行計(jì)算的基本思想并不復(fù)雜,那就是將一個(gè)復(fù)雜的工作任務(wù)進(jìn)行分解,然后,在多核CPU上同時(shí)執(zhí)行這些分解后的子任務(wù)。
首先,我們先談?wù)劧嗪薈PU中的“核”。
首先,我們先談?wù)劧嗪薈PU中的“核”。
1 CPU 與“核”
現(xiàn)在人們常說:最近我買了一臺(tái)
雙核筆記本
電腦
。這里面的“核(
core
)”指代什么,它與
CPU
是什么關(guān)系?還有,人們還常說到“處理器(
processor
)”,貌似這三個(gè)都是指同樣的東西。
下面我們就來討論一下這些概念的含義,弄清楚它們到底指代什么。
學(xué)過物理的人都知道,現(xiàn)代計(jì)算機(jī)是構(gòu)造于集成電路技術(shù)基礎(chǔ)之上,任何一個(gè)集成電路,最底層的也是最小的工作單元是一個(gè)個(gè)的
晶體管
,多個(gè)晶體管構(gòu)成
邏輯模塊
(
logic block
),一組邏輯模塊進(jìn)而構(gòu)成
功能單元
(
functional unit
),例如可完成基本算術(shù)運(yùn)算功能的
ALU
(
Arithmetic Logic Unit
,算術(shù)邏輯單元)就是功能單元的一個(gè)例子。
多個(gè)功能單元組合起來,就構(gòu)成了
微處理器(micro-processor)
,微處理器最廣為人知的名字就是
CPU(
Central Processing Unit,中央處理單元)
。
最終生產(chǎn)出來的微處理器實(shí)際上是一塊物理基片(
die
),經(jīng)過封裝之后就叫作
處理器(
processor
)。
那么什么是“核(
core
)”呢?
核是微處理器中所有可用的功能單元的集合。
那些直接參與指令執(zhí)行的功能單元的集合稱為“
執(zhí)行核(execution core)
”。
很明顯,每個(gè)微處理器必定要有一個(gè)執(zhí)行核,否則,它無法執(zhí)行任何指令,也就不能稱其為微處理器了。
現(xiàn)在就可很清楚“多核”的含義了。所謂多核,其實(shí)就是在同一塊物理基片上集成兩個(gè)以上的“執(zhí)行核”,從而使處理器具備并行執(zhí)行指令的能力。多核
CPU
,就是指擁有多個(gè)執(zhí)行核的微處理器,基片封裝好之后,就稱為“
多核處理器
”。
再區(qū)分一下另兩個(gè)概念:多處理器與多核處理器系統(tǒng)。
如前所述,多核處理器系統(tǒng)是指計(jì)算機(jī)中的處理器中包容了多個(gè)執(zhí)行核,通常這種計(jì)算機(jī)只包容有一個(gè)多核處理器,否則,此系統(tǒng)應(yīng)歸入“多處理器”系統(tǒng)。
多處理器系統(tǒng)是指由多個(gè)處理器構(gòu)成的計(jì)算機(jī)系統(tǒng),每個(gè)處理器自身可以是單核或多核的。
簡(jiǎn)單地說:
多處理器系統(tǒng)可以看作是一個(gè)主板上具有多個(gè)處理器插槽的計(jì)算機(jī)系統(tǒng)。
從應(yīng)用軟件開發(fā)者角度來看,多處理器與多核處理器系統(tǒng)其實(shí)是一樣的,可以統(tǒng)一地將其看成是計(jì)算機(jī)中擁有多個(gè)可供使用的
CPU
。
下面,我們?cè)賮韰^(qū)分一下另外兩個(gè)很容易弄混的概念——“并發(fā)”與“并行”。
2 并發(fā)與并行
“
并行(Parallelism)
”是指多個(gè)工作任務(wù)在擁有多核
CPU
(或多個(gè)單核
CPU
)的多處理器計(jì)算機(jī)上同時(shí)執(zhí)行。在這些工作任務(wù)運(yùn)行的過程中,除非有任務(wù)提前結(jié)束或者延遲啟動(dòng),否則,在任一時(shí)間點(diǎn)總有兩個(gè)以上的工作任務(wù)同時(shí)運(yùn)行。
簡(jiǎn)單地說:
只要是“同時(shí)”運(yùn)行的,就可以稱之為是“并行”的。
圖
19
?
1
展示了并行執(zhí)行的三個(gè)工作任務(wù)在三個(gè)處理器上同時(shí)運(yùn)行的情形,圖中
黑色的長(zhǎng)條表示任務(wù)的執(zhí)行過程。
“
并發(fā)(
Concurrent
)
”,指“宏觀”上計(jì)算機(jī)可以同時(shí)執(zhí)行多個(gè)不相關(guān)的工作任務(wù)(是“并行”的),但在“微觀”角度來看,這些工作任務(wù)并不是始終都在運(yùn)行,每個(gè)工作任務(wù)都呈現(xiàn)出“走走停停”這種相互交替的狀態(tài)。
這里的“宏觀”,是指從應(yīng)用程序開發(fā)者層次上看的,時(shí)間尺度較大,而“微觀”則是指從操作系統(tǒng)的線程管理角度和計(jì)算機(jī)硬件工程師層次上看的,時(shí)間尺度很小。
圖
19
?
2
展示了
3
個(gè)工作任務(wù)在單個(gè)處理器上交替執(zhí)行的情形。
圖
19
?
2
中,可以看到通過輪流使用單個(gè)處理器,盡管在任何時(shí)刻都只有一個(gè)工作任務(wù)在運(yùn)行,但在一個(gè)比較長(zhǎng)的時(shí)間間隔內(nèi),所有的工作任務(wù)都在“并行”運(yùn)行中。由此可見,
“并發(fā)”的好處之一就是使有限的處理器資源可以“并行”運(yùn)行超過處理器個(gè)數(shù)的多個(gè)工作任務(wù)。
正是由于“并發(fā)”有這樣的好處,所以在操作系統(tǒng)級(jí)別,不管計(jì)算機(jī)本身是單核系統(tǒng)還是多核系統(tǒng),都是采用微觀上的“并發(fā)”來實(shí)現(xiàn)宏觀上的“并行”,絕不允許一個(gè)工作任務(wù)長(zhǎng)時(shí)間地獨(dú)占某個(gè)處理器直到其運(yùn)行結(jié)束。
再詳細(xì)解釋一下如何利用“并發(fā)”實(shí)現(xiàn)“并行”。
在單核計(jì)算機(jī)系統(tǒng)中,操作系統(tǒng)通過“微觀”上讓每個(gè)線程分時(shí)使用處理器實(shí)現(xiàn)“宏觀”上工作任務(wù)的“并發(fā)”執(zhí)行(因?yàn)楣ぷ魅蝿?wù)具體是由線程負(fù)責(zé)完成的),而在多核計(jì)算機(jī)系統(tǒng)中,盡管在物理架構(gòu)上直接支持“并行”,允許同時(shí)運(yùn)行多個(gè)線程,但由于大多數(shù)情況下負(fù)責(zé)執(zhí)行工作任務(wù)的線程數(shù)往往大于可獲取的處理器個(gè)數(shù),所以,操作系統(tǒng)仍是使用同樣的分時(shí)調(diào)度策略為線程分配處理器。這時(shí),同一個(gè)線程有可能在不同的時(shí)間段內(nèi)在不同的處理器上運(yùn)行。
圖
19
?
3
展示了屬于同一工作任務(wù)的多個(gè)線程在
4
個(gè)處理器上“跳越”執(zhí)行的情形。
理解“并行”與“并發(fā)”的區(qū)別,是我們開發(fā)
“并行程序”的第一步。
請(qǐng)看《
.NET4.0并行計(jì)算技術(shù)基礎(chǔ)(2)
》
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
