如何提升計算機性能

04 穿越功耗墻,我們該從哪些方面提升“性能”?

上一講,在講 CPU 的性能時,我們提到了這樣一個公式:

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

這么來看,如果要提升計算機的性能,我們可以從指令數、CPI 以及 CPU 主頻這三個地方入手。要搞定指令數或者 CPI,乍一看都不太容易。于是,研發 CPU 的硬件工程師們,從 80 年代開始,就挑上了 CPU 這個“軟柿子”。在 CPU 上多放一點晶體管,不斷提升 CPU 的時鐘頻率,這樣就能讓 CPU 變得更快,程序的執行時間就會縮短。

于是,從 1978 年 Intel 發布的 8086 CPU 開始,計算機的主頻從 5MHz 開始,不斷提升。1980 年代中期的 80386 能夠跑到 40MHz,1989 年的 486 能夠跑到 100MHz,直到 2000 年的奔騰 4 處理器,主頻已經到達了 1.4GHz。而消費者也在這 20 年里養成了“看主頻”買電腦的習慣。當時已經基本壟斷了桌面 CPU 市場的 Intel 更是夸下了海口,表示奔騰 4 所使用的 CPU 結構可以做到 10GHz,頗有一點“大力出奇跡”的意思。

功耗:CPU 的“人體極限”

然而,計算機科學界從來不相信“大力出奇跡”。奔騰 4 的 CPU 主頻從來沒有達到過 10GHz,最終它的主頻上限定格在 3.8GHz。這還不是最糟的,更糟糕的事情是,大家發現,奔騰 4 的主頻雖然高,但是它的實際性能卻配不上同樣的主頻。想要用在筆記本上的奔騰 4 2.4GHz 處理器,其性能只和基于奔騰 3 架構的奔騰 M 1.6GHz 處理器差不多。

于是,這一次的“大力出悲劇”,不僅讓 Intel 的對手 AMD 獲得了喘息之機,更是代表著“主頻時代”的終結。后面幾代 Intel CPU 主頻不但沒有上升,反而下降了。到如今,2019 年的最高配置 Intel i9 CPU,主頻也只不過是 5GHz 而已。相較于 1978 年到 2000 年,這 20 年里 300 倍的主頻提升,從 2000 年到現在的這 19 年,CPU 的主頻大概提高了 3 倍。

img
img

CPU 的主頻變化,在奔騰 4 時代進入了瓶頸期,圖片來源

奔騰 4 的主頻為什么沒能超過 3.8GHz 的障礙呢?答案就是功耗問題。什么是功耗問題呢?我們先看一個直觀的例子。

一個 3.8GHz 的奔騰 4 處理器,滿載功率是 130 瓦。這個 130 瓦是什么概念呢?機場允許帶上飛機的充電寶的容量上限是 100 瓦時。如果我們把這個 CPU 安在手機里面,不考慮屏幕內存之類的耗電,這個 CPU 滿載運行 45 分鐘,充電寶里面就沒電了。而 iPhone X 使用 ARM 架構的 CPU,功率則只有 4.5 瓦左右。

我們的 CPU,一般都被叫作超大規模集成電路(Very-Large-Scale Integration,VLSI)。這些電路,實際上都是一個個晶體管組合而成的。CPU 在計算,其實就是讓晶體管里面的“開關”不斷地去“打開”和“關閉”,來組合完成各種運算和功能。

想要計算得快,一方面,我們要在 CPU 里,同樣的面積里面,多放一些晶體管,也就是增加密度;另一方面,我們要讓晶體管“打開”和“關閉”得更快一點,也就是提升主頻。而這兩者,都會增加功耗,帶來耗電和散熱的問題。

這么說可能還是有點抽象,我還是給你舉一個例子。你可以把一個計算機 CPU 想象成一個巨大的工廠,里面有很多工人,相當于 CPU 上面的晶體管,互相之間協同工作。

為了工作得快一點,我們要在工廠里多塞一點人。你可能會問,為什么不把工廠造得大一點呢?這是因為,人和人之間如果離得遠了,互相之間走過去需要花的時間就會變長,這也會導致性能下降。這就好像如果 CPU 的面積大,晶體管之間的距離變大,電信號傳輸的時間就會變長,運算速度自然就慢了。

除了多塞一點人,我們還希望每個人的動作都快一點,這樣同樣的時間里就可以多干一點活兒了。這就相當于提升 CPU 主頻,但是動作快,每個人就要出汗散熱。要是太熱了,對工廠里面的人來說會中暑生病,對 CPU 來說就會崩潰出錯。

我們會在 CPU 上面抹硅脂、裝風扇,乃至用上水冷或者其他更好的散熱設備,就好像在工廠里面裝風扇、空調,發冷飲一樣。但是同樣的空間下,裝上風扇空調能夠帶來的散熱效果也是有極限的。

因此,在 CPU 里面,能夠放下的晶體管數量和晶體管的“開關”頻率也都是有限的。一個 CPU 的功率,可以用這樣一個公式來表示:

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

那么,為了要提升性能,我們需要不斷地增加晶體管數量。同樣的面積下,我們想要多放一點晶體管,就要把晶體管造得小一點。這個就是平時我們所說的提升“制程”。從 28nm 到 7nm,相當于晶體管本身變成了原來的 1?4 大小。這個就相當于我們在工廠里,同樣的活兒,我們要找瘦小一點的工人,這樣一個工廠里面就可以多一些人。我們還要提升主頻,讓開關的頻率變快,也就是要找手腳更快的工人。

img
img

但是,功耗增加太多,就會導致 CPU 散熱跟不上,這時,我們就需要降低電壓。這里有一點非常關鍵,在整個功耗的公式里面,功耗和電壓的平方是成正比的。這意味著電壓下降到原來的 1/5,整個的功耗會變成原來的 1/25。

事實上,從 5MHz 主頻的 8086 到 5GHz 主頻的 Intel i9,CPU 的電壓已經從 5V 左右下降到了 1V 左右。這也是為什么我們 CPU 的主頻提升了 1000 倍,但是功耗只增長了 40 倍。比如說,我寫這篇文章用的是 Surface Go,在這樣的輕薄筆記本上,微軟就是選擇了把電壓下降到 0.25V 的低電壓 CPU,使得筆記本能有更長的續航時間。

并行優化,理解阿姆達爾定律

雖然制程的優化和電壓的下降,在過去的 20 年里,讓我們的 CPU 性能有所提升。但是從上世紀九十年代到本世紀初,軟件工程師們所用的“面向摩爾定律編程”的套路越來越用不下去了。“寫程序不考慮性能,等明年 CPU 性能提升一倍,到時候性能自然就不成問題了”,這種想法已經不可行了。

于是,從奔騰 4 開始,Intel 意識到通過提升主頻比較“難”去實現性能提升,邊開始推出 Core Duo 這樣的多核 CPU,通過提升“吞吐率”而不是“響應時間”,來達到目的。

提升響應時間,就好比提升你用的交通工具的速度,比如原本你是開汽車,現在變成了火車乃至飛機。本來開車從上海到北京要 20 個小時,換成飛機就只要 2 個小時了,但是,在此之上,再想要提升速度就不太容易了。我們的 CPU 在奔騰 4 的年代,就好比已經到了飛機這個速度極限。

那你可能要問了,接下來該怎么辦呢?相比于給飛機提速,工程師們又想到了新的辦法,可以一次同時開 2 架、4 架乃至 8 架飛機,這就好像我們現在用的 2 核、4 核,乃至 8 核的 CPU。

雖然從上海到北京的時間沒有變,但是一次飛 8 架飛機能夠運的東西自然就變多了,也就是所謂的“吞吐率”變大了。所以,不管你有沒有需要,現在 CPU 的性能就是提升了 2 倍乃至 8 倍、16 倍。這也是一個最常見的提升性能的方式,通過并行提高性能

這個思想在很多地方都可以使用。舉個例子,我們做機器學習程序的時候,需要計算向量的點積,比如向量 W=[W0,W1,W2,…,W15]W=[W0,W1,W2,…,W15] 和向量 X=[X0,X1,X2,…,X15]X=[X0,X1,X2,…,X15],W?X=W0?X0+W1?X1+W·X=W0?X0+W1?X1+ W2?X2+…+W15?X15W2?X2+…+W15?X15。這些式子由 16 個乘法和 1 個連加組成。如果你自己一個人用筆來算的話,需要一步一步算 16 次乘法和 15 次加法。如果這個時候我們把這個人物分配給 4 個人,同時去算 W0~W3W0~W3, W4~W7W4~W7, W8~W11W8~W11, W12~W15W12~W15 這樣四個部分的結果,再由一個人進行匯總,需要的時間就會縮短。

img
img

但是,并不是所有問題,都可以通過并行提高性能來解決。如果想要使用這種思想,需要滿足這樣幾個條件。

第一,需要進行的計算,本身可以分解成幾個可以并行的任務。好比上面的乘法和加法計算,幾個人可以同時進行,不會影響最后的結果。

第二,需要能夠分解好問題,并確保幾個人的結果能夠匯總到一起。

第三,在“匯總”這個階段,是沒有辦法并行進行的,還是得順序執行,一步一步來。

這就引出了我們在進行性能優化中,常常用到的一個經驗定律,阿姆達爾定律(Amdahl’s Law)。這個定律說的就是,對于一個程序進行優化之后,處理器并行運算之后效率提升的情況。具體可以用這樣一個公式來表示:

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

在剛剛的向量點積例子里,4 個人同時計算向量的一小段點積,就是通過并行提高了這部分的計算性能。但是,這 4 個人的計算結果,最終還是要在一個人那里進行匯總相加。這部分匯總相加的時間,是不能通過并行來優化的,也就是上面的公式里面不受影響的執行時間這一部分。

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

img
img

總結延伸

我們可以看到,無論是簡單地通過提升主頻,還是增加更多的 CPU 核心數量,通過并行來提升性能,都會遇到相應的瓶頸。僅僅簡單地通過“堆硬件”的方式,在今天已經不能很好地滿足我們對于程序性能的期望了。于是,工程師們需要從其他方面開始下功夫了。

在“摩爾定律”和“并行計算”之外,在整個計算機組成層面,還有這樣幾個原則性的性能提升方法。

1.加速大概率事件。最典型的就是,過去幾年流行的深度學習,整個計算過程中,99% 都是向量和矩陣計算,于是,工程師們通過用 GPU 替代 CPU,大幅度提升了深度學習的模型訓練過程。本來一個 CPU 需要跑幾小時甚至幾天的程序,GPU 只需要幾分鐘就好了。Google 更是不滿足于 GPU 的性能,進一步地推出了 TPU。后面的文章,我也會為你講解 GPU 和 TPU 的基本構造和原理。

2.通過流水線提高性能。現代的工廠里的生產線叫“流水線”。我們可以把裝配 iPhone 這樣的任務拆分成一個個細分的任務,讓每個人都只需要處理一道工序,最大化整個工廠的生產效率。類似的,我們的 CPU 其實就是一個“運算工廠”。我們把 CPU 指令執行的過程進行拆分,細化運行,也是現代 CPU 在主頻沒有辦法提升那么多的情況下,性能仍然可以得到提升的重要原因之一。我們在后面也會講到,現代 CPU 里是如何通過流水線來提升性能的,以及反面的,過長的流水線會帶來什么新的功耗和效率上的負面影響。

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

好了,到這里,我們講完了計算機組成原理這門課的“前情提要”。一方面,整個組成乃至體系結構,都是基于馮·諾依曼架構組成的軟硬件一體的解決方案。另一方面,你需要明白的就是,這里面的方方面面的設計和考慮,除了體系結構層面的抽象和通用性之外,核心需要考慮的是“性能”問題。

接下來,我們就要開始深入組成原理,從一個程序的運行講起,開始我們的“機器指令”之旅。

本文由 mdnice 多平臺發布

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zookeeper框架

事務ID Znode的創建刪除,更改內容等都是作為zookeeper的事務進行執行的。 對于每一個事務請求,zookeeper都會為其分配一個全局唯一的事務ID,從ID可以識別出事務的全局順序。 節點特性 czxid:create zxid,數據節點創建時的事務ID mzxid&…

基于ZYNQ的PCIE高速數據采集卡的設計(一)

作為信息處理的第一步,數據采集的作用越來越重要。目前,數據采集已經在航 空、民用、軍事、醫療等領域得到廣泛應用。隨著相關技術的不斷發展,信號頻率越 來高,帶寬越來越大,使得數據采集技術逐漸向高速大數據的方向…

【python】優化docker鏡像體積

背景 測試腳本的最終所構成的鏡像體積偏大,項目提出整改 實現思路 1.測試基礎鏡像,更換為更小的 參見:python 多階段構建docker鏡像,有效減少鏡像大小 - 知乎 2.去掉實際未使用的依賴庫

幻獸帕魯專用服務器搭建之Linux部署配置教程

大家好我是飛飛,上一期我分享了Windows系統的幻獸帕魯服務器搭建教程。因為幻獸帕魯這游戲對服務器的配置有一定的要求,很多小伙伴就尋思用Linux系統搭建占用會不會小一點?有計算機基礎的小伙伴都知道Linux系統和Windows系統相比,…

【Linux】實時查看服務器信息

查看服務器CPU使用率 使用命令mpstat 1。這里的1表示每隔1秒更新一次CPU使用率。如果系統未安裝mpstat,可以通過安裝sysstat包來獲取它。 在基于Debian的系統(如Ubuntu)上,使用命令: sudo apt-get update sudo apt-…

JavaScript 數據類型詳解的教程

在JavaScript中,數據類型是非常重要的概念,了解數據類型有助于我們更好地操作數據以及編寫高效的代碼。本教程將詳細介紹JavaScript中的各種數據類型,包括基本數據類型和復雜數據類型。 基本數據類型 1. 數值(Number) 在JavaScript中&…

考研復試類比社團招新,無所謂“公平”,導師選誰都是他的權力

這篇文章是抖音和b站上上傳的同名視頻的原文稿件,感興趣的csdn用戶可以關注我的抖音和b站賬號(GeekPower極客力量)。同時這篇文章也為視頻觀眾提供方便,可以更加冷靜地分析和思考。文章同時在知乎發表。 我考研一戰的時候計算機考…

MySQL 主從復制配置指南

MySQL 主從復制配置指南 MySQL主從復制允許數據從一個MySQL數據庫服務器(主服務器)復制到一個或多個MySQL數據庫服務器(從服務器)。這是一種常用的數據冗余和備份方法,也可以用于負載均衡。 前提條件 主服務器和從服…

【詳識JAVA語言】面向對象程序三大特性之一:封裝

封裝的概念 面向對象程序三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說 就是套殼屏蔽細節。 比如:對于電腦這樣一個復雜的設備,提供給用戶的就只是:開關機、通…

飛槳模型轉ONNX模型教程

文章目錄 飛槳模型轉ONNX模型教程1. ONNX簡介2. Paddle2ONNX安裝3. 獲取Paddle2ONNX模型庫4. 飛槳轉ONNX教程4.1 飛槳訓練模型導出為ONNX模型4.2 飛槳部署模型轉為ONNX模型4.3 驗證ONNX模型4.4 使用ONNX模型進行推理 5. 注意事項 飛槳模型轉ONNX模型教程 1. ONNX簡介 ONNX是一…

管理系統提升:列表頁構成要素,拒絕千篇一律

大家伙,我是大千UI工場,專注UI知識案例分享和接單,本期帶來B端系統列表頁的分享,歡迎大家關注、互動交流。 一、什么是列表頁 管理系統列表頁是指管理系統中用于展示和管理數據的頁面,通常以表格或列表的形式呈現。列…

【appium】APP元素操作Api、androidDriver操作Api

一、元素操作Api 主要是做斷言 text 1、click()——觸發當前元素的點擊事件 2、sendKeys(...)——輸入數據 3、clear()——清空內容 4、getAttribute() ——獲取屬性值 字符串類型屬性: content-desc(返回content-desc屬性值) text(返…

C語言中結構體成員訪問操作符的含義及其用法

1.直接訪問操作符 用法&#xff1a;結構體名.成員名。 含義&#xff1a;直接訪問結構體中的成員變量。 示例&#xff1a; #include<stdio.h> struct student {char name[20];int age; }; int main() {//定義了一個結構體數組arrstruct student arr[4] { {"cxk&q…

產品經理相關的學習網站

一、原型案例 AxureShop產品原型網&#xff1a; https://www.axureshop.com/ 人人都是產品經理&#xff1a;https://www.woshipm.com/ 二、如何找各類圖標、各類圖表 各類圖標&#xff1a; IconPark&#xff1b; 各類圖表&#xff1a;echarts.apache.org&#xff08;柱狀圖、餅…

深入淺出HTTP/2預檢請求(CORS Preflight Request)

前言 在現代Web開發中&#xff0c;跨域資源共享&#xff08;Cross-Origin Resource Sharing&#xff0c;簡稱CORS&#xff09;是一項關鍵技術&#xff0c;它允許瀏覽器在不同源之間安全地執行Ajax請求。當一個來自不同源的請求涉及到一些特殊 HTTP 頭部或者方法時&#xff0c;…

23端口登錄的Telnet命令+傳輸協議FTP命令

一、23端口登錄的Telnet命令 Telnet是傳輸控制協議/互聯網協議&#xff08;TCP/IP&#xff09;網絡&#xff08;如Internet&#xff09;的登錄和仿真程序&#xff0c;主要用于Internet會話。基本功能是允許用戶登錄進入遠程主機程序。 常用的Telnet命令 Telnet命令的格式為&…

有人吐槽:可視化大屏面向領導的設計,真相是這樣嗎?

某些老鐵的態度很極端&#xff0c;看到可視化大屏頁面就一口斷定&#xff0c;除了討好領導之外&#xff0c;屁用沒有。真相是這樣嗎&#xff1f;貝格前端工場嘗試給老鐵們分析下。 一、可視化大屏確實要面向領導&#xff0c;但不是討好領導 可視化大屏的設計需要考慮領導和管理…

整理的一些腦模板及節點的名稱

整理的一些腦模板及節點的名稱 前言模板簡介AAL90模板HOA112 模板 前言 自己看論文找的&#xff0c;因為有些數據集網站的確有點難找到模板的名稱等等。所以主要是看一些論文&#xff0c;因為有文獻&#xff0c;所以更有保障一些。當然也有一些在數據網站上比較容易找到所以一…

社交軟件----

story feed(聚合服務) 查 聯表查詢 表冗余字段java拼接user_service查詢用戶的avator和nick_namefollow_service查詢我是否關注item_service查詢我的in_box in_box如何設計redis zset 關注 數據庫設計 MySQL 根據ER圖設計表 create table follow(id bigint unsigned n…

小興教你做平衡小車-stm32程序開發(按鍵掃描)

文章目錄 1 單片機最小系統板按鍵原理圖介紹2 庫函數程序設計3 寄存器程序設計4 效果展示 1 單片機最小系統板按鍵原理圖介紹 從圖中看出單片機的PB12引腳接到了按鍵上。 根據按鍵的原理圖&#xff0c;可以分析得到&#xff0c;如果不按下按鍵的時候&#xff0c;引腳輸入的是…