# 計算機架構 Computer Architecture 有五個面向會影響計算機架構 - Technology:也就是製程的部分 - Programming Languages:編譯器的部分 - Operating Systems:作業系統的部分 - Applications:人類的應用,像是因應最近 AI 而發展起來的 NPU - History:為了相容性,所以歷史上出現的架構會延續至今 # 設計跟評估 評估 Evaluation/Analysis 是除了設計之外,相當重要的另一部分。 評估之後你才知道你強調的面向在哪,才知道要在哪裡做取捨;所謂的不同面向就是 Matrices,或者說指標。 下面介紹三種指標: - Performance - Power - Cost # Performance - CPU 中最常用來作為效能的指標是 ==Response time== 跟 ==Throughput==。目前我們先專注於 ==Response Time==。 - ==Response Time== 會影響你的 Throughput;Response time 又叫做 ==Execution Time==。 - ==Performance 效率== 定義為 ==Execution Time 時間== 的倒數: $$ \text{Performance}=\frac{1}{\text{Execution Time}} $$ 直觀來說就是效率有多好。 當我們說「A 比 B 快 $n$ 倍」的時候,就是指 A 的效率是 B 的幾倍,所以定義如下: $$ \frac{\text{Performance}_{A}}{\text{Performance}_{B}}=\frac{\text{Execution Time}_{B}}{\text{Execution Time}_{A}}=n $$ 當然也可以用於新舊比較。 ## Elapsed Time 包含了各種時間(Processing, I/O, OS overhead, idle time ... .etc)的 Execution Time。 ## CPU Time 單純考量 CPU 的 Processing 時間;可以再細分為 user 跟 system 的 CPU time。 本課程主要討論 ==CPU Time==。 ## CPU Time ==CPU Time== 的定義是多少 Cycles 乘上一個 Cycle 要多久(或是除以速率)。白話就是總共要跑多久。 $$ \displaylines{ \text{CPU Time}=\text{CPU Clock Cycles}\times\text{Clock Cycle Time }=\frac{\text{CPU Clock Cycles}}{\text{Clock Rate}} } $$ 所以要嘛降低 Cycle 數,要嘛提高頻率;但是實務上常常都是有一好沒兩好,需要進行取捨。 ## Instruction Count and CPI 那我要怎麼知道有多少 Cycles?,就是看執行的程式的 ==Instruction Count== 跟 ==Cycles per Instructions (CPI)== $$ \displaylines{ \text{CPU Clock Cycles}=\text{Instruction Count}\times\text{Cycles per Instruction}\\ \text{CPU Time}=\text{Instruction Count}\times\text{Cycles per Instruction}\times\text{Clock Cycle Time} } $$ 下面這張表格表示 CPU Time 的三要素:==Instruction Count==, ==CPI==, ==Clock Rate== 底層上分別會受誰影響: | | Instruction Count | CPI | Clock Rate | |:---------:|:-----------------:|:---:|:----------:| | Algorithm | X | X | | | Language | X | X | | | Compiler | X | X | | | ISA | X | X | X | > X 代表會受影響 >ISA (instruction set architecture) 是跟硬體有關的部分 **所以比較兩個 CPU 的時候,CPU Time 三要素一個都不能少,這樣的比較才是全面的。** ## Weighted average CPI 理論上每條指令所需的 Cycle 數都不同,但為了方便比較,我們是採用平均的方式計算出 CPI: $$ \frac{\text{Total Cycles Count}}{\text{Total Instruction Count}} $$ --- # Power Power 功率,直觀來說就是消耗能量的效率,所以越低越好:) $$ \text{Power}\approx\text{Capacitive load}\times\text{Voltage}^{2}\times\text{Frequency} $$ 在維持 Power (甚至降低)的情況下,隨著科技的進步我們可以把福特數壓到很低,由於其平方項的關係,讓我們可以把頻率拉得很高。 但是福特數最終也壓到瓶頸了,再拉頻率會飆高功耗,所以才會出現轉向多核的時代。 :::warning 跟上面計算時間誰比誰快幾倍一樣,A 的功率是 B 的幾倍就是 A 的 Power 除以 B 的 Power。 >... 好吧有點像在講廢話 ::: :::info 上面的公式由來是計算 CMOS 電路對電壓進行的充放電過程中消耗的能量,理論上還會乘上一個 $\alpha$ 項代表動態時間中大概有多少電容在充放電。 - $C_L$:負載電容 (Capacitive Load),代表所有需要充電和放電的電容總和,包括閘極電容、接線電容等。 - $V$:電壓 (Voltage),通常是電源電壓 $V_{DD}$。 - $f$:頻率 (Frequency),通常是時脈頻率 $f_{clock}$。 - $\alpha$:開關活動因子 (Activity Factor)。 - by Google Gemini 3 :) ::: ## 多核省電 為甚麼多核可以減少功耗?準確來說是多核讓工作量平均分配,也讓頻率可以平均分配掉。 上面的公式中,$V$ 通常來說正比於頻率,也就是說 Power 公式可以簡化為 $$\text{Power}\propto\text{Frequency}^{3}$$ 例如從單核心變為雙核心,$f$ 可以降一半: - $C$ 變成 2 倍,畢竟多一顆核心,電容數理論上翻倍:) - $f$ 只剩 0.125 倍 整體來說就是 0.25 倍。 :::warning $V$ 跟 $f$ 之間是存在相互關係的,想要拉高頻率,通常來說需要更高的電壓,反之降頻率可以降低電壓 ::: ## 平行運算 邁向多核之前,是稱為平行指令 Instruction Level Parallelism 的時代。平行化是做在硬體的指令架構上。寫高階語言的軟體工程師還不用在意:)。 但是邁向多核後,就變成軟體工程師要自己學會寫平行運算的程式了;這時代又叫做 Thread & Processor Level Parallelism。 # Cost 在很多地方都有成本,這裡以製造晶片的時候產生的成本舉例。 製造晶片時,會有壞掉的晶片,所以會有以下公式計算成本: $$ \displaylines{ \text{Cost per die}=\frac{\text{Cost per Wafer}}{\text{Dies per Wafer}\times\text{Yield}}\\ \text{Dies per Wafer}\approx\frac{\text{Wafer area}}{\text{Dies area}}\\ \text{Yield}=\frac{1}{(1+\frac{\text{Defect per area}\times\text{Dies area}}{2})^{2}} } $$ 上面公式的白話叫做:$$\text{每「塊」多少錢} = \frac{每片多少錢}{( \text{每片有多少塊} × 良率 )}$$ 可以看到,如果 die 越小片,就可以提高良率。 --- # Benchmark 上面的 Performance、Power、Cost 三大指標是 Design 時需要考慮的面向。 接著來看實際做 Analysis 時需要看得東西,Benchmark。 桌機、伺服器、嵌入式,到 GPU 等等,有各自的 Benchmark。 ## SPEC CPU Benchmark 這是一個給桌機使用的 Benchmark;時間是參考 Elapsed time,但是其所選用的 programs 的 I/O 等等其他時間過於微小可以忽略不計,所以一個專注於 CPU performance 的 Benchmark。 並且有分為 CINT 跟 CFP,也就是分成整數運算跟浮點數運算。 ### SPECRatio 對於一個 program,會去計算 SPECRatio,某種意義上來說可以看作==絕對效率 Performance==。 SPECRatio 是以某一台基準電腦的 benchmark 結果作為基準,看看你的電腦相對於他,==Performance 效率==是幾倍: $$ \text{performance}=\frac{\text{time on reference computer}}{\text{time on computer being rated}} $$ 這跟上面提到的 Performance 計算一模一樣:你的效率除以他的效率=他的時間除以你的時間。 :::warning 有了 SPECRatio 的好處是,兩台電腦的 SPECRatio 相除等同兩台電腦的效率相除,所以可以直接用 SPECRatio 替代 Performance 來計算誰的效率是誰的幾倍。 ::: ### GeometricMean 最後把整個 Benchmark 中全部的 Program 所得到的 SPECRatio 進行幾何平均: $$ \text{GeometricMean}=\sqrt[n]{\prod_{i=1}^{n}\text{SPECRatio}_{i}} $$ ## SPEC Power Benchmark 這是給 Power 的 Benchmark;這裡以 SPECJBB2005 (Java Business Application) 舉例。 $$ \frac{\sum_{i=0}^{10}\text{ssj_ops}_{i}}{\sum_{i=0}^{10}\text{Power}_{i}} $$ $\text{ssj_ops}$ 是在不同 workload levels 下的 operation 數量。 SPECJBB2005 的特色是會進行從 0% 一直到 100% 共 11 種 workload levels 的測試,每種測試會得到各自的 $\text{ssj_ops}$ 跟 $\text{Power}$。 最終將總共的 $\text{ssj_ops}$ 數量除以全部的 $\text{Power}$ 數,得到平均來說每 $W$ 可以做多少 operation。 --- # Amdahl’s Law >[Amdal 阿姆達爾,是位美國人:)](https://zh.wikipedia.org/wiki/%E5%90%89%E6%81%A9%C2%B7%E9%98%BF%E5%A7%86%E9%81%94%E7%88%BE) 核心概念就是: $$ \text{T}_{\text{improved}}=\frac{\text{T}_{\text{affected}}}{\text{improvement factor}}+\text{T}_{\text{unaffected}} $$ 如果只有優化某個部分的時間,那麼整體時間的縮短會有個上限。 例如我們依照上面套入公式:$20=\frac{80}{n}+20$,總體是 $100=80+20$ 秒,如果我想讓他變快 5 倍,也就是時間變 $20$ 秒,那麼 improvement factor $n$ 要是多少,答案是不可能或是無限大:) :::warning 所以結論是讓 common case 的時間縮短才是最好的 ::: # Low Power at Idle 上面 SPEC Power Benchmark 如果去看實際數據,會發現目前的問題是 Power 跟 workload level 沒有成正比,閒置或是 loading 不大的時候沒有低 Power,而是有著一定程度的 Power,造成能源的浪費。 所以現在的目標希望就是能夠低負荷時低功耗。 # MIPS as a Performance Metric MIPS 叫做 Millions of Instructions Per Second: >此 MIPS 非彼 MIPS $$ \text{MIPS}=\frac{\text{Instruction count}}{\text{Execution time(second)}}\\ =\frac{\text{IC}}{\text{IC}\times\text{CPI}\times\text{Clock Cycle Time}}\\ =\frac{\text{Clock Rate}}{\text{CPI}} $$ 可以看到 MIPS 他只考慮了 CPI 跟 Clock Rate 2 個面相。對應[上方的表格](https://hackmd.io/oi8xxVaNQQehnZbQHRxYKQ#Instruction-Count-and-CPI),他少了 $IC$ 這個要素。 所以如果用 MIPS 比較兩顆 CPU,會是不公平的,有可能兩顆 CPU 比較時的 IC 會因為 ISA、Compiler、Algorithm 或 Language 而有所不同。 # architectural innovation 在 Instruction Level Parallelism 的時代,或者說尚未有 Power Limit 的時候,可以達到每年 58% 的提升,其中如果只單看技術的進步 Technology advance,會發現只有 35% 的進步,其餘是靠架構的進步增強的。 架構也是重要的一環。 --- ## 回顧 - Performance 公式 + CPU 時間公式 - Power 公式 & Cost 公式? - SPECRatio & GeometricMean - Amdahl’s Law - MIPS not good