傳奇黑客看衰並行計算:多核處理器純屬浪費

AI前線導讀:
在購買電腦時,一般用戶認爲處理器核心越多越好,那麼實際上是這麼回事嗎?或許是的,但問題是,你能真正充分利用這些核心嗎?如果不能,那麼花更多的錢買更多的核心豈不是浪費了?美國著名軟件黑客、開源軟件倡導者Eric Steven Raymond最近在一篇博文中表達了對計算機並行計算的質疑。他指出,單核處理器早已觸及物理天花板,處理器廠商試圖通過在單個芯片上放置更多的核心讓用戶誤以爲芯片很強大,但其實大部分軟件無法充分利用這些核心。而對於一般用戶來說,這些核心根本就是多餘的,因爲它們大部分時間什麼都不做,只是在產生廢熱!

首先,讓我們簡單過一下這位大名鼎鼎的軟件黑客的簡歷。

image

Eric Steven Raymond(簡稱ESR),生於1957年,美國著名軟件黑客(”黑客“並不都是貶義詞,實際上,他是一名軟件開發大神)和開源軟件倡導者。他於1999年出版了經典著作《大教堂與市集》(英文名爲The Cathedral and the Bazaar,相信很多人都知道或看過這本書),這本書被譽爲軟件開源運動的“聖經”。他曾爲單人角色扮演遊戲NetHack編寫過一本指南。他還是Jargon File(面向程序員的術語字典,後來集結成冊出版,也就是“The Hacker’s Dictionary”——黑客字典)的參與者之一。

以下內容翻譯自Raymond的博文,文末附上了一些讀者的精彩評論。

大規模併發和硬件並行計算是21世紀最性感的主題之一。從好的方面看,將圖形處理單元(GPU)用在遊戲和AI深度學習中確實取得了引人注目的效果——我們因此獲得了大規模的硬件並行性。但令人遺憾的是,單核處理器的執行速度在2006年左右就已經達到了物理極限。漏電和熱控問題嚴重限制了芯片時鐘頻率的增長,而傳統的通過降低電壓來繞過這一問題的方法現在面臨着另一個問題——量子噪聲。

作爲權宜之計,硬件廠商在他們發佈的芯片中放置更多的處理內核,並宣稱他們的設備可以達到更高的理論總吞吐量。不過,硬件廠商也在努力嘗試製造可以讓程序員能夠使用曲柄指令的串行單處理器,他們使用了管道化和推測執行技術,但其實這些技術仍然需要依賴併發性。

令人尷尬的是,很多不那麼重要的計算工作負載無法很好地利用可見的併發性。原因有很多,在這篇文章中,我將描述其中的一些區別,希望能夠幫助讀者更好地思考這個問題。

首先,我們需要明確在哪些情況下可以輕鬆利用硬件的並行性以及爲什麼。我們對圖形、神經網絡、信號處理和挖掘比特幣的計算進行了一番研究,然後找到了一種模式:要讓並行化算法獲得最好的效果,用來執行算法的硬件必須是專門爲這些算法而設計的,而且除了運行這些算法外其他什麼也不能做!

我們還發現,成功的並行算法(排序、字符串匹配、快速傅立葉變換、矩陣運算、圖像反向量化等)的輸入看起來都很相似。它們往往具有度量指標結構,而且數據的“近”和“遠”之間存在隱含的區別,可以被分成不同的塊,彼此遠離的元素之間的耦合可以忽略不計。

在之前的一些有關局域性(locality)的文章中,並行方法似乎主要適用於數據具有良好局域性的情況。而且它們只有在專門爲支持近距離元素通信而設計的硬件上才能獲得最好的運行效果。

相反,在通用(馮·諾依曼體系)計算機上開發可用於有效分治處理具有不良局域性的輸入的軟件是非常困難的。

我們可以這麼說:在某個問題上應用並行計算技術的機率與輸入數據中不可約的非局域性程度成反比。

並行計算的另一個限制是一些重要的算法根本無法並行化。在我的另一篇博文中,我發明了“SICK算法”這個術語,SICK是“Serial, Intrinscally——Cope, Kiddo!”的縮寫。針對這個術語,我可以舉一些重要的例子:Dijkstra的n-least-paths算法、有向圖中的環檢測、深度優先搜索、計算加密哈希鏈中的第n個項、網絡流優化。

這些輸入數據具有糟糕的局域性,尤其是在圖結構和樹結構中。加密哈希鏈無法被並行化,因爲它們的項必須按嚴格的時間順序進行計算——這對於驗證鏈的防篡改來說非常重要。

這裏有一個規則:如果存在SICK算法,就無法進行並行化。

除了這些,你還可能會遇到至少兩種其他類型的情況,導致無法進行並行化。

一個是沒有合適的工具可用。大多數編程語言只支持互斥和mailbox這兩種通信方式,優點是原語很容易實現,缺點是暴增的複雜性會令人望而生畏,而且在達到四層交互鎖時,人腦就幾乎無法準確地進行模擬。

如果你足夠幸運,或許可以從一些簡單的原語集合中獲得一些好處,例如Go語言通道(也就是通信順序進程)或Rust的ownership/send/sync系統。但事實是,在馮·諾依曼體系計算機上,我們並不知道什麼纔是並行性的“正確”語言原語。也可能並不存在一個正確的原語集,或者也可能有兩個、三個或甚至更多不同的原語集適用於不同的問題域。但就2018年的技術水平而言,沒有人知道正確的答案。

最後,人類大腦的侷限性也是個問題。即使是給定一個簡單的算法、具有良好局域性的數據表示和一個強大的工具,並行編程對於人類來說仍然很困難。我們的大腦並不擅長對純粹的串行程序的狀態空間進行建模,而在並行程序方面就更加不擅長了。

因爲有大量的現實證據表明,調試並行性代碼對人類來說簡直難如登天。由於不安全的操作順序導致的競態條件、死鎖、活鎖和隱含的數據損壞就是這方面最好的例子。

我認爲,自從Dennard Scaling(Robert Dennard在1974年發表的一篇論文中預測說晶體管尺寸變小,功耗會同比變小)失效以後,瞭解這些限制就變得越來越重要。由於可以有效使用多個內核的代碼存在這些瓶頸,一些多核硬件運行的軟件永遠無法充分利用所有內核。或者換一個說法,相對於其上運行的工作負載,硬件有點過度構建了。我們因此浪費了多少錢和精力?

處理器廠商當然希望你會高估多核心所能帶來的功能增益,但他們是否能夠從你身上榨取更多的錢來支付他們花在生產芯片上的高昂成本並仍然有獲利空間?因此,他們加強力度進行市場營銷,旨在分散用戶的注意力,讓他們不知道這些增益是不是真實的。

公平地說,在某些方面增益是真的。機架上的服務器每秒需要處理數十萬個併發事務,對於這種情況,處理器核心數量與工作負載是匹配的。智能手機或嵌入式系統——對於這兩種極端情況,需要付出很多努力才能最大限度地降低構建成本和功耗預算。

那麼典型的臺式機和筆記本用戶呢?這個很難說,因爲我們也看到了因爲其他技術變化所帶來的實際性能提升,例如使用固態大容量存儲替代機械磁盤。而這些增益很容易被誤認爲是更多CPU吞吐量造成的。

以下是我的一些質疑:

  1. 對於大多數臺式機/筆記本電腦用戶而言,他們的電腦上唯一重度使用並行計算的是圖形芯片。
  2. 兩個以上的處理器內核通常會被浪費掉。操作系統可能可以在這些核心之間分配應用程序,但是這些應用程序通常無法真正利用多核並行性,並且大多數用戶很少會同時運行足夠多的應用程序來讓所有核心飽和。
  3. 因此,部署在4芯及以上的機器中的大多數處理器單元大部分時間並沒有在處理任務,而是在產生廢熱。

以下是讀者針對Raymond博文發表的部分評論。大部分讀者贊同作者的觀點,也有少部分“有錢任性”的讀者認爲即使無法充分利用多核,那也不算浪費,因爲說不定以後用得着呢。

Patrick3:

我總體上表示贊同。

我的電腦只在爲建築可視化執行3D渲染時纔會讓處理器達到100%的負載。

我發現,如果以美元爲單位計算,現代“MegaDoomDestroyer”顯卡速度甚至比Threadripper和Skylake-X這樣的1000美元以上的CPU要快得多。渲染軟件(Octane Render和虛幻引擎4)現在可以使用顯卡來計算光照,也就是說,我在CPU上花300美元,再加上貴一點的顯卡——總體速度就會比CPU快很多。渲染軟件現在與計算機遊戲技術非常相似,所以這個一點也不奇怪。

Dave:

我認爲我的多核CPU工作場景現在很常見——比如虛擬服務器系統。我們在6臺物理服務器上24×7運行差不多50個虛擬服務器。我們目前每臺物理主機有80到88個物理核心,我們正在嘗試能夠達到10%以上的利用率。我們還努力將GPU重度用戶轉到配備NVIDIA GRID系統的虛擬機。由於RAM配置的限制,我不認爲我們會讓這些系統達到25%以上的核心利用率。

Chad Irby:

我完全同意“對於大多數臺式機/筆記本電腦用戶而言,他們的電腦上唯一重度使用並行計算的是圖形芯片”這句話。

我們現在的硬件已經達到極限了。最新的GPU,如RTX系列,對於標準遊戲而言並不比以前的GTX型號快多少。唯一潛在的大加速是光線追蹤(raytracing)——其中很大一部分是去噪,通過深度學習超級採樣來實現,而後者依賴於將一些機器學習預處理交給NVIDIA超級計算機。

不可否認,大多數人不需要讓四個或六個單獨的核心都達到99%的負載,但有些人,比如像我這樣的超級遊戲玩家,會爲了降低風扇噪音用冰水來給電腦降溫。

一些遊戲程序員開始真正使用多線程,因爲他們必須找到一些方法,在機器的其餘部分忙於與顯卡通信時,保持遊戲的智能,並順暢地生成遊戲地圖。

Michael:
我完全贊同“應用程序通常無法真正利用多核並行性,並且大多數用戶很少會同時運行足夠多的應用程序來讓所有核心飽和”這句話,但我認爲它忽略了一些東西。
我非常希望多核桌面處理器能夠讓所有非UI進程在後臺運行,並讓UI空間對我的點擊和擊鍵操作做出超級快的響應。這樣的話,我就不會在乎系統的內核是否過度配置或者是否浪費了算力。(例如,當i5甚至i3可以滿足我的需求時,我還是買了i7)。因此,使核心飽和大多數時候並非我們的目標。
但問題是,實際情況並不是這樣的。我甚至無法分辨WIMP界面的響應速度是否比15年前更快。

Bret:

“部署在4芯及以上的機器中的大多數處理器單元大部分時間並沒有在處理任務,而是在產生廢熱”——話是這麼說,但那又怎樣呢?

如果只是使用所有處理器的一小部分時間,就已經很值了。

多核通常意味着更快的編譯和構建。即使200美元/小時(成本)的程序員只使用一小部分時間用於編譯/構建,額外的CPU和電力成本也很快能收回。

例如,我爲農業應用構建機器人,在95%以上的時間裏,核心平均利用率低於50%。但如果在很短的時間內平均利用率接近100%,應用程序就會出現故障,並且無法使用。而這些應用程序其實可以直接使用所有的內核。

即使計算機不能物盡其用,那又怎樣?我們浪費的無非就是幾百美元,但未來可能可以用到它們。在我看來,潛在的有用性並不算是很大的浪費。

英文原文:Pessimism about parallelism

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章