# CS2006301 計算機組織 Computer Organization
Textbook: Patterson, D. A., Hennessy, J. L.(民104)。計算機組織與設計:硬體/軟體的介面(5E)。臺北市:臺灣東華、臺灣愛思唯爾。
Instructor: 陳錫明 Shyi-Ming Chen, 劉一宇 Yi-Yu Liu
###### tags: `TaiwanTech`, `CS`
## 1計算機抽象化與科技
* 電腦的定義
* A device that computes, especially a programmable electronic machine
* 每當計算的成本下降成 1/10,使用計算機的機會即大增
* 歷史上的裝置
* 1822 Difference Engine 多項式計算
* 1889 Tabulating machine 人口普查
* 1944 Harvard Mark I 火砲射擊
* 1946 ENIAC 第一台全電子式可程式化通用計算機
* 十進位
* 真空管
* 每秒1900個加法
* 藉由纜線與開關設計程式
* 此後電腦開始商用
* 1959 IBM 1401
* 第一台電晶體電腦
* 計算應用種類與特性
* 個人型計算機 Personal computer, PC
* 1973 Xerox Alto
* bitmap螢幕
* 滑鼠
* 所見即所得編輯器
* 實驗性,未量產
* 計畫主持人 2009 獲得 Turing Award
* 1977 Apple 個人電腦
* 1981 IBM PC
* 造就 Intel 與 Microsoft
* 低成本
* 供應單一使用者的效能
* 執行其他公司的軟體(應用程式)
* 伺服器 server
* 以前大型主機、迷你計算機與超級電腦的現代版
* 藉由網路使用
* 一件大型工作,如科學或工程計算
* 多件小型工作,如大型網路伺服器
* 使用他處軟體(資料庫或模擬系統),經常客製化調整
* 計算與輸出入容量的擴充性
* 可靠度
* 最低階差不多像是桌上型計算機,用於檔案儲存、小型商業應用或簡單網路服務
* 最高階是超級電腦(supercomputer),包含數百至數千個處理器和照位元組的記憶體,用於高階科學及工程計算
* 嵌入式計算機 embedded computer
* 置入另一裝置,如汽車的微處理器、手機電視遊樂器與電視的計算機
* 執行單一應用或一組相關應用
* 與硬體整合
* 最低效能與成本功耗限制
* 1995 使用率前三:x86、6800、Hitachi SuperH
* 2002 使用率前三:arm、x86、Motorola 6800
* 後電腦時代的新計算機
* 個人行動裝置 personal mobile device, PMD
* 電池驅動
* 無線聯線
* 執行可下載的軟體應用(app)
* 不具鍵鼠、改由觸控或語音
* 智慧手機與平板是現在最大的處理器市場
* 庫房規模計算機 Warehouse Scale Computer, WSC
* 數據中心
* 用於雲端計算(Cloud Computing)
* 租用給他人提供軟體服務(軟體即服務, Software as a Service, SaaS)
* 取代伺服器
* 電腦發展受市場與需求影響:追求甜蜜點平衡
* 效能與準確
* 高階程式語言
* 相容性
* 電腦史能幫助計算機架構師發想未來可能性
* Computer Architecture = ISA+Machine Architecture
* VLSI -> Computer architecture -> Market
### 計算機架構中的八大理念
* 摩爾定律
* 積體電路的電晶體數量每18至24個月加倍
* 處理器速度每1.5年2倍
* 從3~5年的參考資料,猜測了50年的發展
* 記憶體容量也符合摩爾定律
* DRAM容量每3年4倍,每位元價格每年改善25%
* 硬碟容量每1年1.5~2倍,每位元價格每年改善100%
* 所以 Intel 創辦人原打算設計記憶體
* 效能提升也有點像摩爾定律
* 2006年後效能發展趨於平緩
* 電晶體的大小已從 100micro 到 nano 級
* 硬體的發展帶動資訊工程發展(優化軟體提升硬體使用的可能性)
* 應配合設計結束時的技術水準進行設計
* 抽象化
* 把下層化為邏輯模型,隱藏瑣碎的技術細節
* 經常的情形變快
* 針對經常情況做最佳化
* 應仔細實驗測量何為經常情況
* Amdahl 定律: $改善後執行時間=\dfrac{受改善影響部分的執行時間}{改善幅度}+不受影響部分的執行時間$
* 回收遞降定律 the law of diminishing returns
* 平行性
* 平行運算提升效能
* 管道化
* 串聯形式的特殊平行性
* 預測
* 預測夠準確且錯誤回復成本不算太高時,預先猜測結果並據以往下執行將更快速
* 階層
* 記憶體階層可創造出類似既大又快且便宜的記憶體
* 可靠性
* 加入冗餘額外組件,可在失效發生時接替並協助檢測失效情況,達成可靠(dependable)
### 你的程式之下
* 系統軟體
* 作業系統 operating system
* 基本輸出入
* 配置儲存
* 有保護的資源分享
* 編譯器 compiler
* 高階程式語言(high-levle programming language)翻譯成硬體指令
* 組譯器(assembler): 組合語言(assembly language)翻譯成機器語言(machine language)
### 覆蓋之下
* **計算機五大傳統標準要件**
* 輸入 input
* 10美金的滑鼠,光學模組占0.5~0.7美金
* 輸出 output
* 記憶體 memory
* 資料通道 datapath
* 控制 control
* 硬體
* 圖形顯示器
* 液晶顯示器 liquid crystal display, LCD
* 薄層液態聚合物,電場變化控制透光度
* 主動式矩陣(active matrix): 每個像素一個電晶體控制該像素
* 觸控螢幕
* 電容式為主
* 更新緩衝區(raster refresh buffer)/畫面緩衝區(frame buffer): 緩衝即將顯示的螢幕影像
* 積體電路 integrated circuit/晶片 chip
* 中央處理器單元 central processor unit/中央處理單元 central processing unit/CPU
* 資料通道 datapath: 算術運算
* 控制 control: 依指令控制資料通道、記憶體與 I/O
* 快取記憶體 cache memory: 更快更小的記憶體,靜態隨機存取記憶體(static random access memory, SRAM),絕大多數空間都是快取記憶體
* 記憶體 memory: 存放執行中程式
* 動態隨機存取記憶體 dynamic random access memory, DRAM
* 主記憶體 main memory, primary memory
* 正在研發混合不揮發功能的記憶體
* 指令集架構 instruction set architecture/架構 architecture
* 硬體與低階軟體間的抽象介面
* 包括指令與所有可用硬體裝置
* 使上層設計者無須在意下層情況
* 非揮發性記憶體 nonvolatile memory
* 次記憶體 secondary memory
* 保存所有執行中與非執行中的資料與程式
* 記憶體階層中的較低階層
* 磁碟 magnetic disk
* 快閃記憶體 flash memory: 半導體記憶體
* 網路
* 通訊
* 資源共享
* 非本地存取
* 區域網路 local area network
* 乙太網路 Ethernet
* 廣域網路 wide area network
* 全球資訊網 World Wide Web/網際網路 Internet
### 建構處理器與記憶體的技術
* 1947 電晶體 貝爾實驗室
* 1958 積體電路 德州儀器
* 1971 Intel 4004 第一顆微處理器
* Intel 原本打算做記憶體,做微處理器時已接近破產
* 替人代工後取得設計著作權
* 80年代 IC 進入 VLSI
* RISC 開始發展
* 現在的 CISC 的底層設計也向 RISC 靠攏
* 積體電路製作流程
* 半導體材料、矽
* 可以變成導體、絕緣體或開關(電晶體 transistor)
* 香腸狀的矽晶磊(silicon crystal ingot)
* 細片成晶圓(wafer)
* 切割成晶粒(die),也稱晶片(chip)
* 黏結 bonding: 聯結封裝的接角
* 缺陷 defect: 製作過程中難以避免的晶圓瑕疵
* 積體電路成本
* 晶粒成本=晶圓成本/(晶圓的晶粒數\*良率)
* 晶圓的晶粒數=晶圓面積/晶粒面積
* 良率(yield)=1/(1+每單位面積缺陷\*晶粒面積/2)^2
* 冪次數字與製程步驟數相關
### 效能
* MIPS = IC / 執行時間
* 缺少 CPI
* 反應時間 response time
* 一件工作從開始到結束的執行時間
* Elapsed time 含處理、輸出入、系統
* CPU time 僅計算處理器
* 常用於個人計算機
* 處理量 throughput/頻寬 bandwidth
* 單位時間內可完成的工作量
* 常用於資料中心
* 效能=執行時間的倒數
* 主要專注於反應時間
* 主要專注於中央處理器效能,不考慮系統與輸出入
* 改善效能就是降低執行時間
* 中央處理器執行需時=中央處理器執行時脈數/時脈速率
* 中央處理器時脈數=指令數\*指令平均時脈(CPI)
* $\dfrac秒{程式}=\dfrac{指令數}{程式}\times\dfrac{時脈數}{指令}\times\dfrac秒{時脈}$
* 電腦最基本的執行單位:instruction(assembly最接近)
* 電腦最基本時間單位:clock cycle
* 最基本指令需要幾個時脈:不一定
| 要素 | 指令數 | CPI | 時脈速率 |
|:---------------------:|:------:|:---:|:--------:|
| 軟體(演算法+程式語言) | Y | Y | N |
| 編譯器 | Y | Y | N |
| 指令集 | Y | Y | N |
| 組織 | N | Y | Y |
| 硬體 | N | N | Y |
### 功耗障壁
* CMOS(互補金氧半導體)電晶體功耗
* $能耗\propto\dfrac12\times電容性負載\times電壓^2\times切換頻率$
* 新世代製程降低電壓,電晶體功耗降低
* 電壓過低將要處理漏電的消耗(靜態功耗)
### 巨變:由單處理器轉移至多處理器
* 多處理器(多核)可以在處理量上改善微處理器
* 2003年處理器效能改善趨緩
* 平行程式撰寫較難
* 考慮底層硬體均衡負載
* 多核間通訊與同步花費
### 實例:測試 Intel Core i7
* 工作負載 workload: 一組被執行程式
* 測試程式 benchmark: 量測效能的程式
* 會影響針對較常見情形優化時的偏好
* Actual Target Workload: 對於平常工作的效能表現明顯,但跨平台不見得公平
* Full Application Benchmarks: 跨平台支援增加,但代表性降低
* Small Kernel Benchmarks: 簡單,但容易被欺騙
* Microbenchmark: 最不能代表實際應用程式
* SPEC 系統效能評估組織: 建立測試標準的組織,12個整數測試,17個浮點數測試,一套功耗測試(10%負載)
* 靠賣 benchmark source code 賺錢
* 各程式效率比值的幾何平均(避免執行時間算術平均的單一程式加權問題)
* Power Benchmark: 每單位能源可以執行多少指令
* 安兔兔: 手機跑分
## 指令:計算機的語言
* 指令集選用
* 硬體與編譯器容易建構
* 最高效能
* 最低成本與電耗
* MIPS R2000
* CPU
* 32個暫存器
* ALU
* 乘除法
* FPU
* 暫存器
* ALU
* Coprocessor
* 錯誤處理
### 計算機硬體的運作
* **規律性易導致簡單的設計 Simoplicity favors regularity**
* MIPS所有指令都只執行一種運算並使用三個變數
* 載入/儲存
* 計算
* 跳躍/分支
* 浮點數
* 記憶體管理
* 其他
* 僅有三種格式
* `#`: 註解
### 計算機硬體的運算元
* **越小就越快 Smaller is faster**
* 內部電子訊號傳遞距離短,時脈即可高
* 暫存器 registers: 指令的運算元,32個
* `$s`: 高階語言變數暫存器,8個
* `$t`: MIPS暫時暫存器,8個
* 進化
* Accumulator: 1個暫存器 acc = acc + mem[A]
* Stack: tos = tos + next
* General Purpose Register: 32
* A = A + B
* A = B + C
* L/S
* 字組 word: 32 位元
* 資料陣列
* `4N($sM)`
### 有號與無號數字
* 2的補數 two's complement(主流)
* x+<span style="text-decoration:overline">x</span>=-1
* 1的補數 one's complement
* 早期科學計算機使用,有正0與負0
* 偏移表示法 biased notation
* 全0最小,全1最大
### 在計算機中表示指令
* 機器語言 machine language
* 十六進位表示法
* 指令大多使用數字代表
* 內儲程式 stored-program: 記憶體儲存編輯器、原始碼、編譯器、機器碼與資料文字(馮紐曼架構)
* 二進碼相容性 binary compatibility: 指令集不改就能相容
* 指令格式 instruction format
* 32位元
* 欄位 field
* op: 運作碼(opcode),6位元
* rs: 第一來源暫存器,5位元
* rt: 第二來源暫存器,5位元
* rd: 目的暫存器,5位元
* shmt: 位移量(shift amount),5位元
* funct: 功能碼(function code),6位元
* 常數或位址,16位元
* **好的設計需要有好的折衷 good design demands good compromises**
* 位址指標需要找方法能用較少的欄位長度表示出來
* 指令型態
* R型/R格式
* op+rs+rt+rd+shmt+funct
* I型/I格式
* op+rs+rt+constant
* 16位元的constant可以表示基底位置暫存器+-2^15^bytes距離的位置
* 換句話說暫存器變多會導致基底位置允許偏移量範圍變小
* 現在的暫存器數量大多是16或32個
* 多種格式增加硬體複雜度,但可以用使指令模樣相似一點稍微彌補
* opcode決定指令是R式或I式
* 暫存器運算與算數運算
* `lw` : 載入字組
* `sw` : 儲存字組
* `add` : 加
* `sub` : 減
* `addi` : 加立即值
* 對立即值做延伸後運算
### 邏輯運算
* 打包(packing)或取出(unpacking)字組內位元的運算
* 運算
* `sll` : 左移邏輯
* `srl` : 右移邏輯
* shamt 表示位移量
* 不使用 rs 和 funct
* `and` , `andi` : 及、及立即值
* `or` , `ori` : 或、或立即值
* `nor` : 反或
* `xor` : 互斥或
* 遮罩 mask: 用來過濾另一個暫存器資料的二進位數字樣式
* 要做出 not 使用 `nor` 與 0
* and 與 or 提供立即值版本,補 16 個零到高位形成常數
* C語言允許在字組中定義欄位 field,將多個物件打包入一個字組,使用 `and`、`or`、`sll`與`srl`操作欄位
### 能做決定的指令
* 分支指令
* 條件式分支 conditional branch
* `beq`: 若reg1==reg2則跳到label
* `bne`: 若不等...
* 無條件分支: unconditional branch
* `j`: jump
* 通常if-then-else會反轉condition,讓不符條件的跳到else
* 組譯器會協助處理分支位址
* 高階程式語言的優點在於不必明確寫出標籤與分支
* 同樣的指令可以處理迴圈
* 基本區塊 basic block
* 除結尾外沒有分支指令(結尾也未必要有),除開頭外沒有分支的標籤
* 編譯的第一階段工作就是分解出基本區塊
* 其他比較
* `slt`: 小於時設定,若reg2<reg3則reg1=1
* `slti`: 小於立即值時設定,若reg2<i則reg1=1\
* 組合以上四個指令就能達成六種邏輯比較然後分支
* 因「簡化」的設計理念,不設計相等或不等以外的分支指令
* 比較指令有無號版本(sltu與sltiu)
### 以計算機硬體來幫助程序呼叫
### MIPS 對 32 位元立即值及位址的定址法
### 平行性與指令:同步
### 翻譯與啟動一個程式
# 大且快:利用記憶體階層
- 區域性原則:程式在任何時候僅存取一小部分的位址空間
- 時間區域性:若一資料位置被存取,則可能其將再次被存取
- 空間區域性:若一資料位置被存取,則可能其附近資料位置將被存取
- 程式結構自然會產生區域性,如迴圈(時間區域性)、循序讀取指令或存取陣列(空間區域性)
- 記憶體階層:多層不同速度容量記憶體的結構
- 較快的記憶體單位成本較高、容量較小、離處理器越近
- 模擬出既大又快的記憶體使用
- 資料放置也依記憶體階層規則
### 快取的基礎
- 處理器與主記憶體間的記憶體階層
- 現亦可表示任何一種利用存取區域性的儲存體
- 直接對映
- 每個記憶體位置正好對映一個快取位置
- (區塊位址)取餘數(快取中的區塊數)
- 標籤:位於表格索引欄位,包含辨識快取字組是否為所需字組的位址資訊
- 有效位元:分辨空白區塊與有效資料區塊
- 大印象:在高階層預測所需資料,並保證錯失後在低階層尋找資料的機制
#### 存取一個快取
- 存取位址欄位
- 標籤欄位:與快取標籤位值比對
- 快取索引:選取區塊
- 本書架構
- 字組以4位元組對齊。最低2位元指向一個位元組在字組的位置,故忽略
- 考慮情形
- 32位元
- 直接對映
- 容量2個區塊,索引個位元
- 區塊2個字組,區塊字組使用個位元,其中兩個位元是位元組的部分
- 則標籤大小:
- 快取總位元數:
- 含有效欄位快取位元數:
- 較大的區塊可用空間區域性降低錯失率
- 但區塊大小佔不少的快取比例時錯失仍會上升(快取區塊數量變少)
- 且錯失成本增加,錯失懲罰(傳遞時間)因快取區塊大而顯著上升
- 儘早重新開始:
- 區塊字組一傳回即恢復執行
- 隱藏傳遞時間降低錯失懲罰
- 常見於處理器指令存取
- 對於資料存取效果較差。因資料字組較難以預測使用
- 所請求字組先送 或 重要字組先送:
- 從所需字組開始傳送至末尾,再傳送區塊前半部分
- 與儘早重新開始受限於相同特性
#### 處理快取錯失