# Ch1:Computer Abstraction and Technology :::warning 前面廢話蠻多的,要考前衝刺的直接跳到 Permormance ::: ## 1-1 Introduction - **Moore's Law**: - 每 1.5 年晶片上的電晶體密度會翻倍 - 會有極限:因為**量子穿隧效應**會限制電晶體所能達到的最大密度 ![image](https://hackmd.io/_uploads/SyUcAhMCkg.png) ### 電腦的種類 - **Personal PC**:目前最廣泛使用的電腦 - **Server**: - 專門運行**大型程式** - 常用於網路傳輸 - 允許**多使用者同步使用** ![image](https://hackmd.io/_uploads/HJ9S1azCJe.png) - **Supercomputer**: - 擁有最高的性能與成本 - 經常用於**科學與工程計算** ![image](https://hackmd.io/_uploads/ryc6kpf0ye.png) - **Embedded Computer(嵌入式電腦)**: - 一種嵌入在其他裝置上的電腦 - 能力與表現受限於**硬體** ![image](https://hackmd.io/_uploads/SkuweTMAkg.png) - **個人移動裝置(PMD)**: - 使用**電池**供應電源 - 使用**無線網路** - e.g. 手機、平板 - **Cloud computing**: - 依賴 **Warehouse Scale Computer(WSCs)** - **Software as a Service(SaaS)** - 一部分運行在 PMD;另一部分運行在雲端 ## 1-2 Eight Great Ideas 以下是電腦架構的八大核心理念: 1. **為 Moore's Law 設計(Design for Moore’s Law)**: - 摩爾定律預測:晶片上的電晶體數量每兩年會翻倍 - 設計電腦時要考慮到這個成長趨勢,讓系統可以隨著硬體的進步一起升級,不會被限制住。 2. **使用抽象來簡化設計(Use Abstraction to Simplify Design)** - 使用抽象來將複雜的系統分層,簡化開發流程 - e.g.作業系統不用思考硬體設計 3. **讓常見情況執行更快(Make the Common Case Fast)**: - 優化**常見的操作情境**,有助於提升效率 - e.g. 如果 90% 的時候都在讀資料,那你就應該先讓「讀」的操作更快,而不是優化用不到 10% 的「寫」操作。 4. **透過平行處理提升效能(Performance via Parallelism)**: - 允許設備可以同時執行多個 process - e.g. 多核心處理器 5. **透過 Pipelining 提升效能(Performance via Pipelining)**: - 像工廠流水線一樣,把一個任務拆成多個步驟,每個階段同時運作,提升處理速度。 - e.g. CPU 執行一條指令時,會分成 **Fetch, Decode, Execute, Store**。當第一條在 execute 時,第二條可以 Decode,第三條可以 Fetch。 ![image](https://hackmd.io/_uploads/HysswTM01l.png) 6. **透過預測提升效能(Performance via Prediction)**: - 猜測接下來會發生什麼,提前準備,減少等待時間。 - 即使偶爾猜錯,只要常常猜對,效能整體就會好。 7. **建立記憶體分層(Hierarchy of Memories)**: - 不同記憶體會有不同的容量與讀取速度 ![image](https://hackmd.io/_uploads/B1fwOaGCke.png) 8. **靠系統冗餘提升可靠性(Dependability via Redundancy)**: - 加入**備份** -> 當部分系統出問題時還能運作,避免整個系統掛掉。 - e.g. 資料中心會用 **RAID 技術**,把資料寫到多顆硬碟上,即使一顆壞掉,還是可以救回資料。 ## 1-3 Below Your Program ### 計算機結構分層 - **Application Software**: - 使用者能夠**直接接觸**的階層 - 使用高階語言撰寫 - **System Software**: - **Compiler, Assembler**:將高階語言轉成 Machine code - **作業系統**:溝通軟硬體的媒介 - **Hardware**: - CPU, Memory, I/O 裝置 ![image](https://hackmd.io/_uploads/SJDqtazAkx.png) ### 程式語言分層 ![image](https://hackmd.io/_uploads/Bk0Lc6fRye.png) ## 1-4 Under the Cover ### Liquid Crystal Display(LCD) - 由薄層的液晶組成 - 使用**電晶體**去控制每個液晶穿透的光線 - **Frame buffer**: - 資料以 **bit map** 的方式儲存 - RGB -> 24 bits ![image](https://hackmd.io/_uploads/rkCqlAfCke.png) ### Abstraction - **目標**:隱藏 low-level - **Instruction set architecture(ISA, 指令集)**: - 是**硬體與低階軟體**的 interface - 封裝於**作業系統**中 - 控制一些**基礎操作**(如 I/O 控制...) - **Application binary interface**:ISA + 作業系統 ### 記憶體揮發性(Volatility) | | 揮發性記憶體(Volatile) | 非揮發性記憶體(Nonvolatile) | | -------- | -------- | -------- | | 描述 | 只有在電源開啟時才儲存資料,電源關閉後資料會消失 | 可以永遠儲存資料,不受電源供應影響 | | 讀取速度| 快 | 慢 | | 成本| 高 | 低 | | 容量 | 小 | 大 | | 例子 | RAM(DRAM、SRAM) | 硬碟、SSD、ROM、Flash | ## 1-5 Technology of Processor and Memory - **電腦組成科技的演變** ![image](https://hackmd.io/_uploads/rkn4Q0GRkx.png) ### 半導體(Semiconductor) :::warning 這邊有點超綱,可以不讀。詳情可以參考 **VLSI** 筆記。 ::: - 簡介: - 半導體使用**矽**作為原料 - 矽本身不導電,但可以透過加入材料讓他倒電 - **p-type 半導體**: - 加入 3A 族元素(硼) - 形成電洞(hole) - **n-type 半導體**: - 加入 5A 族元素(鉍) - 形成自由電子 ![image](https://hackmd.io/_uploads/Sk2krRfA1e.png) - **製程**: ![image](https://hackmd.io/_uploads/HJ_4SRM0yg.png) - **成本計算**: :::warning 公式可以看一下 ::: - $\mathrm{code\ of\ per\ die} = \cfrac{\mathrm{cost\ per\ wafer}}{\mathrm{die\ per\ wafer} \times \mathrm{yield}}$ - $\mathrm{die\ per\ wafer} = \cfrac{\mathrm{wafer\ area}}{\mathrm{die\ area}}$ - $\mathrm{Yield} = \cfrac{1}{1 + (\mathrm{defect\ per\ area} \times \frac{\mathrm{die\ area}}{2})^2}$ ## 1-6 Performance - **Response time**:做完任務需要耗時多久 - **Throughput**:每段時間做完多少任務 - **Relative performance**:$\mathrm{performance} = \frac{1}{\mathrm{execution\ time}}$ ### Response time 計算方式比較 :::warning 本章節大多數計算皆使用 CPU time ::: - **Elapsed time**: - 任務全部的 responce time - 需要參考許多因素(I/O 處理、閒置時間等) - 決定於**系統表現** - **CPU time**:只參考 **CPU 的執行時間** ### CPU clocking - 所有**數位硬體**操作都受到**固定速率的 CPU clock** 控制 - **Clock period**:clock cycle 的週期 - **Clock rate(時脈)**:clock 的頻率 ![image](https://hackmd.io/_uploads/HkLzbkXCkl.png) - $\mathrm{CPU\ Time = CPU\ Clock\ Cycle \times Clock\ Cycle\ Time = \cfrac{CPU\ Clock\ Cycle}{Clock\ rate}}$ ### Instruction Performance - **Instruction count**: - 一個程式所需要的指令數量 - 取決於 **program, ISA, compiler** - **Cycles per instruction (CPI)** - 由 **CPU 硬體**決定 - 不同 instruction 會有不同的 CPI - $\mathrm{CPI = \cfrac{Clock\ Cycles}{Instruction\ Count}}$ - **平均 CPI**: - 使用加權值來計算 - $\mathrm{Average\ CPI = \sum_{i=1}^n(CPI_i \times \cfrac{Instruction\ Count_i}{Instruction\ Count})}$ - $\mathrm{Clock\ Cycles = Instruction\ Count \times Cycles\ per\ Instruction}$ - 實際計算: ![image](https://hackmd.io/_uploads/S1D3XyX0kx.png) ## 1-7 The Power Wall(功率牆) - **Power wall**: - 當 **CPU clock rate** 提升到某個程度後,就無法再繼續提升,因為晶片產生的熱量太高,無法有效冷卻,導致系統無法穩定運作。 ![image](https://hackmd.io/_uploads/ByGGSkQ0yx.png) - 動態功耗公式:$\mathrm{Power} = C \times V^2 \times f$ - $C$ = Capacitive load,電容負載 - $V$ = 電壓 - $f$ = CPU clock rate ![image](https://hackmd.io/_uploads/BksprymAkx.png) - 因為 power wall 的存在,我們不能依賴提升 clock rate 來提升效能 - 我們使用**多核心處理**來提升效能 ## 1-8 The Switch from Uniprocessors to Multiprocessors - **Uniprocessors 的演變**: - 瓶頸:Power wall, 平行化指令, 記憶體延遲 ![image](https://hackmd.io/_uploads/SkDeuyXC1x.png) - **Multiprocessor**: - **Multicore microprocessors**:一個 chip 有**多個 processor** - 真正的**平行化編程**: - 硬體同時處裡多個 instructions - 對使用者隱藏 ## Amdahl's Law :::warning 結論:改善性能不代表整體變快 ::: - **概述**: - 用來衡量改善系統的後的效率 - 改善性能不會改善整體表現 - **公式**:$T_{improved} = \cfrac{T_{affected}}{n} + T_{unaffected}$ - $T_{improved}$:系統整體改善後耗時 - $T_{affected}$:改善部分的「改善前耗時」 - $T_{unaffected}$:未改善部分的耗時 - $n$:系統效率提升倍率