在大二上學期學習數字邏輯的過程中,我對計算機如何運作產生了興趣,因此開了這個系列來記錄自己在這方面的學習過程,此前三篇分別是:
本來嘛,按照這個系列的節奏,下一篇就是馮諾依曼結構或者是CPU的內部結構(事實上CPU的內部結構與原理已經在學了來著),再下一篇可能還會講講資訊理論,但這學期開了一門專業課叫做計算機組成原理與體系結構,正好就是在講這方面的知識,因此接下來我會結合課本和此前讀的書進行系列的更新。並將實踐CPU的記錄也更新到這個系列中來。
今天這篇主要總結課本第一章的內容,即計算機組成與體系結構的基礎概念,比如電腦科學、設計思想、程式、硬體結構、效能評估等。本文可能有很多生詞,我盡力給出合理的批註。實際上其中很多東西大學計算機基礎可能都講了,但不幸,我們學院是沒有要求這門基礎課的(取而代之的是機械製圖)。
寫的有點多,很多是對知識的複述,後續我會對文章進行精簡,系列後面也會注意。
參考資料:
-
Computer Organization and Design the 5th Edition,即計算機組成與設計硬體軟體介面第五版
-
課件,由於是英文且只是老師的思路,所以是輔助參考
00 一些前言
00-1 這門課的重要性
作為一個計算機系的學生,從學科素養上講,如果四年學習下來,不瞭解DRAM、流水線、多級快取、I/O介面、虛擬記憶體這些概念,實在是說不過去,從日常生活上講,學了計算機還不懂得如何選購一臺效能較佳的電腦,也說不過去。
此外,這部分內容對於以後想要從事晶片設計、編譯器開發、作業系統設計等底層方向的同學是十分重要的。就算不從事這些方面,只從事軟體開發,這部分內容也會讓你對於優化程式或專案和bug除錯有更深的理解,對於特定的APP可以選用合適的硬體。
舉個例子,如果我們要進行一個大型的矩陣乘法運算,我們應用這門課的知識,就可以對其進行較深層次的優化,使其效能提高200倍:
-
採用資料級並行DLP(SIMD),在第三章中學到。效能提高3.8倍;
-
採用指令級並行ILP,迴圈展開開發多指令發射、亂序執行硬體,第四章。效能提高2.3倍;
-
記憶體以及cache的儲存器層次優化,第五章。2.5倍;
-
執行緒級並行,在多核上並行迴圈,第六章。14倍;
在課程學習開始前,還可以先思考幾個問題:
-
如何評估一個程式的效能?如何改程式序效能?
-
什麼是軟硬體之間的介面?軟體如何指導硬體完成工作?
-
如何進行記憶體管理:資料是怎麼被放置的,放置在哪裡?
-
如何進行執行緒管理:如何寫一個多執行緒的程式?
-
從硬體的角度講,哪些操作實現容易或者快一點?
如果無法理解這些問題,決定優劣與否,就會墮入反覆實驗的複雜過程,反之,則是一個深入分析的科學過程。
00-2 關於電腦科學
電腦科學的發展簡史我就略過了,沒啥意思。回頭有空單出一篇這個文。
00-2-1 有關 IT | 資訊科學
IT(Inforamation Technology)是資訊理論和計算理論的結合,兩者共同奠基和定義了資訊科學,資訊理論方面有夏農的資訊理論(採集定理),計算理論即圖靈機和馮-諾伊曼結構。我們學習的電腦科學與技術偏向於計算理論,資訊理論主要是電子資訊方面在學習。
當然,有機會我會了解一些資訊方面的知識。
00-2-2 計算機應用分類
-
個人電腦
強調對個人提供良好效能,價格較低,可執行第三方軟體。
一般有4-12個CPU(中央處理單元Central Process Unit),記憶體在GB級(也有TB級的)
-
伺服器
用於執行大型程式的計算機,可以支援多使用者的並行使用,一般通過網路訪問。
高階伺服器稱為超級計算機,一般由海量處理器組成(上百萬CPU),記憶體為TB級,能耗很大但很高效;用於高階科學和工程計算。
注意這裡的Gb和GB並不相同,1Gb(gigabit) == 156MB。
-
嵌入式計算機
即嵌入到其他裝置裡的計算機,執行預先設定好的一個或一組應用程式,是數量最多的一類計算機,用於如汽車、電視等的微處理器和處理器網路;
通常程式和硬體整合在一起,一起交付給使用者。此類計算機關鍵在於可靠性、低成本和低功耗。
許多嵌入式處理器使用處理器核,處理器核就是利用硬體描述語言(比如Verilog)描述的處理器版本,這樣設計者就能把處理器和其他硬體整合在一塊晶片上。
00-2-3 後PC時代
-
個人移動裝置(Personal Mobile Device PMD)
包括手機、平板、智慧手錶、甚至智慧眼鏡;電池供電,下載軟體app進行功能實現,無鍵盤滑鼠,採用觸控式螢幕以及語音作為輸入。
-
雲端計算
替代傳統伺服器,依賴於倉儲規模計算機的巨型資料中心(Warehouse Scale Computer WSC),在網路上提供服務的大伺服器叢集,運營商根據需求出租一部分為PMD提供軟體服務。典型例子是Web搜尋和社交網路。
PMD / WSC是硬體工業的革命,通過雲端計算實現的軟體即服務是軟體工業的革命。
00-3 通用計算機結構
這個課程主要研究的是通用計算機的基本結構與組成,我們每一章都會學習一部分,下圖是一個概要,後面硬體概念的部分還會提到:
當然,講到通用計算機結構,離不開馮·諾伊曼結構:
-
儲存器 / 記憶體Memory:儲存資訊(資料/程式)
-
運算器:計算、處理資訊
-
輸入裝置:把資訊放入電腦的途徑
-
輸出裝置:電腦輸出資訊的途徑
-
控制器:確保以上各個部分在正確的時間正確地執行它們的任務
00-4 理解程式效能
此前寫的本系列的第一篇:《程式是如何執行的》是很淺薄的,正如前面提到的學習這門課的重要性那部分所提到的例子,程式效能的理解是貫穿這個課程的核心問題之一。
程式的效能取決於:
軟/硬體組成 | 如何影響效能 | 知識座標 |
---|---|---|
演算法 | 決定了原始碼級語句的數量和I/O運算元量 | 演算法與資料結構 |
程式語言、編譯器和體系結構 | 決定了每條原始碼級語句對應的計算機指令數量 | 本書第2、3章 |
處理器和儲存系統 | 決定了指令的執行速度 | 第4、5、6章 |
I/O系統 | 決定了I/O操作可能的執行速度 | 第4、5、6章 |
人類對於效能的要求是沒有上限的,新的演算法、新的應用、新的概念、對製造工藝進行改進、對計算機體系結構進行改進等
01 計算機系統結構中的8個偉大思想
-
面向摩爾定律的設計
即單晶片上的整合度每18~24月翻一番,計算機設計者必須預測設計完成時的工藝水平,而不是設計開始時的。
同時DRAM(動態隨機存取儲存器)是兩年翻一番,處理器是1.5年翻一番(這個在變慢,磁碟disk是一年翻一番
-
抽象簡化設計(abstraction)
用抽象表示不同的設計層次,在高層次中忽略低層次的細節。抽象層次中的關鍵介面是指令級體系結構,這點在後面會繼續提到,這時硬體和底層軟體的介面。
-
加速大概率事件(common case fast)
大概率事件通常比較簡單,所以易於提高效能。
-
通過並行提高效能(parallel performance)
前面也提到了,會學到很多並行操作來提高效能。
-
通過流水線提高效能(pipelining)
流水線是一個特別的並行性場景,可以理解為一個水管,每一個模組是其中的一個管子。
-
通過預測提高效能(prediction)
“求人准許不如求人原諒”,即假定從錯誤預測恢復的代價不高並且預測的準確率相對比較高,那麼就可以通過預測的方式提前開始某些操作,這肯定比得到相關指令再啟動要快。
-
儲存器層次(hierarchy of memory)
儲存器的速度影響效能,儲存器的容量限制瞭解題的規模,而當今計算機系統中儲存器的cost佔了主要部分。所以儲存器的設計追求速度更快、容量更大、價格更便宜。設計者們的辦法之一就是設計儲存器層次:
速度最快、容量最小(同時價格也最昂貴)的儲存器位於頂層,用於及時取放資料,而速度最慢、容量最大的儲存其位於最底層。就像一個三角塔一樣。
而這樣設計,從外部以程式設計師的視角看來,就實現了儲存器高速度、大容量且便宜的整體特徵。
-
通過冗餘提高可靠性
計算機的可靠性可以通過使用冗餘部件的方式提高。就像遠行的汽車帶著的備胎,當輪胎出問題時,更換後可以繼續工作。
02 程式概念入門
這部分是對該系列第一篇
02-1 系統軟體
計算機硬體只能執行很簡單的低階指令,我們編寫的應用程式到這些低階指令之間,需要通過多個軟體層次(系統軟體)將高層次的語句操作逐層解釋/翻譯為簡單的計算機指令。這可以算作01部分抽象思想的一個體現。
如上圖所示,外層是應用軟體,在其與中心——硬體之間有一層系統軟體。系統軟體是提供常用服務的軟體,包括作業系統、編譯程式、載入程式、彙編程式等。
其中,作業系統和編譯程式對於現代計算機是必要的。
-
作業系統是為了讓程式更好地在計算機上執行而管理計算機資源的監控程式。是使用者程式與硬體之間的介面,為使用者提供各種基礎服務和監控功能,最重要的功能如下:
-
處理基本的輸入輸出操作;
-
分配外存和記憶體;
-
為多個應用程式提供共享計算機資源的服務;
常見的作業系統有Windows,Linux,iOS等。
在作業系統中,封裝了I/O操作、儲存器分配和其他低階的系統功能細節,使得程式設計師不需要再過多注意這些瑣碎的細節。
-
-
編譯程式將高階程式語言如C++、Java等寫成的程式翻譯成硬體能夠執行的指令。
02-2 從高階語言到硬體語言
要想控制底層的電子硬體,就要描述電子硬體的狀態:通、斷。計算機中用1、0來描述。因此計算機語言是二進位制數,每個字元就是二進位制數字中的一個二進位制位 / 一位(bit),
我們對計算機的命令就是指令,即能被計算機識別、理解並執行的命令位串,比如1000110010100000,表示兩個數相加。可見這串數字既描述了指令,又描述了資料。這是計算機的基礎。
最開始,程式設計師就是通過二進位制將指令傳達給計算機的,但這很難,後來發明了助記符,手工比對二進位制,但依然繁瑣;隨後設計人員就開發了被稱為彙編程式的軟體,可以將助記符自動翻譯為對應的二進位制。比如寫下:
add A,B
彙編程式就會將該符號翻譯為表示兩數相加的機器指令
1000110010100000
上面的助記符所代表的符號語言今天仍然在使用,即組合語言,而機器能夠理解的二進位制語言被稱為機器語言。
雖然這已經是一個巨大的進步,但依然與人工演算的符號相差很多,並且需要程式設計師完全像計算機一樣思考。
於是更進一步的抽象誕生了高階程式語言及其編譯語言,大大提高了軟體生產率。下圖是這些程式與程式語言的關係圖:
可以看到,C語言經過編譯程式設計組合語言程式,再經過彙編變為機器語言。
留意一下,這裡的轉變都是軟體層面的。
編譯程式的出現,使得程式設計師可以寫
A+B
來表示
add A,B
編譯程式會自動實現前者向後者的轉換。這樣做好處顯然多多,解放了程式設計師的思考難度、提高了生產效率、提高了程式相對於計算機的獨立性。
02-3 關於(指令集)體系結構
講到這裡,我們可能還是不明白課程名字中的體系結構是什麼意思,與組成原理又有什麼不同呢,我此前一直認為組原是指概念,而體系結構是組成計算機的硬體,實際上:
計算機體系結構(architecture) = 指令集(ISA)+ 計算機組成(microarchitecture)
為什麼放在這裡講而不是前言,是因為指令級體系結構使用了抽象的設計思想,是最重要的抽象之一,也是程式從高階到底層中的關鍵一環。
計算機體系結構的存在可以讓設計者討論更巨集觀的設計方法,而不需要考慮硬體電路的狀態;這一抽象層分開了我們解決問題的軟體思路和硬體電路的具體實現,就比如我們寫出一個時鐘程式,實現計時、顯示時間、設定鬧鐘等功能,就不必考慮底層的LED、時鐘控制電路等。體系結構在計算機系統的層次如下:
自下而上,依次為電子管 -> 電路 -> 數字邏輯 / 硬體邏輯 -> 微體系結構 -> 指令級體系結構 -> 執行時系統(作業系統級)-> 程式語言 -> 演算法 -> 問題。同時這也展示了計算機系統中的抽象層次;
指令級體系結構就在ISA那一層,負責軟體向硬體的過渡。
微體系結構也稱微處理器體系結構,是在計算機工程中,將一種給定的 指令集架構 在 處理器 中執行的方法。
執行時系統的作用與作業系統相似,主要是進行記憶體管理和任務排程等。
提供給程式設計師的基本指令及和作業系統介面合稱為應用二進位制介面(Application Binary Interface ABI)
回憶前文,程式從軟體再向下到硬體描述,就要通過體系結構(指令集和微體系結構)的對機器語言的翻譯規範、以及特定處理器實現向硬體指令和資料的轉化:
有沒有過這麼一個問題,即組成原理和體系結構有什麼區別?以下參考了
舉個例子:
一臺機器是否具備乘法指令的功能,這是計算機體系結構的問題;
如何實現這個乘法指令的,使用專門的乘法電路還是採用連續相加的加法電路等,這是計算機組成的問題
日常生活的應用
許多計算機廠商向使用者提供一系列體系結構相同(實現邏輯)的計算機,而它們的組成(具體排布、實現方式)卻有很大的差異,因此只知道結構不知道組成是選不好適合的電腦的
專業一點的說
計算機體系結構是指那些能夠被程式設計師所見到的計算機屬性。所看到的計算機屬性,包括指令集、資料型別、儲存器定址技術、I/O機理等(抽象,概念性)
比如IBM PC和 RS6000 是具有不同的指令集、資料型別、儲存器定址技術、I/O機理,所以這兩種機器的結構各不相同。
從體系結構出發解決問題更像是一個建築設計師;
計算機組成就是如何具體實現這些計算機結構所體現的屬性,比如硬體細節,指令集體現了機器的屬性,這是結構問題。但指令的實現,比如如何取指令、分析指令、取運算元等等,這些都是計算機組成問題;
從組成原理出發解決問題更像是一個建築(土木)工程師;
03 ⭐硬體概念入門 | 馮·諾依曼體系結構
每臺計算機的硬體都要完成相同的幾個基本功能:
-
輸入資料
-
輸出資料
-
處理資料
-
儲存資料
即計算機是由完成輸入、輸出、處理、儲存資料任務的部件組成的,具體講有五個部件:輸入、輸出、儲存器、資料通路(運算器)、控制器。這也是馮·諾依曼結構的體現。
處理器從邏輯上包括了資料通路和控制器。前者負責算數運算,後者負責指導資料通路、儲存器和I/O裝置按照程式指令正確執行。
處理器是計算機中最活躍的部分,有時人們也把處理器稱為中央處理單元,即CPU;
03-1 一些實物結構
不同的計算機裝置的內部模組安排不盡相同,我們可以從其拆卸外殼後的結構排布大致看出一些設計思想與理念。這部分只能是列舉一些,進一步感興趣可以看一些拆解記錄和拆解視訊。
03-1-1 iPad Air 2邏輯主機板
-
紅色圈中是一個蘋果APL1012 A8X 64位處理器,
-
橘色爾必達/美光q科技的F8164A3MD的2Gb記憶體,
-
黃色是SK海力士H2JTDG8UD1BMR的 128Gb(16GB)NAND快閃記憶體
-
綠色:NXP 65V10 NFC模組(同iPhone 6/iPhone 6 Plus所用相同)
-
藍色是蘋果(Cirrus Logic) 338S1213音訊解碼器,
-
紫色是ARM Cortex-M3微控制器(蘋果M8協處理器);
-
黑色是Murata 339S02541 Wi-Fi模組。
03-1-2 奔騰四處理器
一般給出下面兩個圖,我們就能瞭解一個硬體內部的結構和組成。
可以看到組成原理圖中左上角的是多級記憶體模組,右上角是數字和邏輯處理單元、左下角是前臺(解碼器、快取器trace cache、分支預測等)、右下角是亂序執行單元。每個框圖裡分別是內部的一些邏輯結構。
這個是系統結構圖,更加接近硬體的真實情況。
03-2 輸入裝置和輸出裝置
這部分會在第五第六章講解,現在介紹一些基本硬體。
03-2-1 顯示器
圖形顯示器無疑是最有人氣的I/O裝置,PMD大多使用輕巧、低功耗的液晶顯示(Liquid Crystal Display LCD),LCD不是光源,而是利用液晶的光學原理控制光的傳輸。
大多數LCD顯示器採用動態矩陣顯示(active matrix display),每一個畫素都由一個電晶體控制電流,這樣使影像更清晰。而彩色動態矩陣LCD中,還有一個紅-綠-藍屏決定三種顏色分量的強度,這時每個畫素點需要3個電晶體控制。
畫素:影像元素的最小單元;
影像由畫素矩陣組成,可以表示為二進位制位的矩陣(點陣圖bit map),矩陣的大小反映了螢幕的尺寸以及解析度,彩色顯示器用8位標識每個三原色,每個畫素就是24位。
這一點我此前在擴充數字邏輯課程知識的時候,用FPGA+VGA顯示矩陣色彩的時候接觸過,但沒有及時總結,預計數字邏輯實踐系列後續會總結這個過程。
動態矩陣顯示:液晶顯示技術;
03-2-2 觸控式螢幕
PC使用LCD螢幕,而後PC的平板和智慧手機使用觸控式螢幕進一步替代了鍵盤和滑鼠,使用者體驗得到了很大的提升。
03-3 處理器
這部分會在第四章講解。
處理器從邏輯上包括兩個部分:資料通路和控制器。分別相當於處理器 的肌肉和大腦,
上圖是一個蘋果A5的處理器積體電路結構圖。晶片尺寸位12.1mm×10.1mm,採用45nm工藝,中間靠左側的是兩個ARM處理器,左上角是有4個資料通路的圖形處理器單元(GPU Graphic Processor Unit);左下角以及底部是與主存的介面。
處理器目前的發展趨勢是向多核處理器轉變,這就是並行性革命的發展。多核處理器的意思就是再同一塊微處理器中加入多個處理器,增加處理事務的速度(單位時間內完成的任務數,吞吐率)。
我們所說的四核微處理器,其實就是有四個處理器的微處理器、或是四個core的晶片。
後續有機會,我會進一步瞭解並行程式設計。
03-4 儲存器
03-1-1的iPad Air2的主機板介紹中提到了兩個儲存器晶片,每塊容量1Gb也就是156MB。
記憶體是程式執行時的儲存空間,同時也儲存程式執行時使用的資料。記憶體由多片DRAM晶片組成(DRAM:動態隨機訪問儲存器 dynamic random access memory),用來承載程式的指令和資料。
DRAM的特點是無論資料儲存在什麼位置,訪問的時間基本一致。這一點與序列訪問記憶體的磁帶不同。
提到儲存器,其實03-3中的處理器內部也使用一種儲存器,即快取(cache memory),它的特點是小而快,作為連線高速處理器和較低速記憶體的一個緩衝區。這一點前面八大思想中也有提及。
cache採用的是另一種儲存技術:靜態隨機訪問儲存器SRAM,速度更快,價格高一點。
快取和記憶體(也是主存)是儲存器層次中的兩層。接下來一節會完整介紹儲存器的全部層次:
03-5 資料儲存安全
前面提到的記憶體是易失性儲存器(比如DVD,關掉電源,記錄內容不會丟失,DVD採用的是非易失性儲存器),我們需要解決計算機資料在關掉電源之後的儲存。
對於易失性儲存器和非易失性儲存器,前者也稱主存(DRAM技術),後者也稱二級儲存器,這是繼前文的快取、記憶體下更低的一層,用來儲存兩次執行之間的程式和資料。我們平時叫的磁碟(magnetic disk),就是二級儲存器的一種。
目前PMD中快閃記憶體(flash memory)使用的更多:
-
快閃記憶體比DRAM更慢、價格便宜很多,但要比磁碟高一點;
-
但是快閃記憶體在體積、電容、可靠性和能耗方面都比磁碟優秀;
-
但是,快閃記憶體在寫入100000~1000000次後會老化或損壞;
-
所以相應的,使用快閃記憶體的檔案系統需要記錄寫入操作的數目,並考慮避免儲存器損壞的辦法。
03-6 計算機間通訊
計算機除了上面提到的功能,還需要與其他計算機通訊,即計算機網路功能。
聯網的計算機有以下優點:
-
通訊:計算機之間高速交換資訊;
-
資源共享:有些I/O裝置可以由網路上的計算機共享,而不必每臺計算機都有;
-
遠距離訪問:在很遠的地方通過別的裝置訪問計算機。
網路型別:
-
乙太網
-
最常見的網路型別,傳輸距離長(1000千米)、傳輸速率高(40Gbps),可以將同一層樓的計算機連線起來,這就是區域網的一個例子。
-
區域網是在一個小的區域性地區使用的傳輸資料的網路。
-
區域網通過交換機連線,可以提供路由和安全服務。
-
-
廣域網
-
支援全球資訊網,以光纖為基礎像通訊公司租用。
-
將區域擴充套件到幾百千米範圍的網路。
-
04 效能
好了,下面我們終於要來探討一些與買電腦有關一點的事情了。這也是本文最後的實質性內容。
04-1 效能的定義與衡量
在評價效能之前,我們需要給出效能的評價標準,是否計算機速度快就是好呢?恐怕也不盡然。對於效能,我們有很多描述方法,用於在不同情境下的效能衡量。下面這些是有關效能的一些名詞。
-
響應時間
-
計算機完成某任務所需要的全部時間,包括硬碟訪問、記憶體訪問、I/O活動、作業系統開銷以及CPU執行時間;
-
對於普通使用者以及PMD而言,響應時間可能最重要,這會影響工作效能或者遊戲體驗;
-
-
吞吐率
-
也叫頻寬,表示單位時間內完成的任務數;
-
而對於伺服器,會更注重吞吐率。
-
-
二者關係
-
降低響應時間,基本上就會增加頻寬;
-
採用多處理器分別處理獨立任務,只能增加頻寬。
-
-
效能
-
效能 = 1 / 響應時間
-
此後在前幾篇子系列文中,會著重討論響應時間代表的效能,但本文會討論另一個概念:
-
-
CPU時間
-
但問題很明顯,同一個處理器上並不是只執行一個任務,我們要把執行自己任務的時間和一般的響應時間區別開來;
-
CPU(執行)時間就只表示在CPU上花費的時間,不包括I/O操作等;
-
當然,我們感受到的還是響應時間,而不是CPU時間;
-
CPU時間進一步劃分:
-
·CPU用於使用者程式的時間:使用者CPU時間;
-
作業系統為使用者服務花費的CPU時間:系統CPU時間;
-
-
相應地:
-
CPU效能描述使用者CPU時間;
-
系統效能描述空載系統的響應時間;
-
-
計算機效能既可以指響應時間度量,也適用於CPU時間的度量;
-
下面我們討論的重點就是CPU效能,響應時間的度量會放在後面講;
-
04-2 CPU的效能
CPU效能是使用者和設計者都看重的效能。
-
公式一:一個程式的CPU執行時間 = 一個程式的CPU時鐘週期數 × 時鐘週期時間
-
公式二:一個程式的CPU執行時間 = 一個程式的CPU時鐘週期數 / 時脈頻率
由以上式子可知,減少等號右側物理量,就可以改進效能,但這種改進並不容易。有時減少時鐘週期數還會引起時鐘週期時間的增加。
雖然目前電腦會有不同的時脈頻率,但我們還是使用一個平均值來做。
04-3 指令的效能
繼續對上面的公式進行考量,我們可以對時鐘週期數進行細分,執行任務的是程式,而執行程式的基本單元是指令,所以可以有:
-
公式三:CPU時鐘週期數 = 程式指令數 × CPI
CPI表示執行每條指令所需的時鐘週期數的平均值;同時IPC是它的倒數(instruction per clock cycle)
指令數:某程式所需要的總指令數;
公式四:CPI = CPU時鐘週期數 / 程式指令總數
04-4 ⭐效能公式
綜上所述(04-2以及04-3),CPU效能公式為:
-
公式五:CPU時間 = 指令數 × CPI × 時鐘週期時間
-
公式六:CPU時間 = 指令數 × CPI / 時脈頻率
-
效能的評估取決於時間,指令多少和CPI都不能單獨決定效能,公式右側的子集都不能決定效能;
-
下面是對於公式五的進一步分析,再具體到測量單位指標:
-
效能的分量 測量單位 程式的CPU時間 程式執行的執行時間,s 指令數目 程式執行的指令數 CPI 每條指令平均執行的時鐘週期數 時鐘週期時間 每個時鐘週期的長度,s
-
-
公式七:CPU執行時間 = 時間 / 程式數 = 指令數 / 程式 數× 時鐘週期數 / 指令數 × 時間 / 時鐘週期
04-5 程式效能的評估
上面00-4理解程式效能中,介紹過程式效能的影響因素,現在拿上面公式中的因子再套用一下:
硬體或軟體因素 | 影響 | 影響方式 |
---|---|---|
演算法 | 指令數,可能會影響CPI | 演算法決定了源程式指令的數目,進而決定了CPU執行指令的數目。同時演算法也可能影響CPI,比如使用過多除法,CPI會變大 |
程式語言 | 指令數,CPI | 程式語言必然與指令數掛鉤,因為要翻譯為指令;影響CPI的方式比如Java支援資料抽象而進行的間接呼叫會使得CPI指令變大 |
編譯程式 | 指令數,CPI | 決定源程式到指令的翻譯過程,所以編譯程式的效率會影響指令和CPI兩者 |
指令集體系結構 | 指令數,CPI,時脈頻率 | 雖然具體過程還不知道,但指令集體系結構會影響這三者。⭐ |
04-6 指令集的效能
衡量指令集的效能的方式有很多:
-
設計指標:
-
能否被實現;
-
多長時間;
-
代價如何;
-
-
靜態指標:
-
在該指令集下程式的記憶體佔用;
-
-
動態指標:
-
對於一個程式需要執行多少指令?
-
處理器需要多少位元組的空間來執行程式?
-
每個指令需要幾個時鐘週期?
-
-
最佳的指標是執行時間。
04-7 SPEC基準 | Amdahl's law | MIPS
04-7-1
雖然執行時間對於效能的衡量已經很好了,但人們還是希望建立一個專門用於測量效能的尺度。
前面提到過,加速大概率事件是一種重要思想,但哪些事件是大概率事件呢?這也需要一個對基準測試程式集合進行預測。
SPEC(system performance evaluation cooperative)是由許多計算機銷售商共同支援的組織,它建立了主要面向處理器效能的基準程式集:
-
是一種對於固定程式集合執行時間的衡量手段,會基於集合里程式的執行情況給出一個評級;
評級是程式執行時間經標準化處理後的幾何平均數,即乘積後開平方;
我們知道算術平均,每個數一視同仁;幾何平均指明瞭引數的集中趨勢,中位數貢獻更大;調和平均(調和不等式),傾向於序列中較小的數值。
-
這個評級能夠反映特定CPU、記憶體系統、I/O系統、作業系統、編譯器的效能;
-
支援對不同的計算機系統進行簡單的比較;
當然還有另外一些基準程式集,如PARSEC、SPLASH等
-
此外SPEC還建立了對於功耗的基準測試程式,功能和上面相似,計算公式不同:
評級 = Σ工作負載在每10%增量處的效能 / Σ對應的功耗和;
如果是順序看到這裡,功耗在05部分;
04-7-2 阿姆達爾定律
這一定律是加速大概率事件思想的量化總結。當我們對系統的某個部分加速時,其對系統的整體效能影響取決於該部分所佔比例和加速的程度。
-
公式:改進後的執行時間 = 改進部分的原執行時間 / 改程式度+ 不受影響的執行時間;⭐
-
舉個例子來說吧,100s的原總時長中,我們改善其中的50s,執行速度改善到原來的5倍,則現時長 = 50 / 5 + 50 = 60;
-
從例子也知道,這種優化存在一種極限,或是說,我們每次做相同程度的優化,收益在遞減(再對同一部分進行一次5倍的優化,總時長變化在減小);
我們可以使用這個定律來進行一些效能提升的預測。
04-7-3 MIPS
這裡的MIPS不是指令集的名字,這是一種新的效能衡量方法,跟前面所有以時間度量的方法不同。
MIPS(million instruction per second,每秒百萬條指令):
-
公式:MIPS = 指令數 / (執行時間 × 106)
-
表示指令執行的速率,規定效能與時間成反比,那麼高MIPS值的計算機就越快,這符合直覺。
-
但是這也有問題,很明顯,指令之間並不相同。
-
不同指令集的計算機不能比較。
-
就算在同一計算機上,對於不同的程式也會有不同的MIPS值。
-
有些指令的執行速度快於另一些,這也可能導致MIPS值大小與真正效能好壞的差距。
-
05 能耗 | 功耗
05-1 計算
幾個公式:
-
能耗由兩部分組成:動態能耗和靜態能耗;
靜態能耗是由洩漏電流造成的,顧名思義它在電晶體不工作時也會產生。
-
動態能耗 = k × 負載電容 × 電壓²
動態能耗是電晶體狀態翻轉過程產生的能耗,0-1-0或是1-0-1
-
一個電晶體動態能耗 = 0.5 × k × 負載電容 × 電壓²
-
一個電晶體動態功耗 = 0.5 × 負載電容 × 電壓² × 開關頻率
開關頻率由時脈頻率決定
負載電容是導線和電晶體的總電容
-
相對功耗 = P新 / P舊
面向效能的設計和面向能量效率的設計有些目標是重合的。舉個例子:
1GHz的處理器原本100s的執行總時長,70W用於動態能耗,30W靜態能耗,現在升為1.2GHz,請問能耗怎麼變化?
答:降低。
現能量 = (70 × 1.2 + 30) × 100 / 1.2 = 9500J;
原能量 = 100W × 100s = 10000J.
目前功耗達到了一個瓶頸。
05-2
-
功耗(Power),功率的損耗,在單位時間中所消耗的能源的數量,單位為 W;
-
能耗(Energy),能源轉換實物量的損耗,單位是焦耳/秒。在後 PC 時代,能源是真正的資源更需要關注。
-
例如 WSC,關注的不僅僅是耗電功率(功耗),而是由於高溫帶來的昂貴冷卻費用。因此在評價功耗時,使用能耗比功耗更加合理。
06 簡單總結 | Review
在文章最後,我希望能夠總結一下前面大致說了點什麼,留下一些巨集觀的印象,以便於後續的進行。
-
計算機組成與體系結構的一些基礎概念和名詞,彌補一點大學計算機基礎沒有學習的缺漏,增加一點專業素養;
-
重講了一下程式的概念,不過較於之前那一篇,這次更加註重轉換過程,而不是編譯鏈;
-
計算機重要的組成硬體與馮·諾伊曼結構;
-
指令級體系結構等抽象思想;
-
效能的評估方式,我們可以以此照著店家說明書來比對電腦的效能;
-
能耗和功耗,這是效能之外的考慮。