国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

免費(fèi)午餐已經(jīng)結(jié)束——軟件向并發(fā)靠攏

2019-11-17 04:43:14
字體:
供稿:網(wǎng)友

  免費(fèi)大餐不久就將結(jié)束。對(duì)此,你有何打算,做好下一步預(yù)備了么?  對(duì)主要的處理器廠商以及架構(gòu),包括Intel、AMD和Sparc、PowerPC[譯注1]來說,改善CPU性能的傳統(tǒng)方法,如提升時(shí)鐘速度和指令吞吐量,基本已走到盡頭,現(xiàn)在開始向超線程和多核架構(gòu)靠攏。而且這兩個(gè)特性(非凡是多核)已經(jīng)在部分芯片實(shí)現(xiàn),如PowerPC和Sparc IV;Intel和AMD也將在2005年內(nèi)趕上。2004年In-Stat/MDR秋季處理器論壇[譯注2]的主題就是多核設(shè)備,很多公司都展示了改進(jìn)和新研發(fā)的多核處理器。不過,要將2004年稱為多核年,顯然還不夠理直氣壯。  多核將引領(lǐng)軟件研發(fā)發(fā)生基礎(chǔ)性變化,非凡對(duì)接下來幾年里那些面向一般應(yīng)用、運(yùn)行在PC和低端服務(wù)器上的應(yīng)用軟件(在今天已經(jīng)銷售出去的軟件里占有很大比例)而言。在這篇文章里,我想就多核為何忽然對(duì)軟件產(chǎn)生重要影響,以及并發(fā)巨變?nèi)绾斡绊懳覀兒臀覀兾磥砭帉戃浖绞降膯栴}展開討論?! ∥铱梢赃@么說:免費(fèi)大餐已經(jīng)結(jié)束一兩年了,但我們現(xiàn)在才開始意識(shí)到這個(gè)問題?! ?STRONG>免費(fèi)的性能大餐  業(yè)界存在一個(gè)有趣的現(xiàn)象:“安迪送,比爾取?!盵譯注3]無論處理器性能提升多少,軟件都有辦法迅速吞噬。CPU速度十倍于前,軟件就有十倍于前的活要干(或者肆無忌憚猛增軟件的工作量,導(dǎo)致性能下降)。在過去幾十年里,由于CPU、內(nèi)存和硬盤非凡是CPU廠商強(qiáng)力推進(jìn)主流系統(tǒng)向更新更快的方向發(fā)展,大多數(shù)軟件不做版本升級(jí),甚至原封不動(dòng),就可輕松而持續(xù)地享受處理器性能提升的成果。盡管時(shí)鐘速度不是衡量系統(tǒng)性能的唯一和最好的標(biāo)尺,但其重要意義不容忽視。我們見證了CPU的發(fā)展歷史:從500MHz到1GHz,然后再到2GHz,不斷提高。今天,主流計(jì)算機(jī)已經(jīng)進(jìn)入3GHz時(shí)代?! 〔贿^,有一個(gè)很要害的問題:這種提升模式什么時(shí)候會(huì)走到盡頭?盡管莫爾定律預(yù)言了歷史上的指數(shù)式增長,但我們很清楚指數(shù)式增長不可能永遠(yuǎn)維持,因?yàn)橛布烤故芪锢順O限約束;光速是不可能更快的[譯注4]。所以增長必然放緩,最后停滯。順便說明一點(diǎn),莫爾定律的主要描述對(duì)象是晶體管集成密度,但在一些相關(guān)的領(lǐng)域,如時(shí)鐘速度方面,也出現(xiàn)了類似的指數(shù)式增長;甚至在別的領(lǐng)域有更快的增長速度,例如聞名的數(shù)據(jù)存儲(chǔ)量爆炸。不過這些重要趨勢(shì)需要另一篇文章來分析了。  假如你是一個(gè)軟件開發(fā)人員,那么你可能一直在免費(fèi)享受桌面計(jì)算機(jī)性能提升的大餐。某些操作會(huì)成為應(yīng)用程序性能的瓶頸?“你過慮了”,我們對(duì)這樣的回答耳熟能詳,“未來處理器將更為強(qiáng)勁,而現(xiàn)在的應(yīng)用程序速度倒是日益被非CPU吞吐量和內(nèi)存速度因素扼殺,比如I/O、網(wǎng)絡(luò)和數(shù)據(jù)庫等等?!闭娴氖沁@樣么?  要在過去,這的確沒錯(cuò)。但在以后,就完全不對(duì)了?! ∥矣袃蓚€(gè)消息要告訴大家。第一個(gè)是好消息,處理器性能仍然會(huì)不斷提高。第二個(gè)則是壞消息,至少在短時(shí)間內(nèi),處理器性能的提升,不再能像以往那樣讓現(xiàn)在的應(yīng)用程序繼續(xù)免費(fèi)獲益?! ∵^去30年里,CPU設(shè)計(jì)者主要從三個(gè)方面提高CPU性能,頭兩個(gè)就是從線性執(zhí)行流程上考慮的:  1、時(shí)鐘速度  2、執(zhí)行優(yōu)化  3、緩存  提升時(shí)鐘速度將增大單位時(shí)間的時(shí)鐘周期數(shù)。讓CPU跑得更快,就意味著能讓同樣工作或多或少更快完成?! ?yōu)化指令執(zhí)行,可以在每個(gè)時(shí)鐘周期內(nèi)完成更多工作。目前的CPU中,一些指令被不同程度地做了優(yōu)化,如管線、分支猜測(cè)、同一時(shí)鐘周期內(nèi)執(zhí)行更多指令,甚至指令流再排序支持亂序執(zhí)行等[譯注5]。引入這些技術(shù)的目的是讓指令流更好、更快執(zhí)行,降低延遲時(shí)間,挖掘每一時(shí)鐘周期內(nèi)芯片的工作潛能。  在這里,有必要對(duì)指令再排序作個(gè)簡單說明。我剛才提到的部分指令優(yōu)化手段,其實(shí)已遠(yuǎn)非普通意義上的優(yōu)化。這些優(yōu)化可能改變程序原意,造成程序不響應(yīng)程序員的正常要求。這可是個(gè)大問題。CPU設(shè)計(jì)師都是心智健全且經(jīng)過嚴(yán)格練習(xí)的好同志,正常情況下,他們連蒼蠅都不愿?jìng)?,自然也無意破壞你的程序。而在最近幾年里,盡管知道指令重組有破壞程序語義的風(fēng)險(xiǎn),但為了提升每個(gè)時(shí)鐘周期內(nèi)的工作效率,他們已經(jīng)習(xí)慣于積極開展這類有風(fēng)險(xiǎn)的優(yōu)化工作。難道海德先生[譯注6]復(fù)活了?當(dāng)然不是。這種積極性清楚表明,芯片設(shè)計(jì)師承受了交付速度更快CPU的巨大壓力;在這種壓力下,為了讓軟件跑得更快,他們不得不冒改變程序意思,甚至應(yīng)用崩潰的風(fēng)險(xiǎn)。拿兩個(gè)有名的例子來說——寫操作再排序和讀操作再排序[譯注7]。答應(yīng)處理器對(duì)寫操作再排序是非常令人吃驚的,讓大多數(shù)程序員意外,一般來說這個(gè)特性必須關(guān)閉,因?yàn)樵趯懖僮鞅惶幚砥魑鋽嗟卦倥判驐l件下,程序員很難保證程序正確執(zhí)行。讀操作再排序也有明顯的問題,但大多數(shù)情況下這個(gè)特性是開啟的;因?yàn)橄鄬?duì)來說它更輕易把握一些,而且人們對(duì)性能的要求,讓操作系統(tǒng)和操作環(huán)境設(shè)計(jì)師只能選擇讓程序員在一定程度吃點(diǎn)苦頭,究竟,這比直接放棄性能優(yōu)化機(jī)會(huì)的罪責(zé)小一些。  第三個(gè)是增大與RAM分離的片內(nèi)高速緩存。RAM一直比CPU慢很多,因此讓數(shù)據(jù)近可能靠近處理器就很重要——當(dāng)然那就是片內(nèi)了[譯注8]。片內(nèi)緩存持續(xù)飚升了很多年,現(xiàn)在的主流芯片商出售的CPU都帶有2M甚至更高的二級(jí)緩存。值得一提的是,今后,三種提升CPU性能的傳統(tǒng)手段里,增加緩存將碩果僅存。我會(huì)在后面更具體說明緩存的重要性?! ∥覍戇@么多的意思是什么呢?  最重要的是我們必須熟悉到,傳統(tǒng)性能提升方法與并發(fā)沒有直接關(guān)系。過去任何方法帶來的速度提升,無論是順序(非并行的單線程或單進(jìn)程)、還是并發(fā)執(zhí)行的程序,都能直接受益。這點(diǎn)很重要,我們目前大量的程序都是單線程的,而且在未來仍然有重要的存在價(jià)值?! ‘?dāng)然,適當(dāng)時(shí)候,我們重新編譯程序,可以利用CPU的新指令(如MMX、SSE[譯注9])和新特性提升系統(tǒng)性能。但總的來說,即使放棄使用新指令和新特性,不做任何更改,老程序在新CPU也會(huì)跑得更快,讓人心花怒放。
  曾經(jīng)的世界是這般美好,可如今,她就要變了顏色。  為什么我們今天沒有10GHz芯片  免費(fèi)午餐已經(jīng)結(jié)束——軟件向并發(fā)靠攏(圖一)  其實(shí),CPU性能提升在兩年前就開始碰壁,但大多數(shù)人到了最近才有所覺察。  我這里有份來自Intel的數(shù)據(jù)(當(dāng)然你可以從其他廠商得到類似數(shù)據(jù))。圖中反映了Intel芯片的時(shí)鐘速度和晶體管集成規(guī)模演變歷史。晶體管集成數(shù)至少就目前而言仍在繼續(xù)上升,但時(shí)鐘速度的情況就不同了?! ∥覀儚膱D中可以看到,大概在2003年初,一路高歌猛進(jìn)的CPU時(shí)鐘速度忽然急剎車。受制于一些物理學(xué)問題,如散熱(發(fā)熱量太大且難以驅(qū)散)、功耗(太高)以及泄漏問題[譯注10]等,時(shí)鐘速度的提升已經(jīng)越來越難?! ∧隳壳霸诠ぷ髡旧嫌玫腃PU時(shí)鐘速度是多少?10GHz么? 2001年8月Intel芯片就達(dá)到2GHz,按照2003年前的CPU發(fā)展趨勢(shì)推算,到2005年初,我們就能擁有第一塊10GHz的Pentium芯片。但實(shí)際上沒辦到。而且情況似乎越來越糟——我們根本就不知道到底在什么時(shí)候這樣的芯片可以出現(xiàn)?! ∧敲捶诺推谕?,4GHz又如何呢?目前我們已到3.4GHz——那么4GHz已經(jīng)不遠(yuǎn)了吧?唉,似乎4GHz也遙不可及。可能你知道,Intel首先于2004年中將4GHz芯片的發(fā)布時(shí)間推遲到2005年,而到了2004年秋季,則徹底取消了4GHz計(jì)劃[譯注11]。在本文寫作的同時(shí),Intel公布計(jì)劃到2005年早期,實(shí)現(xiàn)到3.73GHz(即圖中的右上最高處)的微量提升。所以,至少就目前來說,時(shí)鐘速度的競(jìng)賽實(shí)際上結(jié)束了,Intel和其他大多數(shù)處理器廠商將把旺盛的精力投入到多核等方向去?! ∫苍S,我們某天在主流PC里能裝上4GHz的CPU,但2005年別想。Intel實(shí)驗(yàn)室里的確已經(jīng)有運(yùn)行在更高速度的芯片——不過代價(jià)是驚人的,比如龐大數(shù)量的冷卻裝置。你想不久在你的辦公室里就有這樣的冷卻設(shè)備,坐飛機(jī)的時(shí)候,就把它們放在你膝蓋上?別做夢(mèng)了! 莫爾定律與新一代處理器  “沒有免費(fèi)的午餐。”——摘自R. A. Heinlein的小說《The Moon Is a Harsh Mistress》。  莫爾定律玩完了?這個(gè)問題很有趣,嚴(yán)格地講,還不能這么說。盡管和所有的指數(shù)式增長方式一樣,莫爾定律總有一天會(huì)走到盡頭,但最近這些年,還沒有這樣的危險(xiǎn)。芯片工程師在榨取時(shí)鐘周期內(nèi)剩余價(jià)值時(shí)的確碰了壁,不過晶體管集成量仍在暴漲,所以從這個(gè)角度說,CPU近期仍將遵循莫爾定律,系統(tǒng)吞吐量繼續(xù)提高?! ∫Φ淖兓?,即本文的中心,是今后幾代處理器性能提升所走的道路將完全不同。同時(shí),大多數(shù)現(xiàn)在的應(yīng)用軟件將不再可能不作大規(guī)模重構(gòu),就能像過去那樣從處理器免費(fèi)獲益?! 〗酉聛頂?shù)年里,新型芯片的性能提升將主要從三個(gè)方面入手,其中僅有一個(gè)沿襲是過去的:  1、超線程
  2、多核  3、緩存  超線程,是指在單個(gè)CPU內(nèi),并行兩個(gè)或多個(gè)線程。超線程CPU已經(jīng)發(fā)布了,支持并行執(zhí)行一些指令。不過這種CPU還是存在短板,雖然給它增加了部分硬件如寄存器,但它和絕大多數(shù)普通CPU一樣,緩存、整數(shù)和浮點(diǎn)運(yùn)算器仍然是唯一的。有資料表明,寫得較好的多線程應(yīng)用,在超線程CPU上能獲得5%-15%的性能提升;假設(shè)趨于理想狀態(tài),即多線程程序?qū)懙煤玫綐O點(diǎn),那么性能可以提高40%。不錯(cuò)了,不過還是做不到成倍提升,而且對(duì)單線程應(yīng)用毫無幫助?! 《嗪?,主要是指在一塊芯片上運(yùn)行兩個(gè)或多個(gè)處理器。部分芯片如Sparc和PowerPC目前已經(jīng)推出了多核版本。Intel和AMD也計(jì)劃在2005年內(nèi)初步實(shí)現(xiàn),具體時(shí)間取決于它們的系統(tǒng)集成水平,功能則是一樣的。AMD初期在性能設(shè)計(jì)可能更具優(yōu)勢(shì),如更好的支持功能單片內(nèi)集成,而Intel基本上就打算將兩顆Xeon膠合在一塊片子上了事。所以剛開始的時(shí)候,這種雙核芯片與一個(gè)真正的雙CPU系統(tǒng)在性能幾乎沒有差別,僅僅在價(jià)格上前者更為便宜,究竟它的主板上不需要兩個(gè)插槽和額外膠合件;另外,即便理想狀態(tài),這種架構(gòu)也無法達(dá)到雙倍速度,且無益于單線程應(yīng)用,而只有寫得較好的多線程應(yīng)用能得到好處?! ∽詈笠粋€(gè)是片內(nèi)緩存,還能像預(yù)期那樣在近期繼續(xù)上升。三個(gè)方法中,僅有這個(gè)可以讓現(xiàn)有應(yīng)用全面受益。片內(nèi)緩存有令人難以置信的重要性和對(duì)大多數(shù)現(xiàn)有應(yīng)用的超高價(jià)值,原因很簡單,那就是“空間就是速度”。CPU和主存交互的代價(jià)是巨大的,假如能避免,那就盡量不要和它打交道。在目前的系統(tǒng)里,從主存獲取數(shù)據(jù)所花時(shí)間,通常是從緩存獲得數(shù)據(jù)的10到50倍。很讓人吃驚吧,因?yàn)楹芏嗳硕家詾閮?nèi)存已經(jīng)足夠快。其實(shí)這不過是與硬盤和網(wǎng)絡(luò)相比,而不是運(yùn)行在更高速度的片內(nèi)緩存。應(yīng)用程序的工作與緩存間的適配程度,和我們是榮辱與共的。很多年來,不重構(gòu)程序,僅僅提高緩存大小就拯救了現(xiàn)有應(yīng)用,給它們帶來新生。軟件操縱的數(shù)據(jù)和為新增功能而加入的代碼越來越多,性能敏感的操作必須繼續(xù)與緩存適配。套用經(jīng)濟(jì)大蕭條時(shí)期老人常念叨的一句話:“緩存為王?!薄 №槑дf件發(fā)生在我的編譯器小組的趣事,算是“空間就是速度”的一個(gè)佐證。32位和64位編譯器將同樣的代碼分別編譯成32位和64位程序。64位CPU有多得多的寄存器和其他代碼優(yōu)化特性,因此運(yùn)行其上的64位編譯器先天的獲得極大性能提升。這當(dāng)然很好。而數(shù)據(jù)的情況又如何呢?換到64位平臺(tái)上,內(nèi)存中絕大部分?jǐn)?shù)據(jù)的大小并未發(fā)生變化,唯一例外的就是指針,指針占用了兩倍于以前的空間。因此,我們的編譯器和絕大多數(shù)32位應(yīng)用相比,揮舞指針就費(fèi)力得多?,F(xiàn)在的指針耗用8個(gè)而不是4個(gè)字節(jié),空間凈增加,結(jié)果我們發(fā)現(xiàn)64位編譯器的工作集[譯注12]大小顯著增加。工作集增大導(dǎo)致性能下降,差不多抵消了更快的CPU和更多寄存器帶來的性能優(yōu)勢(shì)。就在我寫這篇文章的時(shí)候,64和32位編譯器正以同樣的速度運(yùn)行,盡管程序代碼完全一樣而且64位處理器先天能力更強(qiáng)。這就是“空間就是速度”。  緩存能,但超線程和多核CPU對(duì)現(xiàn)在的絕大多數(shù)應(yīng)用,幾乎不會(huì)有任何影響?! 【C上所述,硬件的變化到底會(huì)給軟件開發(fā)方式帶來怎樣的影響呢?你可能已經(jīng)有了初步答案了。讓我們更深入研究,明白其厲害所在?! ?STRONG>對(duì)軟件來說,這意味一次巨變  上世紀(jì)90年代初,我們開始學(xué)著理解對(duì)象。在主流軟件開發(fā)領(lǐng)域里,從結(jié)構(gòu)化到面向?qū)ο缶幊淌沁^去20甚至可以說30年來最重要的變革。這期間也發(fā)生了其他一些變化,例如近來誕生的的確讓人著迷的WebServices,但我們中絕大多數(shù)人在職業(yè)生涯里從未有過見識(shí)像面向?qū)ο竽菢踊A(chǔ)而深刻改變軟件開發(fā)方式的機(jī)會(huì)?! ‖F(xiàn)在,機(jī)會(huì)來了?! ∫矎默F(xiàn)在開始,性能大餐就不再免費(fèi)了。雖然托緩存增大的福,我們還能在半路上撿到普通的性能提升丸,但假如你希望你的應(yīng)用程序在新的處理器里能繼續(xù)獲得爆炸性的性能提升,那就需要你好好編寫并發(fā)程序了(通常是多線程的)。說比做輕易啊,也不是所有問題都天生可以通過并行解決,而且并發(fā)編程的難度也是很大的。  肯定有人嚷嚷開了:“并發(fā)?并不是什么新鮮玩意嘛!人們不早就在寫這樣的程序了么?”是的,小部分程序員的確寫過?! e忘了,至少從上世紀(jì)60年代晚期的Simula開始,人們就在寫面向?qū)ο蟪绦?。但到?0年代,面向?qū)ο蟛懦晒Πl(fā)動(dòng)革命并奪取統(tǒng)治地位。為什么呢?工業(yè)是受現(xiàn)實(shí)需求驅(qū)動(dòng)的,為了解決越來越大的問題,必須編寫越來越大的系統(tǒng),這樣的系統(tǒng)需要越來越強(qiáng)勁的CPU和存儲(chǔ)設(shè)備支持,硬件系統(tǒng)也恰逢其時(shí)地逐步提供了這樣的支持。面向?qū)ο缶幊躺瞄L抽象和依靠治理,所以成為了開發(fā)經(jīng)濟(jì)、可靠和可重用的大型軟件的必備利器。  并發(fā)編程差不多也有同樣漫長的歷史可以追溯,很早的時(shí)候,我們就開始編寫協(xié)程、管程[譯注13]以及其他與并發(fā)有關(guān)的東西。近10年來,我們也發(fā)現(xiàn)有越來越多的程序員在編寫并發(fā)應(yīng)用(有多線程的,也有多進(jìn)程的)系統(tǒng)。但是發(fā)生整體轉(zhuǎn)向性的巨變,目前還不具備條件,需假以時(shí)日。現(xiàn)有大量的單線程應(yīng)用,仍然有巨大的存在價(jià)值,這點(diǎn)我會(huì)在后面說明?! ≌f點(diǎn)題外話,當(dāng)前“下一次軟件開發(fā)革命”這樣的詞語多如牛毛,讓大家眼花繚亂,其實(shí)這是商家宣傳自己新技術(shù)所作的廣告,不要理睬它。新技術(shù)通常都很吸引人,有時(shí)候也很有用,但軟件開發(fā)方式的重大變革必然來源于在真正得到爆發(fā)式廣泛應(yīng)用前就存在并經(jīng)過多年緩慢成長、先進(jìn)而穩(wěn)定的技術(shù)。這個(gè)過程是繞不掉的。變革所依靠的基礎(chǔ)技術(shù)必須足夠成熟(包括有固定的廠商和工具支持);通常,這個(gè)成熟穩(wěn)定過程至少要花費(fèi)7年的時(shí)間,新技術(shù)在廣泛應(yīng)用時(shí)才不會(huì)有潛在的性能懸崖和陷阱。所以,像面向?qū)ο筮@樣的軟件開發(fā)變革,也必須在各項(xiàng)技術(shù)經(jīng)過多年甚至幾十年磨礪后才能發(fā)生。即便在好萊塢,絕大多數(shù)的一夜成名,也仍然是多年努力后發(fā)生重大突破的表面象征?! 〔l(fā)將是軟件開發(fā)史上的又一個(gè)重大變革。很多專家仍然在這個(gè)變革是否比面向?qū)ο筮€大的問題上爭論不休。這樣的爭論最好還是留給學(xué)問家吧。技術(shù)工作者最感愛好的是和面向?qū)ο笠粯?,編程方式的變化程度、編程技術(shù)的復(fù)雜性和學(xué)習(xí)曲線問題?! ?STRONG>并發(fā)之正反二面
  并發(fā)技術(shù)(非凡是多線程)在主流軟件里大多應(yīng)用在兩個(gè)方面。第一類是天然就彼此獨(dú)立的、邏輯上分離的控制流程,比如在我設(shè)計(jì)的數(shù)據(jù)庫復(fù)制服務(wù)器里,每個(gè)復(fù)制session都放在各自的線程里,彼此完全獨(dú)立的,不會(huì)工作于同一條數(shù)據(jù)記錄上。第二類不像第一類那么常見。為了系統(tǒng)提升性能,像利用多CPU平臺(tái)的能力,挖掘應(yīng)用程序其他部分的潛能等,我們也會(huì)編寫并發(fā)代碼。在我的數(shù)據(jù)庫復(fù)制服務(wù)器里,多個(gè)獨(dú)立的線程在多CPU平臺(tái)上就工作得很好。  然而,并發(fā)編程也是要付出代價(jià)的。一些很明顯的問題相對(duì)來說無關(guān)緊要,比如鎖定。對(duì)資源的鎖定降低了系統(tǒng)的性能,但假如你能找到辦法最小化甚至消除資源共享,讓操作真正并行,從而明智得當(dāng)?shù)厥褂面i,那么從并發(fā)執(zhí)行得到的收益,要遠(yuǎn)大于在同步上蒙受的損失?! 「匾膯栴},大概就是并非所有應(yīng)用都適用并行。這點(diǎn)我會(huì)在后面說明?! ?yīng)該說,最大的問題,就是并發(fā)編程本身的難度了。程序員必須將腦子里的編程模型轉(zhuǎn)化為可靠的程序,這比實(shí)現(xiàn)順序執(zhí)行的傳統(tǒng)程序難得多?! ∪魏螌W(xué)習(xí)過并發(fā)的人都認(rèn)為自己已經(jīng)理解并發(fā),早早結(jié)束尋找他們認(rèn)為不可能但實(shí)際潛在的競(jìng)爭沖突和他們其實(shí)仍沒鬧明白的問題。假如開發(fā)人員認(rèn)真學(xué)習(xí)和思考并發(fā)編程,就會(huì)發(fā)現(xiàn)通過合理組織的內(nèi)部測(cè)試能發(fā)現(xiàn)大多數(shù)的競(jìng)爭沖突問題,這個(gè)時(shí)候,無論是在知識(shí)水平還是心情愉悅度上,他們都能達(dá)到一個(gè)新的高度。不過,除了經(jīng)過理解為什么和怎么進(jìn)行真正壓力測(cè)試的行家測(cè)試過的、已經(jīng)正式發(fā)布的軟件,都會(huì)存在部分在普通測(cè)試中無法捕捉的潛伏并發(fā)問題。這些問題只有在真正的多處理器系統(tǒng)上才會(huì)暴露出來,因?yàn)樵谶@樣的環(huán)境里,多個(gè)線程不是在單處理器上切換,而是真正的并發(fā)運(yùn)行,大量新問題就會(huì)涌現(xiàn)。而偏偏又有很多人自以為已經(jīng)真正理解如何編寫并發(fā)程序,真是讓人忐忑不安啊。我見過不少項(xiàng)目組,他們的程序在很多用戶那里即便施以極端苛刻的壓力測(cè)試,都能出色工作,但某天一個(gè)用戶部署了真正的多處理器機(jī)器后,深層次的競(jìng)爭沖突甚至程序崩潰問題馬上出現(xiàn)。CPU發(fā)展到今天,重構(gòu)你的應(yīng)用,讓它們多線程運(yùn)行在真正的多核計(jì)算機(jī)上,的確像逼迫初學(xué)游泳的人一下子跳入深水——直達(dá)終點(diǎn),似乎有點(diǎn)殘忍,但只有真正并行的環(huán)境,才能更輕易暴露出你的問題。再說了,即使你組織了一個(gè)能真正編寫可靠并行代碼的團(tuán)隊(duì),也不能說就不會(huì)出現(xiàn)問題。例如,并發(fā)代碼運(yùn)行可能非常安全,但(在多核的機(jī)子上)卻不比在單核的機(jī)子上跑得快。其典型原因就是線程未被合理分離,共享了單一資源,造成程序執(zhí)行順序化。這類問題是相當(dāng)微妙而復(fù)雜的?! 〗Y(jié)構(gòu)化程序員學(xué)習(xí)面向?qū)ο?什么是對(duì)象?什么是虛函數(shù)?我如何使用繼續(xù)?知道“是什么”和“怎么辦”外,還得問一句:“如何保證理論上正確的設(shè)計(jì)在實(shí)踐中的正確性?”)是一個(gè)飛躍,同樣的,順序思維的程序員學(xué)習(xí)并發(fā)(什么是競(jìng)爭沖突?什么是死鎖?它是怎么出現(xiàn)的,我如何避免它?什么樣的構(gòu)造在我看來是并行的但實(shí)際上順序化了程序?在“是什么”和“怎么辦”外,還要回答同樣的問題:“如何保證理論上正確的設(shè)計(jì)在實(shí)踐中的正確性?”)也是一個(gè)飛躍?! ‖F(xiàn)在的大量程序員并沒有真正理解并發(fā),就像15年前大量程序員沒有真正理解對(duì)象一樣。但并發(fā)編程模式是可以學(xué)習(xí)的,尤其是我們要堅(jiān)持基于消息和鎖的編程;一旦真正理解了并發(fā),就會(huì)發(fā)現(xiàn)它并不比面向?qū)ο箅y多少,很輕易覺得那是自然而然的。我們需要為我們自己和我們的團(tuán)隊(duì)做好練習(xí)投資和時(shí)間的預(yù)備?! ∮斜匾f明一點(diǎn),我在上面故意將并發(fā)編程模式限定在消息和鎖基礎(chǔ)上。其實(shí)也有在語言級(jí)就直接支持的無鎖編程,比如java5和很流行的C++編譯器。但對(duì)于程序員來說,無鎖比有鎖并發(fā)編程難得多。大多數(shù)情況下,只需要系統(tǒng)和庫編寫者理解無鎖編程就行了,雖然事實(shí)上每個(gè)人都可以從無鎖系統(tǒng)和庫獲益。老實(shí)說,即便有鎖編程,也有點(diǎn)碰運(yùn)氣的味道呢。對(duì)我們來說這到底意味著什么  好了,回到正題,將問題歸納一下。  1、我們已經(jīng)討論清楚的、最重要結(jié)論是:假如應(yīng)用程序想充分利用CPU吞吐增加量,那它們就必然日益需要并發(fā),這種形勢(shì)逐漸明朗,并將在接下來的數(shù)年里深入發(fā)展。Intel已經(jīng)揚(yáng)言未來他們會(huì)推出集成100顆內(nèi)核的芯片,那么單線程應(yīng)用最多就只能利用這種芯片1/100的潛在生產(chǎn)力。“哦,性能沒那么重要吧,計(jì)算機(jī)總是跑得越來越快”的論調(diào)已經(jīng)變得天真而可疑,甚至在未來不久將完全錯(cuò)誤?! ∧壳埃⒉皇撬械膽?yīng)用都需要(或者更準(zhǔn)確的說,只有應(yīng)用中重要的作業(yè)才需要)并行。像編譯這類的問題,是必須要考慮并行的,而其他則不一定。請(qǐng)看這個(gè)有趣的例子:一個(gè)女人需要九個(gè)月才能生產(chǎn)一個(gè)小孩,并不代表九個(gè)女人能花一個(gè)月生出一個(gè)孩子。你以前可能接觸過類似的推導(dǎo),但有沒有感覺這個(gè)問題意猶未盡呢?假如有人再和你就此討論,我向你推薦一個(gè)刁鉆的問題:從這個(gè)命題你能斷定“女人-小孩”是一個(gè)非并行問題么?通常,人們會(huì)下意識(shí)地認(rèn)為它天然就不是一個(gè)并行問題,但實(shí)際上并不完全是這樣。假如目的是生一個(gè)小孩,它的確是一個(gè)非并行問題;但假如是生產(chǎn)多個(gè)小孩,那么它就是一個(gè)標(biāo)準(zhǔn)的并行問題了!所以說,目標(biāo)不同,結(jié)論就大相徑庭。在考慮你的軟件是否和如何使用并行時(shí),千萬別忘了面向目標(biāo)原則。  2、可能不那么明顯的結(jié)論是:CPU將很可能日益成為應(yīng)用程序性能的瓶頸。當(dāng)然,不是所有應(yīng)用都會(huì)這樣,目前還未明顯受制于CPU能力的應(yīng)用在未來雖然可能受到CPU影響,CPU也不會(huì)一夜之間成為它們的鐐銬。但“I/O、網(wǎng)絡(luò)和數(shù)據(jù)庫瓶頸”似乎快走到谷底,因?yàn)樵谶@些領(lǐng)域,條件仍在迅速改善(如GB級(jí)WiFi網(wǎng)絡(luò)等等);而與此形成對(duì)比的是,CPU性能提升技術(shù)已走到峰點(diǎn)。請(qǐng)注重,我們的CPU目前在3GHz徘徊。所以,除了指望緩存在未來繼續(xù)擴(kuò)大(這可真是一個(gè)大好消息),現(xiàn)在的單線程應(yīng)用不太可能跑得更快。其他方面的性能提升手段,雖然未來還可能繼續(xù)發(fā)揮作用,不過已經(jīng)無法和過去相提并論了。芯片設(shè)計(jì)師正在拼命尋找新辦法提高管線利用率,降低數(shù)據(jù)加載延遲,但在這些領(lǐng)域,長在低枝的果子早已被摘光。而應(yīng)用程序新需求的增加不但不稍事休息,反而神經(jīng)質(zhì)地加速猛沖。我們只好逼迫程序做更多的事情,而程序則只有威逼CPU,壓垮它,除非程序能并發(fā)執(zhí)行。  應(yīng)對(duì)如此巨變,我們現(xiàn)在有兩條路可以走。一是面向并發(fā)重構(gòu)應(yīng)用,二是勤儉持家,小心規(guī)劃代碼,讓它吃更少的食,干更多的活。這就引出了第三個(gè)有趣的話題?! ?、提升程序效率、優(yōu)化其性能將越來越重要,而不是反道而行。已經(jīng)高度重視性能優(yōu)化的語言將獲得重生,其他的語言趕緊奮起直追,朝著效率和優(yōu)化努力吧。面對(duì)長期增長的需求,希望面向性能努力的語言和系統(tǒng)能為我們分憂。
  4、最后一點(diǎn),編程語言和系統(tǒng)將不得不盡快做好面向并發(fā)的預(yù)備。Java語言從一開始就支持并發(fā)編程,雖然還存在不少問題以致不得不發(fā)布多個(gè)后續(xù)版本提升并發(fā)程序的正確性和效率。C++長期以來被用于編寫大型多線程系統(tǒng),但它卻沒有對(duì)并發(fā)的標(biāo)準(zhǔn)支持(ISO C++標(biāo)準(zhǔn)甚至有意未提及線程[譯注14] ),因此,并發(fā)目前只能在一些不可移植的特定平臺(tái)和庫基礎(chǔ)上實(shí)現(xiàn)(而且實(shí)現(xiàn)還不夠完善,比如靜態(tài)變量只能初始化一次,這就要求編譯器自動(dòng)加鎖,但很多C++的實(shí)現(xiàn)里并不生成鎖)。另外,目前還存在多種并行編程標(biāo)準(zhǔn),例如pthreads和OpenMP[譯注15] ,其中一些支持隱式并行,另一些顯式支持。讓編譯器分析單線程程序并自動(dòng)生成并行代碼的隱式并行方式當(dāng)然美妙而優(yōu)雅,不過這類自動(dòng)轉(zhuǎn)化工具的結(jié)果代碼質(zhì)量還無法與人工編寫的顯式并行代碼媲美。目前的并發(fā)編程主要以鎖為基礎(chǔ),這種方式也很難把握,經(jīng)常要賭幾分運(yùn)氣??傊?,我們迫切需要一個(gè)比目前語言提供的更高抽象層次的、統(tǒng)一的并發(fā)編程模式。關(guān)于這點(diǎn),以后我還有更多的話要說。  總結(jié)  假如你以前對(duì)并發(fā)未加注重,那么現(xiàn)在是時(shí)候了,仔細(xì)分析應(yīng)用的設(shè)計(jì),挑出現(xiàn)在和不久就可能過于依靠CPU能力的操作,研究這些部分如何從并發(fā)得益。你和你的團(tuán)隊(duì),現(xiàn)在也該深入學(xué)習(xí)和了解并發(fā)編程的要求、不足、風(fēng)格和專業(yè)概念了?! ∩俨糠謶?yīng)用天然適用于并行,但大多數(shù)不是的。即便你知道程序受制于CPU的位置,可能也很難找到將這部分操作并行化的辦法。所有這些問題,要求我們加快對(duì)并行的思考和研究。隱式并行編譯器能幫點(diǎn)小忙,但不能指望太多,它不可能比得上盡你所能將順序化程序轉(zhuǎn)化為顯式并行和多線程版本后的效果的?! 「兄x仍未停止的緩存擴(kuò)大和管線少量優(yōu)化,免費(fèi)飯菜在今后還能有一點(diǎn),不過從今天開始,餐館無償提供的只有小菜和飯后小點(diǎn)心了。菜譜上仍然有優(yōu)質(zhì)可口的魚片,但現(xiàn)在要享受它就得付費(fèi)——設(shè)計(jì)精細(xì)化、代碼更復(fù)雜,而且要加倍測(cè)試。對(duì)于多數(shù)應(yīng)用來說,這是個(gè)好消息,盡管要辛勤耕耘,但回報(bào)是豐厚的,因?yàn)椴l(fā)可以讓應(yīng)用繼續(xù)從處理器能力暴增中充分受益。譯注1  處理器發(fā)展歷史上,精簡指令集(RISC,RedUCed Instruction Set Computer)陣營曾向微特爾(Wintel,Microsoft+Intel)陣營發(fā)動(dòng)過三波聲勢(shì)浩大的微電腦盟主爭霸戰(zhàn)?! ∩鲜兰o(jì)70年代以來,對(duì)處理器的要求更為全面,不單是提升速度就能滿足,比如低耗能、小體積,加強(qiáng)數(shù)值運(yùn)算、支持多媒體功能等。復(fù)雜指令集(CISC,Complex Reduced Instruction Set Computer)的微指令多且長度不統(tǒng)一,造成解碼器線路復(fù)雜;加上受當(dāng)時(shí)制造工藝的限制,假如在芯片上直接集成高速緩存和其他部件,體積和價(jià)格都將變得難以想象?! ISC應(yīng)運(yùn)而生。因?yàn)镽ISC指令精簡、線路精簡,所以芯片體積和能耗降低,騰出空間也可容納更多寄存器;另外指令定長,通過硬件加速,還可提升效能。RISC學(xué)術(shù)界從一開始就分為兩派:Berkeley RISC(伯克利大學(xué)RISC計(jì)劃)和Stanford MIPS(斯坦福大學(xué)MIPS計(jì)劃。MIPS,MicroPRocessor without Interlocked Pipeline Stages,無內(nèi)部互鎖流水級(jí)的微處理器。我國龍芯即MIPS架構(gòu))。  Sun公司引進(jìn)了RISC技術(shù),在此基礎(chǔ)上制定了Sparc(Scalable Processor Architecture,可擴(kuò)展處理器體系結(jié)構(gòu))微處理器體系結(jié)構(gòu)規(guī)范,并于1985年推出了相應(yīng)處理器。1988年,Sun領(lǐng)頭組建了Sparc聯(lián)盟,口號(hào)是“RISC + UNIX vs CISC + DOS”,藉此發(fā)動(dòng)第一次爭霸沖擊。后因市場(chǎng)遲遲未見銷量,加上Sun在技術(shù)上又留了一手,導(dǎo)致聯(lián)盟最后只剩Sun自己和德州儀器?! ?990年,MIPS研究開花結(jié)果,開發(fā)團(tuán)隊(duì)成立了同名公司MIPS,并于1991年建立了ACE(Advanced Computing Environment)聯(lián)盟,主要成員有Digital(迪吉多)、SGI(Silicon Graphics,視算科技)和Compaq(康柏)。Compaq當(dāng)時(shí)市場(chǎng)低迷,且Intel對(duì)Compaq展開了游說,因此Compaq最先退出了聯(lián)盟;而Digital又忙于Alpha芯片的開發(fā)。主要成員離心離德,1992年,第二次聯(lián)盟以SGI收購MIPS草草收?qǐng)??! BM從1975年開始精簡指令集芯片研究,也就是后來的PowerPC。1992年,IBM與Motorola(摩托羅拉)、Apple Computer(蘋果)公布合組Power聯(lián)盟。剛開始,Power聯(lián)盟引用學(xué)界評(píng)選論文,直指x86復(fù)雜指令集結(jié)構(gòu)無法應(yīng)付未來信息需求,而媒體也紛紛發(fā)難斥責(zé)x86電腦效能低劣,操作介面不便,都表示支持大膽改革的Power聯(lián)盟。形勢(shì)危機(jī),當(dāng)時(shí)Intel的總裁葛洛夫甚至認(rèn)為Intel已陷入死亡之谷,假如應(yīng)對(duì)失措,“Intel”將成為歷史名詞。Power聯(lián)盟洋洋自得?! 〉诮酉聛淼娜昀?,Power聯(lián)盟遲遲不能統(tǒng)一平臺(tái)標(biāo)準(zhǔn),操作系統(tǒng)開發(fā)進(jìn)度也嚴(yán)重滯后。到1994年,Intel推出了Pentium芯片,微軟的Windows 95也大功告成。盡管當(dāng)時(shí)的Pentium遜于PowerPC,Windows 95界面也不如Macintosh,但前二者相互支援,前后兼容,不斷改進(jìn),而后二者卻不夠統(tǒng)一,用戶沒有安全感。形勢(shì)急轉(zhuǎn)直下,Power聯(lián)盟大跌眼鏡。  第一波攻擊,Sun退回到工作站;第二波攻擊,SGI退回繪圖工作站;第三波攻擊至今,IBM還在服務(wù)端處理器領(lǐng)域靠PowerPC苦撐?! №槑дf一句,Intel和AMD主要走的都是CISC路線。但處理器發(fā)展到現(xiàn)在,各方面技術(shù)已經(jīng)相互融合,不存在絕對(duì)CISC或者RISC的芯片了?! ?STRONG>譯注2  In-Stat:www.instat.com,全球聞名的行業(yè)研究機(jī)構(gòu),Reed Business Information出版集團(tuán)成員公司之一,Reed Elsevier的戰(zhàn)略組成部分;涉及半導(dǎo)體、電信和電子消費(fèi)品等領(lǐng)域的研究、評(píng)估與猜測(cè)。  MDR:MicroDesign Resources,原屬美國Ziff-Davis電子出版集團(tuán),1999年被Reed Elsevier收購。
  In-Stat/MDR主辦《Microprocessor Report》(《微處理器報(bào)告》)雜志,三周刊;Microprocessor Forum(微處理器論壇)每年10月在加利福尼亞州San Jose舉行。  譯注3  原句為:Andy giveth, and Bill taketh away.  Andy:Andy Grove,安迪·格魯夫,1968年和羅伯特·諾宜斯(Robert Noyce)、戈登·摩爾(Gordon Moore)共同創(chuàng)立Intel?! ill:Bill Gates,比爾·蓋茨,1975年和保羅·艾倫(Paul Allen)創(chuàng)立Microsoft。  譯注4  大概是2001年看到過一則新聞,到網(wǎng)上搜了一下,內(nèi)容大致如下:  澳大利亞教授韋伯領(lǐng)導(dǎo)的研究小組利用位于夏威夷的世界最大的天文望遠(yuǎn)鏡“凱克”觀測(cè)17顆不同的類星體。由于這些類星體距離地球120億光年,它們?cè)谟钪嫘纬沙跗诎l(fā)出的光線到今天才抵達(dá)地球。在長途旅行中,部分光線被星系間的氣云吸收。光線的吸收情況既能反映星系氣云的性質(zhì),也能反映出光的變化情況,這其中就包括光的速度以及決定光速的光譜線精細(xì)結(jié)構(gòu)常數(shù)。結(jié)果,韋伯等人發(fā)現(xiàn),精細(xì)結(jié)構(gòu)常數(shù)發(fā)生了微小的變化。從理論上說,這意味著光速有可能發(fā)生過改變。消息公布后,不少物理學(xué)家對(duì)此發(fā)現(xiàn)持謹(jǐn)慎態(tài)度。韋伯及同事希望用位于智利的另一個(gè)大型天文望遠(yuǎn)鏡來證實(shí)他們的結(jié)果,據(jù)稱要得出最終結(jié)論尚需2至3年的時(shí)間?! 〔贿^到目前為止,似乎還沒看到他們的最終結(jié)論?! ?STRONG>譯注5  管線:pipelining,或流水線。CPU的管線并不是數(shù)據(jù)輸入輸出使用的物理線路,而是指指令執(zhí)行的流程。一條指令必須被分解為多個(gè)執(zhí)行步驟,每個(gè)步驟占用一個(gè)時(shí)鐘周期。例如最基礎(chǔ)的管線是5級(jí)的:(1)取指令,(2)對(duì)指令譯碼,(3)演算出操作數(shù),(4)執(zhí)行指令,(5)將結(jié)果存儲(chǔ)到高速緩存。前三步由指令控制器(ICU)完成,后兩步由運(yùn)算器(ALU或FPU)完成。管線可以細(xì)化,例如蘋果的G4處理器采用了7級(jí)管線,AMD 2500+處理器10級(jí),Intel公司的P3到10級(jí),P4到20級(jí),P4-E甚至高達(dá)31級(jí)。管線加長,則每級(jí)任務(wù)量減小,執(zhí)行所需時(shí)間縮短,因此時(shí)鐘周期可以縮短,即時(shí)鐘速度加快。設(shè)管線為N級(jí),時(shí)鐘速度為TMIPS(T百萬次/秒),那么平均完成一條指令所花費(fèi)時(shí)間為N/T(當(dāng)然要求芯片的確在每個(gè)周期內(nèi)能完成各管線級(jí)的任務(wù)),因此理論上只要時(shí)鐘速度加快,則芯片處理能力上升。但問題是管線執(zhí)行時(shí)總有出錯(cuò)(如分支猜測(cè)失敗)的可能,一旦出錯(cuò),整個(gè)管線就要全部清空,然后從第一級(jí)重新執(zhí)行,在這種情況下,長管線的全部花費(fèi)時(shí)間通常比短管線多。這就是部分AMD芯片比Intel相同甚至更高主頻的芯片實(shí)際速度要快的原因?! 》种Р聹y(cè):branch prediction。解決管線中條件轉(zhuǎn)移引起管線停頓的問題。例如第一條指令是條件轉(zhuǎn)移,那么需要等其判定結(jié)果出來后才能執(zhí)行下一條指令,分支猜測(cè)可猜測(cè)判定結(jié)果,然后盡快執(zhí)行其他指令,從而不致管線停頓。當(dāng)然猜測(cè)也有出錯(cuò)的時(shí)候,猜測(cè)失敗將導(dǎo)致管線清空,從頭執(zhí)行。目前猜測(cè)準(zhǔn)確度可達(dá)90%,進(jìn)一步提高分支猜測(cè)準(zhǔn)確率是正在研究的重要課題?! y序執(zhí)行:out-of-order execution。解決管線中指令相關(guān)引起管線停頓的問題。后序指令需要正在執(zhí)行指令的結(jié)果,因此無法立即處理后序指令,這叫做指令相關(guān),造成其他處理單元的停頓,白白損失時(shí)鐘周期。解決辦法是立即找出其他不相關(guān)指令來執(zhí)行,最后由重新排列單元將各執(zhí)行單元的結(jié)果按原來指令順序重新排列。很顯然,亂序執(zhí)行是有風(fēng)險(xiǎn)的。  譯注6  出自美國電影《化身博士》(Dr. Jekyll and Mr. Hyde,有1931和1941兩個(gè)版本)。故事講述哲基爾醫(yī)生相信每個(gè)人都同時(shí)擁有兩極化的個(gè)性——好的一面與邪惡的一面。假如將這兩種個(gè)性分開成為截然不同的兩個(gè)人,這兩個(gè)靈魂都將獲得釋放。他隨后成功地用化學(xué)實(shí)驗(yàn)將自身邪惡的一面轉(zhuǎn)化成為海德先生,此先生犯下了可怕的罪行。但當(dāng)他想要停止用藥時(shí),卻驚恐的發(fā)現(xiàn)一切為時(shí)已晚……  譯注7  讀/寫操作再排序都屬亂序執(zhí)行??聪旅嬉欢卧贾噶畲a:  (p1)br label //分支判定。若為true則跳轉(zhuǎn)到label,否則繼續(xù)執(zhí)行  ld8 r9 r5 //從r5所指地址空間讀取8個(gè)字節(jié)到r9  add r2 r9 r3 //將r9和r3中值求和,并存入r2  其中l(wèi)d,load;r,register?! ∫?yàn)閘oad操作較耗時(shí)間,通?;ㄙM(fèi)幾個(gè)時(shí)鐘周期才能完成。因此從提高效率的角度看,應(yīng)該在處理器空閑的情況下,盡早加載此操作。比如簡單再排序優(yōu)化后:  ld8 r9 r5  (p1)br label  add r2 r9 r3  假如分支判定結(jié)果為false,流程發(fā)生跳轉(zhuǎn),那么可以直接舍棄r9的結(jié)果值,即ld8白做了;但假如未發(fā)生跳轉(zhuǎn),則ld盡早執(zhí)行,提高了流程整體效率?! ‘?dāng)然,CPU實(shí)際工作遠(yuǎn)比上面例子復(fù)雜。比如將ld提前,但假如ld失敗怎么辦?有依靠關(guān)系的指令呢,能否亂序?在多線程應(yīng)用里,亂序還可能引起其他一些問題,比如Java中的Double-Checked Locking失敗。  不光CPU支持亂序執(zhí)行,現(xiàn)在的很多編譯器也開始做亂序優(yōu)化,而且重心有逐漸從硬件轉(zhuǎn)到軟件的趨勢(shì)?! ∮袃善Y料可以參看:Scaling Itanium? Architecture for Higher Performance(非凡是其中的如何處理指令依靠值得了解)和Verified Optimizations for the Intel IA-64 Architecture?! ?STRONG>譯注8  片內(nèi),英文為on the die或On-Die。Die:裸芯;Chip:包裝后的芯片。類似有On-Chip、Off-Die/Chip?! ?STRONG>譯注9  MMX:MultiMedia eXtension,多媒體擴(kuò)展。Intel在1996年3月份正式公布了MMX技術(shù)的細(xì)節(jié),并于1997年1月正式向全球推出基于MMX技術(shù)的166MHz和200MHz Pentium芯片,AMD也幾乎在同時(shí)推出了支持MMX技術(shù)的第六代處理器AMD K6。
  MMX技術(shù)是Intel針對(duì)×86體系的一次重大擴(kuò)充,使計(jì)算機(jī)同多媒體相關(guān)任務(wù)的綜合處理能力提高了1.5~2倍。它不僅是Intel自 i386面世以來對(duì)CPU體系結(jié)構(gòu)的一次顯著改進(jìn),同時(shí)也是IT界對(duì)多媒體數(shù)據(jù)處理等專用芯片及功能板卡的一次成功挑戰(zhàn)?! SE:Streaming SIMD(單指令多數(shù)據(jù)) Extensions,是Intel針對(duì)AMD K6-2引入的“3D NOW!”技術(shù),于l999年在Pentium3中引入的SIMD擴(kuò)展指令集,業(yè)界也稱為MMX2,在多媒體數(shù)據(jù)處理(非凡是3D)和浮點(diǎn)運(yùn)算等能力上全面加強(qiáng)?! ?STRONG>譯注10  目前頻率最高的處理器是Intel P4 570J,3.8GHz,上升非常緩慢?! PU頻率越高,所需電能和發(fā)熱量越多;而晶體管越小,耗電和熱量越低。制造工藝進(jìn)步,可能讓晶體管更小,從而讓CPU在相同或一定程度內(nèi)提高的能耗下達(dá)到更高頻率。從這個(gè)角度說,提升CPU頻率的瓶頸是制造工藝?! ∮谑?,Intel推出了了90nm工藝的Prescott核心Pentium4,其理論頻率將能達(dá)到6GHz!然而世事難料,在90nm工藝晶體管里,由于電介質(zhì)厚度太低無法阻擋電子的穿越,造成了嚴(yán)重的電流泄漏問題,隨之帶來的就是大量的電能消耗和廢熱。假如強(qiáng)行提升頻率,則發(fā)熱激增,CPU經(jīng)不起如此的高燒?! ⌒孤╇娏鲉栴}并非不可解決,但絕不能在短時(shí)間辦到。至此,芯片廠商提升系統(tǒng)性能的思路開始發(fā)生重大變化,即轉(zhuǎn)向多核。  有關(guān)電流泄漏和應(yīng)對(duì)策略的詳情,可參看:NetBurst的繼續(xù)者 Core微處理器架構(gòu)技術(shù)解析?! ?STRONG>譯注11  在IDF05(Intel Developer Forum 2005)上。Intel首席執(zhí)行官Craig Barrett就取消4GHz芯片計(jì)劃一事,半開玩笑當(dāng)眾單膝下跪致歉?! ?img src="http://www.knowsky.com/UploadFiles/20080323/2008323166676577802.jpg" border="0" alt="免費(fèi)午餐已經(jīng)結(jié)束——軟件向并發(fā)靠攏(圖二)" width="447" height="335" />  譯注12  Working Set,記錄了操作系統(tǒng)為進(jìn)程提交的內(nèi)存的總量?! ?STRONG>譯注13  并發(fā)編程語言(Concurrent Language)中的術(shù)語。  協(xié)同程序(coroutines),或協(xié)程。用以實(shí)現(xiàn)協(xié)作式多任務(wù),于上世紀(jì)60年代提出。同屬一個(gè)協(xié)程的多個(gè)進(jìn)程,在同一時(shí)刻只能有一個(gè)處于運(yùn)行狀態(tài)。協(xié)程屬于一種并發(fā)進(jìn)程創(chuàng)建方式,其他方式還有Fork/join、Cobegin/coend和進(jìn)程顯式申明(Process declarations)等。  并發(fā)進(jìn)程之間的通信方式主要有兩種方式:變量共享(shared variables)和消息傳遞(message passing)。其他還包括抽象于更高層次的遠(yuǎn)程過程調(diào)用(remote procedure call,RPC)等。  通信就離不開同步。同步方法主要包括:信號(hào)量(semaphores)、條件臨界區(qū)(conditional critical regions)、管程(monitors)、互斥(mutual exclusion)、路徑表達(dá)式(path eXPressions)、原子事務(wù)(atomic transactions)和匯集(rendezvous)等?! ∑渲械墓艹淌俏挥诘图?jí)同步控制手段之上的一種對(duì)象化治理工具。信號(hào)量的使用是無結(jié)構(gòu)的,很不方便;條件臨界區(qū)相對(duì)于信號(hào)量更結(jié)構(gòu)化,但同步控制代碼仍然非常分散,不利于治理。因此引入了管程,它實(shí)現(xiàn)了共享資源的集中治理,封裝了共享資源以及施于其上的操作?! ?STRONG>譯注14  因?yàn)槟承┰?如競(jìng)爭條件下靜態(tài)變量初始化問題),線程還未被列入ISO C++標(biāo)準(zhǔn)。目前在不同的平臺(tái)上,都有線程的專門實(shí)現(xiàn),短時(shí)間內(nèi)難以完全統(tǒng)一。  不過Boost線程庫目前差不多具有準(zhǔn)標(biāo)準(zhǔn)身份。  譯注15  并行編程中必須考慮的兩個(gè)問題是被處理數(shù)據(jù)和任務(wù)間通訊。經(jīng)過用戶的選擇與市場(chǎng)的淘汰,現(xiàn)在的并行編程標(biāo)準(zhǔn)基本上趨向以下三種:  1、數(shù)據(jù)并行。特點(diǎn),各任務(wù)處理的數(shù)據(jù)彼此分離,任務(wù)間通過消息傳遞進(jìn)行通訊;數(shù)據(jù)分離和消息傳遞工作由編譯器完成?! PF(High Performance Fortran,高性能Fortran)是典型的數(shù)據(jù)并行編程語言。因?yàn)槟壳暗木幾g器技術(shù)對(duì)實(shí)際應(yīng)用中各種不規(guī)則問題的解決方案仍不夠理想,加上專注于數(shù)據(jù)并行,因此HPF未獲廣泛應(yīng)用?! ?、消息傳遞。特點(diǎn),各任務(wù)處理的數(shù)據(jù)彼此分離,任務(wù)間通過消息傳遞進(jìn)行通訊;數(shù)據(jù)分離和消息傳遞工作由程序員和用戶完成,因此對(duì)程序員要求很高。這種模式非常適用于消息傳遞的體系結(jié)構(gòu)(如機(jī)群系統(tǒng)),用戶和程序員主要需考慮的是通訊同步和通訊性能問題?! 〔⑿刑摂M機(jī)(PVM,Parallel Virtual Machine)和消息傳遞接口(MPI,Message Passing Interface)是兩種廣泛使用的消息傳遞并行編程標(biāo)準(zhǔn)。其中PVM側(cè)重異構(gòu)環(huán)境下的可移植性和互操作性;MPI更強(qiáng)調(diào)性能,但在異構(gòu)環(huán)境下有不同的實(shí)現(xiàn)。幾乎所有的高性能計(jì)算系統(tǒng)都支持PVM和MPI?! ?、共享內(nèi)存。特點(diǎn),各任務(wù)處理的數(shù)據(jù)實(shí)現(xiàn)內(nèi)存共享,任務(wù)間也通過共享數(shù)據(jù)實(shí)現(xiàn)通訊;數(shù)據(jù)共享可由程序員或編譯器完成。共享內(nèi)存并行編程主要應(yīng)用在對(duì)稱多處理器(SMP ,Symmetric Multi Processors)系統(tǒng)上。  OpenMP(Open MultiProcessing由X3H5發(fā)展而來)和PThread(POSIX Thread)都是共享內(nèi)存并行編程的實(shí)現(xiàn)?! penMP由1993年建立的X3H5標(biāo)準(zhǔn)發(fā)展而來,目前已成共享內(nèi)存并行編程的實(shí)際工業(yè)標(biāo)準(zhǔn),得到DEC、Intel、IBM和Sun等廠商廣泛支持。它在Forthan、C/C++得到了實(shí)現(xiàn),主要支持隱式并行編程,即編譯器實(shí)現(xiàn)并行。  PThread主要在Unix系統(tǒng)上使用。Unix的實(shí)現(xiàn)系統(tǒng)很多,比如linux、FreeBSD、Solaris、Mac OS X等。要在眾多“類UNIX”上開發(fā)跨平臺(tái)的多線程應(yīng)用,絕非易事,因此制定了POSIX Thread標(biāo)準(zhǔn)。David R. Butenhof(Boost庫發(fā)起者之一,ISO C++標(biāo)準(zhǔn)委員會(huì)成員)的《Programming with POSIX Threads》這本書,可以說是Unix上編寫多線程應(yīng)用的必備參考書。對(duì)其他平臺(tái)并行程序開發(fā)也有很高參考價(jià)值。
  總的來說,共享內(nèi)存并行編程與目前大多數(shù)的多線程程序員思維習(xí)慣最為接近,是程序員從單核轉(zhuǎn)向多核系統(tǒng)需付代價(jià)最小的方案。但專家仍有不同意見,比如Herb Sutter就不看好OpenMP,因?yàn)楣蚕韮?nèi)存并行編程本質(zhì)上并沒有太多改進(jìn),仍然依靠數(shù)據(jù)資源的鎖定,這會(huì)帶來性能問題。消息傳遞并行有性能優(yōu)勢(shì),但對(duì)程序員的要求又太高了。所有這些難題,還需要研究并行和各種標(biāo)準(zhǔn)、庫的專家繼續(xù)努力解決。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汨罗市| 南开区| 玉门市| 南康市| 宝丰县| 临海市| 文水县| 富锦市| 迁安市| 通道| 浮梁县| 皮山县| 碌曲县| 新沂市| 民县| 灵山县| 高青县| 本溪市| 奇台县| 新建县| 措美县| 定南县| 承德县| 夏津县| 德江县| 石台县| 若羌县| 建昌县| 洛宁县| 内黄县| 民权县| 南召县| 九江县| 常熟市| 河西区| 安阳市| 三亚市| 玛纳斯县| 瑞安市| 日喀则市| 武夷山市|