在大二上學期學習數字邏輯的過程中,我對計算機如何運作產生了興趣,因此開了這個系列來記錄自己在這方面的學習過程,此前三篇分別是:
本來嘛,按照這個系列的節奏,下一篇就是馮諾依曼結構或者是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
在文章最后,我希望能夠總結一下前面大致說了點什么,留下一些宏觀的印象,以便於后續的進行。
-
計算機組成與體系結構的一些基礎概念和名詞,彌補一點大學計算機基礎沒有學習的缺漏,增加一點專業素養;
-
重講了一下程序的概念,不過較於之前那一篇,這次更加注重轉換過程,而不是編譯鏈;
-
計算機重要的組成硬件與馮·諾伊曼結構;
-
指令級體系結構等抽象思想;
-
性能的評估方式,我們可以以此照着店家說明書來比對電腦的性能;
-
能耗和功耗,這是性能之外的考慮。