- 實戰Java高并發程序設計(第2版)
- 葛一鳴
- 3265字
- 2019-07-26 15:32:09
1.1 何去何從的并行計算
我們到底該如何選擇呢?本節的目的就是撥云見日。
1.1.1 忘掉那該死的并行
Linus Torvalds是一個傳奇式的人物(圖1.1),是他給出了Linux的原型,并一直致力于推廣和發展Linux系統。1991年,他首先在網絡上發布了Linux源碼,從此Linux迅速崛起壯大,成為目前使用最廣泛的操作系統之一。
圖1.1 傳奇的Linus Torvalds
自2002年起,Linus就決定使用BitKeeper作為Linux內核開發的版本控制工具,以此來維護Linux的內核源碼。BitKeeper是一套分布式版本控制軟件,它是一套商用系統,由BitMover公司開發。2005年,BitKeeper宣稱發現Linux內核開發人員使用逆向工程來試圖解析BitKeeper內部協議。因此,決定向Linus收回BitKeeper授權。雖然Linux核心團隊與BitMover公司進行了協商,但是仍無法解決他們之間的分歧。因此,Linus決定自行研發版本控制工具來代替BitKeeper。于是,Git誕生了。
如果你正在使用Git,那么我相信你一定會為Git的魅力所征服;如果你還沒有了解過Git,那么我強烈建議你關注一下這款優秀的產品。
而正是這位傳奇人物,給目前紅紅火火的并行計算潑了一大盆冷水。那么,并行計算究竟應該何去何從呢?
在Linus的發言中這么說道:
Where the hell do you envision that those magical parallel algorithms would be used?
The only place where parallelism matters is in graphics or on the server side, where we already largely have it.Pushing it anywhere else is just pointless.
So the whole argument that people should parallelise their code is fundamentally flawed.It rests on incorrect assumptions.It's a fad that has been going on too long.
需要有多么奇葩的想象力才能想象出并行計算的用武之地?
并行計算只能在圖像處理和服務端編程兩個領域使用,并且它在這兩個領域確實有著大量廣泛的使用。但是在其他任何地方,并行計算毫無建樹!
因此,人們爭論是否應該將代碼并行化是一個本質上的錯誤。這完全基于一個錯誤的假設。“并行”是一個早該結束的時髦用語。
看了這段較為完整的表述,大家應該對Linus的觀點有所感觸,我對此也表示贊同。與串行程序不同,并行程序的設計和實現異常復雜,不僅體現在程序的功能分離上,多線程間的協調性、亂序性都會成為程序正確執行的障礙。只要你稍不留神,就會失之毫厘,謬以千里!混亂的程序難以閱讀、難以理解,更難以調試。所謂并行,也就是把簡單問題復雜化的典型。因此,只有“瘋子”才會叫囂并行就是未來(The crazies talking about scaling to hundreds of cores are just that–crazy)。
但是,Linus也提出了兩個特例,那就是圖像處理和服務端程序是可以也需要使用并行技術的。仔細想想,為什么圖像處理和服務端程序是特例呢?
和用戶終端程序不同,圖像處理往往擁有極大的計算量。一張1024×768像素的圖片,包含多達78萬6千多個像素。即使將所有的像素遍歷一遍,也得花不少時間。更何況,圖像處理涉及大量的矩陣計算。矩陣的規模和數量都會非常大。因為如此密集的計算,很有可能超過單核CPU的計算能力,所以自然需要引入多核計算了。
而服務端程序與一般的用戶終端程序相比,一方面,服務端程序需要承受很大的用戶訪問壓力。根據淘寶的數據,它在“雙11”一天,支付寶核心數據庫集群處理了41億個事務,執行285億次SQL,生成15TB日志,訪問1931億次內存數據塊,發生13億個物理讀。如此密集的訪問,恐怕任何一臺單核計算機都難以勝任,因此,并行程序也就自然成了唯一的出路。另一方面,服務端程序往往會比用戶終端程序擁有更復雜的業務模型。面對復雜業務模型,并行程序會比串行程序更容易適應業務需求,更容易模擬我們的現實世界。畢竟,我們的世界本質上是并行的。比如,當你開開心心去上學的時候,媽媽可能在家里忙著家務,爸爸在外打工賺錢,一家人其樂融融。如果有一天,你需要使用你的計算機來模擬這個場景,你會怎么做呢?如果你就在一個線程里,既做了你自己,又做了媽媽,又做了爸爸,顯然這不是一種好的解決方案。但如果你使用三個線程,分別模擬這三個人,一切看起來那么自然,而且容易被人理解。
再舉一個專業點的例子,比如基礎平臺Java虛擬機,虛擬機除了要執行main函數主線程外,還需要做JIT編譯,需要做垃圾回收。無論是main函數、JIT編譯還是垃圾回收,在虛擬機內部都是一個單獨的線程。是什么使得虛擬機的研發人員這么做的呢?顯然,這是因為建模的需要。因為這里的每一個任務都是相對獨立的。我們不應該將沒有關聯的業務代碼拼湊在一起,分離為不同的線程更容易理解和維護。因此,使用并行也不完全是出于性能的考慮,而有時候,我們會很自然地那么做。
1.1.2 可怕的現實:摩爾定律的失效
摩爾定律是由英特爾創始人之一戈登·摩爾提出來的,其內容為:集成電路上可容納的電晶體(晶體管)數目,約每隔24個月便會增加一倍。經常被引用的“18個月”,是由英特爾首席執行官大衛·豪斯所說:預計18個月會將芯片的性能提高一倍(即更多的晶體管使其更快)。
說得直白點,就是每18個月到24個月,我們的計算機性能就能翻一番。
反過來說,就是每過18個月到24個月,你在未來用一半的價錢就能買到和現在性能相同的計算設備了。這聽起來是一件多么激動人心的事情呀!
但是,摩爾定律并不是一種自然法則或者物理定律,它只是基于人為觀測數據對未來的預測。按照這種速度,我們的計算能力將會按照指數速度增長,用不了多久,我們的計算能力就能超越“上帝”了!暢想未來,基于強勁的超級計算機,我們甚至可以模擬整個宇宙。
摩爾定律的有效性已經超過半個世紀了,然而,在2004年,Intel宣布將4GHz芯片的發布時間推遲到2005年,在2004年秋季,Intel宣布徹底取消4GHz計劃(如圖1.2所示)。
是什么迫使世界頂級的科技巨頭放棄4GHz的研發呢?顯然,就目前的硅電路而言,很有可能已經走到了頭。我們的制造工藝已經精確到了納米了。1納米是10-9米,也就是十億分之一米。這已經是一個相當小的數字了。就目前的科技水平而言,如果無法在物質分子層面以下進行工作,那么也許4GHz的芯片就已經接近理論極限了。因為即使一個水分子,它的直徑也有0.4納米。再往下發展就顯得有些困難。當然,如果我們使用完全不同的計算理論或者芯片生成工藝,也許會有本質的突破,但目前還沒有看到這種技術被大規模使用的可能。
圖1.2 Intel CEO Barret單膝下跪對取消4GHz感到抱歉
因此,摩爾定律在CPU的計算性能上可能已經失效。雖然,現在Intel已經研制出了4GHz芯片,但可以看到,在近10年的發展中,CPU主頻的提升已經明顯遇到了一些暫時不可逾越的瓶頸。
1.1.3 柳暗花明:不斷地前進
雖然CPU的性能已經幾近止步,長達半個世紀的摩爾定律轟然倒地,但是這依然沒有阻擋科學家和工程師們帶領我們不斷向前的腳步。
從2005年開始,我們已經不再追求單核的計算速度,而著迷于研究如何將多個獨立的計算單元整合到單獨的CPU中,也就是我們所說的多核CPU。短短十幾年的發展,家用型CPU,比如Intel i7 就可以擁有4核心,甚至8核心。而專業服務器則通常可以配有幾個獨立的CPU,每一個CPU都擁有多達8個甚至更多的內核。從整體上看,專業服務器的內核總數甚至可以達到幾百個。
非常令人激動,摩爾定律在另外一個側面又生效了。根據這個定律,我們可以預測,每過18個月到24個月,CPU的核心數就會翻一番。用不了多久,擁有幾十甚至上百個CPU內核的芯片就能進入千家萬戶。
頂級計算機科學家唐納德·爾文·克努斯(Donald Ervin Knuth),如此評價這種情況:在我看來,這種現象(并發)或多或少是由于硬件設計者已經無計可施導致的,他們將摩爾定律失效的責任推給軟件開發者。
唐納德(如圖1.3所示)是計算機巨著《計算機程序設計藝術》的作者。《美國科學家》雜志曾將該書與愛因斯坦的《相對論》、狄拉克的《量子力學》和理查·費曼的《量子電動力學》等書并列為20世紀最重要的12本物理科學類專論書之一。
圖1.3 唐納德
1.1.4 光明或是黑暗
根據唐納德的觀點,摩爾定律本應該由硬件開發人員維持。但是,很不幸,硬件工程師似乎已經無計可施了。為了繼續保持性能的高速發展,硬件工程師破天荒地想出了將多個CPU內核塞進一個CPU里的奇妙想法。由此,并行計算就被非常自然地推廣開來,隨之而來的問題也層出不窮,程序員的黑暗時期也隨之到來。簡化的硬件設計方案必然帶來軟件設計的復雜性。換句話說,軟件工程師正在為硬件工程師無法完成的工作負責,因此,也就有了唐納德的“他們將摩爾定律失效的責任推給了軟件開發者”的說法。
所以,如何讓多個CPU有效并且正確地工作也就成了一門技術,甚至是很大的學問。比如,多線程間如何保證線程安全,如何正確理解線程間的無序性、可見性,如何盡可能地設計并行程序,如何將串行程序改造為并行程序。而對并行計算的研究,也就是希望給這片黑暗帶來光明。
- Learn to Create WordPress Themes by Building 5 Projects
- Python數據可視化:基于Bokeh的可視化繪圖
- Vue.js 3.x從入門到精通(視頻教學版)
- Learning Bayesian Models with R
- Mastering RStudio:Develop,Communicate,and Collaborate with R
- 零基礎輕松學SQL Server 2016
- 零基礎學單片機C語言程序設計
- Learning Concurrent Programming in Scala
- Python極簡講義:一本書入門數據分析與機器學習
- Instant PHP Web Scraping
- FFmpeg開發實戰:從零基礎到短視頻上線
- 關系數據庫與SQL Server 2012(第3版)
- Linux Networking Cookbook
- Kotlin入門與實戰
- Cocos2D Game Development Essentials