# 計算機組織 - 戴碧如 > **維護者:呂思遠** ## 課程資訊 > 考試以課堂簡報為主 > **分數** > Quizzes 30% > Exams 70% ## Chapter 1 ### 1.1 導論 (Introduction) - **摩爾定律(Moore’s Law)**:IC(Integrated Circuit)上的電晶體數量每兩年(約18個月)翻倍,驅動計算技術進步。 - Classes of Computers: - 個人電腦(PC):通用用途,具成本效能權衡 - 伺服器(Server):提供網路服務,高容量、高效能、高可靠性 - 超級電腦(Supercomputer):用於科學計算與工程模擬,市場占比小但效能最高。 - 嵌入式系統(Embedded Computers):內建於其他系統,受限於功耗、成本與效能需求。 - The Post-PC Era(後 PC 時代) - 個人行動裝置(PMD, Personal Mobile Device) - 智慧型手機、平板電腦、智慧眼鏡 - 電池供電,具備網路連接能力 - 雲端運算(Cloud Computing) - 倉儲級計算機(Warehouse-Scale Computers, WSC) - SaaS(Software as a Service) --- ### 1.2 電腦架構的七大核心概念 (Seven Great Ideas in Computer Architecture) * 抽象化(Abstraction) * 讓常見情境變快(Make the common case fast) * 透過並行提升效能(Performance via parallelism) * 透過管線化提高效能(Performance via pipelining) * 透過預測提高效能(Performance via prediction) * 記憶體階層設計(Hierarchy of memories) * 透過冗餘提升可靠性(Dependability via redundancy) --- ### 1.3 程式底層運作 (Below Your Program) - Application Software:以高階語言(High-Level Language, HLL)撰寫。 - System Software: - Compiler:將HLL轉換為機器碼(Machine Code)。 - Operating System (OS):管理I/O、記憶體、排程與資源共享。 - Hardware: - Processor、Memory、I/O Controllers。 --- ### 1.4 電腦的內部組成 (Under the Covers) - Instruction Set Architecture (ISA):硬體與軟體的介面。 - Application Binary Interface (ABI):ISA與系統軟體的接口。 - Implementation:ISA之下的硬體設計細節。 --- ### 1.5 Performance (效能衡量) - Response Time(Execution Time):執行任務所需時間。 - Throughput(Bandwidth):單位時間內處理的工作數量。 影響因素: - Algorithm:決定執行的運算數量。 - Programming Language, Compiler, Architecture:決定每個運算所需的機器指令數量。 - Processor and Memory System:影響指令執行速度。 - I/O System (including OS):影響I/O操作速度。 - Performance 計算方式: - Performance 計算方式: $$Performance = \frac{1}{\text{Execution Time}}$$ 若程式在 $A$ 電腦執行 $10$ 秒,在 $B$ 電腦執行 $15$ 秒,則: $$ \text{Performance}_A= \frac{\text{ExecutionTime}_B}{\text{ExecutionTime}_A} = \frac{15}{10} = 1.5 $$ 表示 $A$ 比 $B$ 快 $1.5$ 倍。 --- ### 1.6 CPU 時脈機制 (CPU Clocking) - Clock Cycle(時脈週期):數位硬體運作以固定時脈為基準。 - Clock Frequency(時脈頻率): - $\text{Clock Period} = 250 \text{ ps} = 0.25 \text{ ns} = 250 \times 10^{-12} \text{ s}$ - $\text{Clock Frequency} = 4.0 \text{ GHz} = 4000\text{ MHz} = 4.0\times10^{9}\text{ Hz}$ - CPU Time 計算方式: $$\text{CPU Time}= \text{CPU Clock Cycles}\times\text{Clock Cycle Time} = \frac{\text{Clock Cycles}}{\text{Clock Rate}}$$ --- ### 1.7 指令數與每指令週期數 (Instruction Count and CPI) - Instruction Count(IC):執行程式所需的指令數量,由程式、ISA 和 Compiler 決定。 - Cycles Per Instruction (CPI):指令的平均週期數,由 CPU 硬體決定。 - CPI 計算方式: $$\text{CPU Time}=\text{Instruction Count}\times\text{CPI}\times\frac{1}{\text{Clock Rate}}$$ --- ### 1.8 CPI Example (CPI 計算範例) - 若兩台電腦執行相同 ISA,且: - $\text{Computer A:Cycle Teme} =250 \text{ ps,CPI} = 2.0$ - $\text{Computer B:Cycle Teme} =500 \text{ ps,CPI} = 1.2$ - 計算CPU時間: $$\text{CPU Time}_A=\text{IC}\times2.0\times250\text{ ps} = \text{I}\times\text{500 ps}$$ $$\text{CPU Time}_B=\text{IC}\times1.2\times500\text{ ps} = \text{I}\times\text{600 ps}$$ $$\frac{\text{CPU Time}_B}{\text{CPU Time}_A} = \frac{\text{I}\times 600\text{ ps}}{\text{I}\times 500\text{ ps}} = 1.2$$ --- ### 1.9 CPI in More Detail(多個CPI) - 當不同類型的指令需要不同的時鐘週期(Clock Cycles)時,總時鐘週期可表示為: $$\text{Clock Cycles}=\sum_{i=1}^{n}(\text{CPI}_i\times\text{Instruction Count}_i)$$ - Weighted average CPI $$\text{CPI} = \frac{\text{Clock Cycles}}{\text{Instruction Count}} = \sum_{i=1}^{n} \left( \text{CPI}_i \times \frac{\text{Instruction Count}_i}{\text{Instruction Count}} \right)$$ - **CPI Example** - **不同的編譯方式可能導致不同的指令序列** - 以 **A、B、C 三類指令** 為例: | **Class** | **A** | **B** | **C** | |------------|------|------|------| | **CPI for class** | 1 | 2 | 3 | | **IC in sequence 1** | 2 | 1 | 2 | | **IC in sequence 2** | 4 | 1 | 1 | **Sequence 1 計算:** **Instruction Count (IC) = 5** - **Clock Cycles 計算**: $1 \times 2 + 2 \times 1 + 3 \times 2 = 10$ - **平均 CPI**: $10/5 = 2.0$ **Sequence 2 計算:** **Instruction Count (IC) = 6** - **Clock Cycles 計算**: $1 \times 4 + 2 \times 1 + 3 \times 1 = 9$ - **平均 CPI**: $9/6 = 1.5$ --- ### 1.10 Pitfall: Amdahl's Law - 公式 $$ \text{T}_{\text{improved}} = \frac{\text{T}_{\text{affected}}}{\text{improvement factor}} + \text{T}_{\text{unaffected}} $$ - $\text{T}_{\text{affected}} + \text{T}_{\text{unaffected}} = 100\%$ --- ### 1.11 Performance Summary (效能總結) - Performance 受以下因素影響: - Algorithm:影響 Instruction Count (IC) 和 CPI。 - Programming Language & Compiler:影響 IC 和 CPI。 - Instruction Set Architecture (ISA):影響 IC、CPI 和 Clock Cycle Time。 $$\text{CPU Time = Instruction Count}\times\text{CPI}\times\text{Clock Cycle Time}$$ --- ## Chapter 2 ### [✨組合語言指令大禮包✨](https://hackmd.io/@Left-owo/HkhghCr3yg) --- ### 2.1 指令集(Instruction Set) - 電腦能執行的所有「基本操作」的集合。 - 不同電腦架構有不同的指令集,但邏輯架構相似。 - MIPS 是本章範例架構,屬於簡潔的 RISC 架構,指令格式統一。 --- ### 2.2 運算指令(Arithmetic Operations) - 格式範例:`add $s0, $s1, $s2`(`$s0 = $s1 + $s2`) - 三個暫存器為運算基礎:兩個來源、一個目的。 Example: ``` C code:f = (g + h) - (i + j) $s0 f $s1 g $s2 h $s3 i $s4 j MIPS: add $t0, $s1, $s2 # $t0 = g + h add $t1, $s3, $s4 # $t1 = i + j sub $s0, $t0, $t1 # $s0 = $t0 - $t1 即 f = (g + h) - (i + j) ``` --- ### 2.3記憶體操作(Memory Operands) - MIPS 使用 load/store 架構 - `lw`:從記憶體載入 → 暫存器 - `sw`:從暫存器存回 → 記憶體 - 記憶體是以 位元組(byte)為單位編址,32-bit 稱 word(4 位元組)。 - Big Endian:高位元組存在低位址 - 在 MIPS 架構中,MIPS 採用 Load/Store 架構,不允許直接對記憶體資料做運算。 Example: ``` c code:A[12] = h + A[8] $s2 h(來源之一) $s3 A(陣列基底位址) $t0 暫存計算結果 MIPS: lw $t0, 32($s3) # $t0 = A[8] add $t0, $s2, $t0 # $t0 = h + A[8] sw $t0, 48($s3) # A[12] = $t0,12 × 4 = 48 位移量計算方式:MIPS 的 word 是 4 bytes,因此 A[n] 的實際偏移量為 n × 4。 ``` --- ### 2.4即時值(Immediate Operands) - 指令中可以直接給常數: `addi $s2, $s1, 1($s2 = $s1 + 1)` - 常數避免再去記憶體抓資料,效率更高。 - 減法運算: `addi $s2, $s1, -1` - 零(constant zero):$zero --- ### 2.5整數表示(Integer Representations) * 無號整數(unsigned):0 ~ 2ⁿ - 1 * 有號整數(2’s Complement):-2ⁿ⁻¹ ~ 2ⁿ⁻¹ - 1 * 負數表示法:補數+1 * 擴位(Sign Extension):延伸時保留正負號 --- ### 2.6指令格式(Instruction Formats) * 所有指令用 32位元二進位 表示。 * 常見格式: * R-type:register-register(e.g., add, sub) * I-type:immediate / memory(e.g., addi, lw, sw) * op (6 bits)、rs、rt、rd、shamt、funct、immediate … 等欄位固定長度。 Example: ``` op rs rt rd shamt func 000000 10001 10010 01000 00000 100000 R-type 17 18 8 0 add add $t0, $s1, $s2 ``` --- ### 2.7邏輯運算(Logical Operations) * 位元操作:AND、OR、NOR、NOT、SHIFT * sll(shift left logical) 可達到 x2 效果(僅限 unsigned) * srl(shift right logical) 可達到 ÷2 效果(僅限 unsigned) --- ### 2.8條件與跳躍(Conditional & Branching) * beq, bne:根據條件跳轉 * j L1:無條件跳轉 * slt, slti:比較小於 → 設為 1 or 0 * 使用組合語法模擬 if, while 等高階語法 Example: ``` C code: if (a == b) { x = 1; } else { x = 2; } MIPS: beq $s0, $s1, L1 # 如果 a == b,跳轉到 L1 li $t0, 2 # x = 2 j L2 # 跳過 L1 L1: li $t0, 1 # x = 1 L2: ``` --- ### 2.9 程序呼叫(Procedure Calling) * 使用: * $a0-$a3:參數(最多 4 個) * $v0-$v1:回傳值(最多 2 個) * $ra:返回位址 * jal 跳到副程式,jr $ra 回主程式。 * 使用堆疊(stack)保存暫存器值,防止資料遺失。 Example: ``` C code: int add(int x, int y) { return x + y; } int main() { int a = 5, b = 7; int result = add(a, b); } MIPS: li $a0, 5 # 參數 a = 5 li $a1, 7 # 參數 b = 7 jal add_function # 跳到副程式 move $t0, $v0 # 把回傳值存入 $t0(result) # 主程式繼續執行... add_function: add $v0, $a0, $a1 # v0 = a0 + a1 jr $ra # 返回主程式 ``` --- ### 2.10 字元與字串操作(Character & String) * 字元使用 ASCII 編碼。 * 支援 lb, lbu, lh, lhu, sb, sh 操作 byte 與 halfword。 * 以 null-terminated 字串為主(\0 表結尾) --- ### 2.11 Byte/Halfword Operation | 指令 | 資料大小 | 操作類型 | 是否符號延伸 | 說明 | |-------|-----------|--------------|----------------------|-------------------------------------------| | `lb` | 8 位元 | 載入(load) | 是(sign-extend) | 將 byte 視為帶符號整數,延伸成 32-bit | | `lbu` | 8 位元 | 載入(load) | 否(zero-extend) | 將 byte 視為無號整數,補 0 成 32-bit | | `lh` | 16 位元 | 載入(load) | 是(sign-extend) | 將 halfword 視為帶符號整數,延伸成 32-bit | | `lhu` | 16 位元 | 載入(load) | 否(zero-extend) | 將 halfword 視為無號整數,補 0 成 32-bit | | `sb` | 8 位元 | 儲存(store)| 無 | 僅將暫存器的最低 8 位元儲存到記憶體 | | `sh` | 16 位元 | 儲存(store)| 無 | 僅將暫存器的最低 16 位元儲存到記憶體 | ---