【計算機組成原理】04-如何提升“性能”


  在上一篇博客中,提到了下面這個公式:

程序的 CPU 執行時間 = 指令數 × CPI × Clock Cycle Time

  由此可知,想提升計算機性能,可以從指令數、CPI、CPU 主頻三個方向入手。搞定指令數需要優化編譯器,搞定 CPI 則需要優化 CPU 架構,譬如采用流水線技術。所以研發 CPU 的硬件工程師們將目光聚焦在了主頻上——多放些晶體管、提高 CPU 的時鍾頻率,就可以讓 CPU 更快,程序的執行時間更短。

  1978 年發布的 8086 CPU,主頻只有 5MHz。1989 年的 486 就提升到了 100MHz。2000 年的奔騰 4 處理器,更是達到了 1.4GHz。Intel 也是放出豪言壯語,稱奔騰 4 使用的 CPU 結構可以做到 10GHz。

  看起來,提高性能的康庄大道已然擺在面前。但提升主頻真的是無往而不利的手段嗎?

 

1. 功耗——人力有時窮,CPU 亦然

1.1 主頻時代的終結

  和 Intel 的預期不同,奔騰 4 的 CPU 主頻從來沒有達到過 10GHz,並且最終將上限定格在 3.8GHz。此外,在實際應用中發現,奔騰 4 的主頻雖然高,但並沒有顯著提升性能。奔騰 4 系列的 2.4GHz 處理器,性能和奔騰 3 架構的奔騰 M 1.6GHz 處理器相近。這一事件代表着“主頻時代”的終結,Intel 接下來的幾代產品,主頻不升反降。2019 年最強的 i9 CPU,主頻也不過 5GHz。

CPU 主頻提升,從奔騰 4 時代進入瓶頸期

1.2 提升主頻為何失靈

  奔騰 4 之所以沒有超過 3.8GHz 的瓶頸,是因為功耗問題。主頻為 3.8GHz 的奔騰 4 處理器,滿載功率是 130W。作為對比,iPhone X 使用的 CPU,功率僅 4.5W。

  前文提到,CPU 是一個超大規模集成電路,本質上是由一個個晶體管組合而成的。CPU 的運算過程,就是讓這些晶體管里的“開關”不斷打開和關閉實現的。想要運算快,無非兩個手段。一是在相同的面積里,多放一些晶體管,即增加密度。另一個就是讓晶體管打開和關閉的速度更快,也就是提升主頻。這兩種手段都會增加功耗,帶來耗電和散熱的問題。我們在 CPU 上面抹硅脂、裝風扇,乃至用上水冷或者其他更好的散熱設備,但散熱效果也是有極限的。綜上,CPU 里能放的晶體管數量和晶體管的開關頻率也都是有極限的。

  一個 CPU 的功率,可以用如下公式表示:

功耗 ~= 1/2 × 負載電容 × 電壓的平方 × 開關頻率 × 晶體管數量

  為了提升性能,我們要盡力在相同面積下多放一些晶體管。這就要把晶體管造得小一些,也就是我們平時說的“制程”。從 28nm 到 7nm,晶體管大小變成了原來的 1/4。此外,還要提升主頻,讓晶體管的開關頻率更快。

CPU 制程的演進

  前面也提到,這兩種手段會導致功耗增加,而功耗增加又會導致 CPU 散熱跟不上。研發 CPU 的工程師又想出一個辦法——降低電壓。從上面的公式可知,功耗和電壓的平方成正比。電壓下降到原來的 1/5,功耗會降低到原來的 1/25。

  從 5MHz 主頻的 8086 到 5GHz 主頻的 Intel i9,CPU 的電壓已經從 5V 左右下降到了 1V 左右。這也是為什么我們 CPU 的主頻提升了 1000 倍,但是功耗只增長了 40 倍。

 

2. 並行優化,理解阿姆達爾定律

2.1 柳暗花明——引入並行

  制程的優化和電壓的下降,在過去的 20 年里,讓我們的 CPU 性能有所提升。但從奔騰 4 開始,Intel 意識到通過提升主頻已經難以實現性能提升,於是開始推出 Core Duo 這樣的多核 CPU,通過提升“吞吐率”而不是“響應時間”,來達到目的。簡而言之,就是通過並行提高性能。

  舉個栗子。我有一批貨,要從北京運到上海。公路運輸要 20 小時,航空運輸則只要 2 小時。但沒有辦法再縮短時間了——總不能用東風快遞打過去吧。那么假設我的貨物,一架飛機要飛八次才能運完,那么我找八架飛機送,一次就能送完了。

  通過並行提高性能的思想已經被廣泛使用。譬如機器學習要計算向量的點積,就是讓多個 CPU 各自做部分運算,最后再匯總,從而縮短時間。

在點積運算中通過並行提升性能

2.2 金無足赤——並行的限制

  並非所有問題都能通過並行提高性能來解決。使用並行思想,需要滿足以下三個條件:

    • 需要進行的計算,本身可以分解成幾個可以並行的任務;
    • 需要能夠分解好問題,並確保幾個人的結果能夠匯總到一起;
    • 匯總階段是沒有辦法並行的,還是得順序執行。

2.3 阿姆達爾定律(Amdahl’s Law)

  阿姆達爾定律是性能優化中常用的經驗定律。它說的是,對於一個程序進行優化之后,處理器並行運算之后效率提升的情況。具體可以用這樣一個公式來表示:

優化后的執行時間 = 受優化影響的執行時間 / 加速倍數 + 不受影響的執行時間

  在上一小結的點積運算實例中,4 個 CPU 同時計算向量的一小段點積,通過並行提高了這部分的計算性能。但這 4 個結果還是要在 1 個 CPU 進行匯總,這個環節是不能用並行來優化的,也就是上述公式中“不受影響的執行時間”。

  譬如上面的各個向量的一小段的點積,需要 100ns,加法需要 20ns,總共需要 120ns。這里通過並行 4 個 CPU 有了 4 倍的加速度。那么最終優化后,就有了 100/4+20=45ns。即使我們增加更多的並行度來提供加速倍數,比如有 100 個 CPU,整個時間也需要 100/100+20=21ns。

阿姆達爾定律在點積運算中的應用示例

 

3. 提高性能的更多途徑

  通過前兩個小節的描述可以看到,暴力提升主頻、增加 CPU 核心數,並行提升性能這兩種方式都有各自的瓶頸。單純堆砌硬件已經不能很好地提升性能。於是工程師們又開始思考新的途徑。

  目前,在計算機組成層面,還有幾個原則性的性能提升方法。

3.1 加速大概率事件

  深度學習的整個計算過程中,99% 都是向量和矩陣計算。於是,工程師們通過用 GPU 替代 CPU,大幅度提升了深度學習的模型訓練過程。本來一個 CPU 需要跑幾小時甚至幾天的程序,GPU 只需要幾分鍾就好了。Google 更是不滿足於 GPU 的性能,進一步地推出了 TPU。

3.2 通過流水線提高性能

  將 CPU 指令的執行過程進行拆分,細化運行。這也是現代 CPU 在主頻沒有辦法提升那么多的情況下,性能仍然可以得到提升的重要原因之一。

3.3 通過預測提高性能

  預先猜測下一步該干什么,提前進行運算,而非等待上一步運行的結果。典型的例子就是在一個循環訪問數組的時候,憑經驗,你也會猜到下一步我們會訪問數組的下一項。“分支和冒險”、“局部性原理”這些 CPU 和存儲系統設計方法,其實都是在利用我們對於未來的“預測”,提前進行相應的操作,來提升我們的程序性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM