สรุป Computer Architecture
ครบทั้ง 8 บท
อ่านทีละบท หนึ่งบทต่อหนึ่งหน้าจอ สรุปเป็นไทยแทรกศัพท์อังกฤษที่ใช้สอบ มีสูตร ตัวอย่างโจทย์ และเช็กลิสต์ท้ายบท
เลือกบทที่จะอ่าน
ทดสอบตัวเอง
อ่านสีของกล่องให้เป็น
ใจความที่ควรจำ
สูตรคำนวณ/นิยาม
โจทย์พร้อมวิธีทำ
จุดที่มักออก/เช็กลิสต์
จุดผิดพลาด/ข้อสังเกต
หมายเหตุ: สรุปจากข้อความและรูปในสไลด์ PDF บางส่วนเสริมจากตำราอ้างอิงของสไลด์ (Patterson & Hennessy / Stallings) ถ้าขัดกับที่อาจารย์สอน ให้ยึดอาจารย์
Basic Computer Components & Introduction to Computer Architecture
1.1 Architecture vs Organization
| Computer Architecture (สถาปัตยกรรม) | Computer Organization (โครงสร้างการจัดระบบ) | |
|---|---|---|
| คืออะไร | คุณสมบัติของระบบที่ programmer มองเห็น และมีผลต่อการทำงานเชิงตรรกะของโปรแกรม | หน่วยปฏิบัติการและการเชื่อมต่อที่ทำให้ architecture เกิดขึ้นจริง |
| ตัวอย่าง | Instruction set, addressing modes, data types | Cache, pipeline, bus width, clock speed, control signals |
| คำถามที่ตอบ | WHAT — เครื่องทำอะไรได้ | HOW — ทำได้อย่างไรในระดับวงจร |
| เกี่ยวกับใคร | ผู้ใช้ / programmer | วิศวกรฮาร์ดแวร์ |
มุมมองเก่า: architecture = การออกแบบ ISA (Instruction Set Architecture) คือ registers, memory addressing, addressing modes, instruction operands, operations, control flow, instruction encoding
มุมมองจริง: ออกแบบให้ได้ performance สูงสุดภายใต้ข้อจำกัด cost, power, availability ครอบคลุม ISA + microarchitecture + hardware
1.2 Classes of Computers & Cloud Computing
- Supercomputers — คำนวณวิทยาศาสตร์/วิศวกรรมระดับสูง ความสามารถสูงสุด แต่เป็นส่วนเล็กของตลาด
- Embedded Computers — ซ่อนอยู่ในอุปกรณ์ ถูกจำกัดเข้มทั้ง power / performance / cost
- (ตามสไลด์ส่วน Parallelism ยังมี PC/Server/Personal Mobile Device ในตำราหลัก)
Cloud Computing
โมเดลที่เปิดให้เข้าถึง ทรัพยากรคอมพิวเตอร์ที่แชร์ร่วมกัน ได้ทุกที่ ตามต้องการ (on demand) ผ่านเครือข่าย
- Cloud networking — เครือข่ายและระบบจัดการที่ต้องมีเพื่อให้ cloud ทำงานได้
- Cloud storage — ฐานข้อมูลและแอปฐานข้อมูลที่โฮสต์บน cloud server ระยะไกล
| Service model | ผู้ให้บริการดูแล | ลูกค้าดูแลเอง | ตัวอย่าง |
|---|---|---|---|
| SaaS Software as a Service | ทุกอย่างถึง Application | แค่ใช้งาน | Google Workspace, Microsoft 365 |
| PaaS Platform as a Service | ตั้งแต่ OS / runtime / DB ลงไป | Application (และข้อมูล) | Google App Engine, Azure |
| IaaS Infrastructure as a Service | Virtual machine, server, storage, network | OS, runtime, DB, application | AWS, Azure VM (ควบคุมผ่าน API) |
1.3 Eight Great Ideas in Computer Architecture
- Design for Moore's Law — ออกแบบโดยคาดว่าทรานซิสเตอร์เพิ่มขึ้นเรื่อย ๆ
- Use abstraction to simplify design — ซ่อนรายละเอียดเป็นชั้น ๆ
- Make the common case fast — ทำเคสที่เกิดบ่อยให้เร็ว
- Performance via parallelism — ทำหลายอย่างพร้อมกัน
- Performance via pipelining — ทำเป็นสายพาน (ซ้อนขั้นตอน)
- Performance via prediction — เดาล่วงหน้า (เช่น branch prediction) ถ้าเดาถูกคุ้มกว่ารอ
- Hierarchy of memories — หน่วยความจำเป็นลำดับชั้น เร็ว/เล็ก/แพง → ช้า/ใหญ่/ถูก
- Dependability via redundancy — ทนทานโดยมีของสำรอง
ข้อ 4–6 อาจารย์จัดเป็นกลุ่ม "เพิ่ม Performance"
ปัจจัยที่กำหนด Performance
| ส่วน | มีผลต่อ |
|---|---|
| Algorithm | จำนวน operations ที่ต้องทำ |
| Programming language, compiler, architecture | จำนวน machine instructions ต่อ operation |
| Processor & memory system | instructions ถูก execute เร็วแค่ไหน |
| I/O system (รวม OS) | I/O operations ถูก execute เร็วแค่ไหน |
1.4 Below Your Program
ชั้นของซอฟต์แวร์ (จากนอกเข้าใน): Application software → System software → Hardware
- Application software — เขียนด้วย high-level language
- System software — Compiler แปล HLL เป็น machine code; Operating System ให้บริการ: จัดการ input/output, จัดการ memory และ storage, จัด schedule งานและแชร์ทรัพยากร
- Hardware — processor, memory, I/O controllers
Levels of Program Code
- High-level language (เช่น C) — ใกล้โจทย์ ผลิตภาพดี พกพาข้ามเครื่องได้ ↓ Compiler
- Assembly language — ข้อความแทนคำสั่ง (ตัวอย่างในสไลด์เป็น RISC-V:
slli, add, ld, sd, jalr) ↓ Assembler - Machine language — เลขฐานสอง (bits) เข้ารหัส instruction และ data
1.5 Components of Computers & Inside the CPU
ส่วนประกอบ: Input devices, CPU, Memory (RAM), Storage devices, Motherboard, Output devices, Power supply unit, GPU
ภายใน CPU
| ส่วน | หน้าที่ |
|---|---|
| Control Unit (CU) | ควบคุมการทำงานของ CPU |
| ALU (Arithmetic & Logic Unit) | ประมวลผลข้อมูล คำนวณ/ตรรกะ |
| Registers | ที่เก็บข้อมูลภายใน CPU |
| CPU interconnection | ช่องสื่อสารระหว่าง CU, ALU, registers |
Machine Cycle: Fetch → Decode → Execute → Store
- Fetch ดึง instruction จาก memory
- Decode แปล instruction เป็นคำสั่งย่อยให้ control unit
- Execute ทำคำสั่ง (ที่ ALU)
- Store เก็บผลลัพธ์ลง memory
Registers สำคัญ
- PC (Program Counter) — เก็บ address ของ instruction ถัดไป
- IR (Instruction Register) — เก็บ instruction ที่กำลังทำ
- Status register — เก็บสถานะ / flags
1.6 Cache, Multi-core vs Multi-thread
Cache memory
- อยู่ระหว่าง processor กับ main memory; เล็กกว่าและเร็วกว่า main memory
- ใช้เก็บข้อมูลจาก main memory ที่ น่าจะถูกใช้ในอนาคตอันใกล้ เพื่อเร่งการเข้าถึง
- หลายระดับ: L1 (ใกล้ core ที่สุด เร็วและเล็กที่สุด) → L2 → L3 (ไกลออกไปเรื่อย ๆ)
Multi-core vs Multi-thread
| Multi-core | Multi-thread |
|---|---|
| มี hardware จริง หลายแกนทางกายภาพ | เสมือน (virtual) — เทคนิคแบ่งการทำงาน |
| แยกงานชิ้นใหญ่ประมวลผล คู่ขนาน (parallel) จริง | จัดการงานเบื้องหลัง แบ่งงานย่อยป้อนให้ core |
| อุปมา: จำนวน เชฟ ในครัว | อุปมา: จำนวน แขน ของเชฟแต่ละคน |
| Hyper-Threading (Intel) / SMT (AMD) คือ multi-thread · ใน multicore แต่ละ core มี individual memory (cache) แล้วแชร์ shared memory ผ่าน bus interface | |
1.7 RISC vs CISC, Embedded Systems, Parallelism
| RISC | CISC |
|---|---|
| Reduced Instruction Set Computing | Complex Instruction Set Computing |
| ใช้ Decoder (hardwired) ถอดรหัส — คำสั่งน้อย เรียบง่าย | ใช้ microprogram (mPC, mPM = microprogram counter / microprocessor mode) ควบคุม — คำสั่งซับซ้อน |
Embedded Systems
- อิเล็กทรอนิกส์ + ซอฟต์แวร์ฝังในผลิตภัณฑ์ ผลิตปีละพันล้านเครื่อง
- เกาะติดกับสภาพแวดล้อม → มี real-time constraints และต้องจัดการหลายกิจกรรมพร้อมกัน
- ตัวอย่าง ARM Cortex-M: interrupt เร็วและ deterministic, กินไฟต่ำ; Cortex-M3 เป็น microcontroller 16/32-bit มี debug/trace
Parallelism
| ระดับ application | ระดับ architecture |
|---|---|
| DLP Data-Level Parallelism | ILP Instruction-Level · Vector/GPU · Thread-Level · Request-Level |
| TLP Task-Level Parallelism |
Flynn's Taxonomy
| ชนิด | ความหมาย | ตัวอย่าง |
|---|---|---|
| SISD | 1 instruction stream, 1 data stream | CPU ธรรมดา |
| SIMD | 1 instruction, หลาย data | Vector architectures, Multimedia extensions, GPU |
| MISD | หลาย instruction, 1 data | ไม่มี commercial implementation |
| MIMD | หลาย instruction, หลาย data | Tightly-coupled / Loosely-coupled MIMD |
System-level architecture patterns
Monolithic (ระบบเดียวรวม) · Client-server (แยกเครื่องร้องขอ/ให้บริการ) · Distributed (คำนวณกระจายหลายเครื่องในเครือข่าย) · Microservices (บริการย่อยแยก deploy อิสระ — เป็น software pattern)
1.8 Performance — สูตรที่ต้องจำ
"X เร็วกว่า Y n เท่า" ⇒ PerformanceX / PerformanceY = ExecTimeY / ExecTimeX = n
ตัวอย่าง: A ใช้ 10s, B ใช้ 15s → ExecTimeB/ExecTimeA = 15/10 = 1.5 → A เร็วกว่า B 1.5 เท่า
วัด Execution Time
- Elapsed time (wall-clock) — เวลาตอบสนองรวมทุกอย่าง: processing, I/O, OS overhead, idle → ตัวกำหนดประสิทธิภาพระบบ
- CPU time — เวลาที่ CPU ประมวลผลงานนั้นจริง ๆ ไม่นับ I/O และงานอื่น; แบ่งเป็น user CPU time + system CPU time
Clock
- Clock period = ระยะเวลา 1 cycle เช่น 250 ps = 0.25 ns = 250×10−12 s
- Clock frequency (rate) = cycles ต่อวินาที เช่น 4.0 GHz = 4000 MHz = 4.0×109 Hz
- Rate = 1 / Period
ปรับปรุง performance ได้โดย ลดจำนวน clock cycles หรือ เพิ่ม clock rate (ผู้ออกแบบมักต้อง trade-off ระหว่าง clock rate กับจำนวน cycle)
Instruction Count และ CPI
CPU Time = Instruction Count × CPI × Clock Cycle Time = (Instruction Count × CPI) / Clock Rate
- Instruction Count ขึ้นกับ program, ISA และ compiler
- CPI ขึ้นกับ hardware ของ CPU; ถ้าแต่ละ instruction มี CPI ต่างกัน ใช้ average CPI ซึ่งขึ้นกับ instruction mix
ตัวอย่างที่ 1: CPU Time
Clock CyclesA = 10 s × 2 GHz = 20×109
Clock RateB = (1.2 × 20×109) / 6 s = 24×109 / 6 = 4 GHz
ตัวอย่างที่ 2: CPI (ISA เดียวกัน)
CPU TimeA = I × 2.0 × 250 = I × 500 ps
CPU TimeB = I × 1.2 × 500 = I × 600 ps
B/A = 600/500 = 1.2 → A เร็วกว่า B 1.2 เท่า
Computer Systems, Computer Functions, Processor Structure and Function
2.1 Von Neumann vs Harvard
| Von Neumann | Harvard | |
|---|---|---|
| แนวคิด | Stored-program concept — memory เก็บทั้งโปรแกรมและข้อมูล | แยก memory และ bus ของ instruction กับ data |
| การเข้าถึง | memory ถูกอ้างด้วย address ไม่สนว่าเนื้อหาเป็นชนิดใด; execute แบบเรียงลำดับ (sequential/linear) | ตัด bottleneck แต่ซับซ้อนขึ้น |
| ใช้ใน | คอมพิวเตอร์ทั่วไป (ผู้คิด: John von Neumann, Princeton IAS) | DSP และ microcontroller |
| แบบ hybrid: Harvard ที่ระดับ L1 cache แต่ Von Neumann ที่ main memory | ||
2.2 BUS
- ชนิด: point-to-point และ multipoint (shared resource ต้องควบคุมด้วย protocol ใน hardware)
- ประกอบด้วย 3 สาย: Data lines (ส่งบิต) · Control lines (กำหนดทิศทาง และใครใช้ bus ได้เมื่อไร) · Address lines (ระบุต้นทาง/ปลายทางของข้อมูล)
Bus arbitration — 4 แบบ (กรณีมี bus master หลายตัว)
| แบบ | วิธีทำงาน |
|---|---|
| Distributed, self-detection | อุปกรณ์ตัดสินกันเองว่าใครได้ bus |
| Distributed, collision-detection | ใครจะใช้ก็ส่งได้ ถ้าข้อมูลชนกันก็ลองใหม่ |
| Daisy chain | ส่งต่อสิทธิ์จากอุปกรณ์ priority สูงสุดลงไปต่ำสุด |
| Centralized parallel | ทุกอุปกรณ์ต่อตรงเข้าวงจร arbitration ตัวกลาง |
2.3 Hardware vs Software approach
- (a) Programming in hardware — ลำดับฟังก์ชันคำนวณ/ตรรกะถูก "เดินสาย" ตายตัว เปลี่ยนงานต้องเดินสายใหม่
- (b) Programming in software — ส่วนหนึ่งของ hardware (instruction interpreter) แปลรหัสคำสั่ง แล้วสร้าง control signals ให้หน่วยคำนวณอเนกประสงค์ → เปลี่ยนงานแค่ใส่ชุดรหัสใหม่ ไม่ต้องรื้อ hardware
องค์ประกอบหลัก: CPU (instruction interpreter + general-purpose arithmetic/logic functions + I/O components) พร้อมวิธีรับข้อมูลเข้าและรายงานผล
2.4 Registers และ Instruction Cycle
| Register | หน้าที่ |
|---|---|
| MAR Memory Address Register | ระบุ address ใน memory ที่จะอ่าน/เขียนครั้งถัดไป |
| MBR Memory Buffer Register | เก็บข้อมูลที่จะเขียนลง memory หรือที่อ่านมาจาก memory |
| I/OAR I/O Address Register | ระบุอุปกรณ์ I/O ตัวที่ต้องการ |
| I/OBR I/O Buffer Register | แลกเปลี่ยนข้อมูลระหว่าง I/O module กับ CPU |
Fetch cycle
- ต้นทุก instruction cycle CPU ดึง instruction จาก memory
- PC เก็บ address ของ instruction ที่จะดึง
- หลัง fetch PC เพิ่มอัตโนมัติ เพื่อชี้ instruction ถัดไป
- instruction ที่ดึงมาถูกโหลดเข้า IR
- CPU แปลความ (interpret) แล้วทำตาม
ตัวอย่างโปรแกรมแบบ 16-bit (สไลด์)
- รูปแบบ instruction: 4 bit Opcode + 12 bit Address
- Integer format: 1 bit sign (S) + 15 bit magnitude
- Register: PC, IR, AC (Accumulator — ที่พักชั่วคราว)
- Opcode ตัวอย่าง:
0001= Load AC from memory ·0010= Store AC to memory ·0101= Add to AC from memory
2.5 MARIE — computer จำลองสำหรับเรียน
7 registers
| Register | ขนาด | เก็บอะไร |
|---|---|---|
| AC Accumulator | 16 bit | operand ตัวหนึ่ง / ผลลัพธ์ / ค่าเงื่อนไข |
| MAR | 12 bit | address ของ instruction หรือ operand |
| MBR | 16 bit | ข้อมูลหลังดึง / ก่อนใส่ memory |
| PC | 12 bit | address ของ instruction ถัดไป |
| IR | 16 bit | instruction ที่กำลังจะทำ |
| InREG | 8 bit | ข้อมูลจาก input device |
| OutREG | 8 bit | ข้อมูลพร้อมส่งออก output device |
Registers เชื่อมกันและเชื่อม main memory ผ่าน common data bus; มีทางตรงแยกระหว่าง AC ↔ MBR และ ALU ↔ AC/MBR เพื่อโอนข้อมูลโดยไม่ผ่าน main bus. อุปกรณ์แต่ละตัวมีเลขประจำตัวที่ตั้งบน control lines
รูปแบบ instruction (16 bit)
bit 15–12 = Opcode (4 bit) · bit 11–0 = Address (12 bit) → ISA ของ MARIE มี 13 คำสั่ง (ตารางด้านล่างคือ 9 คำสั่งพื้นฐานในสไลด์)
| Binary | Hex | Instruction | ความหมาย |
|---|---|---|---|
| 0001 | 1 | Load X | โหลดค่าที่ address X เข้า AC |
| 0010 | 2 | Store X | เก็บค่า AC ลง address X |
| 0011 | 3 | Add X | บวกค่าที่ address X เข้า AC |
| 0100 | 4 | Subt X | ลบค่าที่ address X ออกจาก AC |
| 0101 | 5 | Input | รับค่าจาก keyboard เข้า AC |
| 0110 | 6 | Output | แสดงค่าใน AC ที่จอ |
| 0111 | 7 | Halt | จบโปรแกรม |
| 1000 | 8 | Skipcond | ข้าม instruction ถัดไปตามเงื่อนไข |
| 1001 | 9 | Jump X | โหลดค่า X เข้า PC |
0001 + address 000000000011.SKIPCOND (opcode 8): ดู bit 11–10 —
00 ข้ามถ้า AC < 0 · 01 ข้ามถ้า AC = 0 · 10 ข้ามถ้า AC > 0 (สไลด์ RTL เขียนเป็น 11 สำหรับ > 0 แต่ตัวอย่างบิตใช้ 10 — ตามสไลด์ที่ว่า "bits 11 and 10 are 10, skip if AC > 0")RTL — Register Transfer Language
แต่ละ instruction ประกอบด้วย microoperations; RTL ใช้ M[X] = ค่าใน memory ตำแหน่ง X และ ← = โอนข้อมูล
| LOAD X | ADD X |
|---|---|
MAR ← XMBR ← M[MAR]AC ← MBR | MAR ← XMBR ← M[MAR]AC ← AC + MBR |
SKIPCOND: if IR[11–10] = 00 and AC < 0 then PC ← PC + 1 · = 01 and AC = 0 then PC ← PC + 1 · = 11 and AC > 0 then PC ← PC + 1
Fetch-Decode-Execute
- Fetch instruction จาก memory ใส่ IR (
MAR ← PC,IR ← M[MAR],PC ← PC + 1) - Decode หาว่าต้องทำอะไร (
MAR ← IR[11–0], ถอดรหัส IR[15–12]) - ถ้ามี operand ใน memory ดึงมาใส่ MBR
- Execute
ตัวอย่างโปรแกรม (address 100–106 hex)
| Addr | Instruction | Hex |
|---|---|---|
| 100 | Load 104 | 1104 |
| 101 | Add 105 | 3105 |
| 102 | Store 106 | 4106 (ตามสไลด์; Store ควรเป็น 2xxx) |
| 103 | Halt | 7000 |
| 104 | 0023 | 0023 (ข้อมูล = 35) |
| 105 | FFE9 | FFE9 (= −23) |
| 106 | 0000 | 0000 (เก็บผล) |
ผล: 0023 + FFE9 = 000C (35 − 23 = 12) เก็บที่ 106. ADD 105 trace: เริ่ม PC=101 → MAR←PC (MAR=101) → IR←M[MAR] (IR=3105) → PC←PC+1 (PC=102) → MAR←IR[11–0] (MAR=105) → MBR←M[MAR] (MBR=FFE9) → AC←AC+MBR (AC=0023+FFE9=000C)
4106 ซึ่งไม่ตรง opcode Store (2) ในตาราง ระวังเวลาทำข้อสอบ ให้ยึด opcode จากตาราง instruction2.6 Interrupts
ทุกคอมพิวเตอร์มีวิธี ขัดจังหวะ fetch-decode-execute cycle
เมื่อไรเกิด interrupt
- user break (เช่น Ctrl+C)
- มีการร้องขอ I/O
- เกิด error ร้ายแรง
แหล่งกำเนิด: Hardware interrupt และ Software interrupt (software เรียก OS ผ่าน system call)
4 ชนิดของ Interrupt
| Class | เกิดจาก |
|---|---|
| Program | ผลของการ execute instruction: arithmetic overflow, หารด้วยศูนย์, สั่ง instruction ผิดกฎหมาย, อ้างนอกขอบเขต memory ของผู้ใช้ |
| Timer | timer ภายใน processor ให้ OS ทำงานเป็นช่วง ๆ |
| I/O | I/O controller แจ้งว่าทำเสร็จ ขอบริการ หรือเกิดข้อผิดพลาด |
| Hardware failure | ไฟดับ, memory parity error |
ขั้นตอนเมื่อมี interrupt
- เพิ่ม Interrupt step ต่อท้าย cycle: หลัง execute ตรวจว่ามี interrupt ไหม → ถ้ามี ไปทำ ISR (Interrupt Service Routine) แล้วกลับมาทำต่อ
- ระหว่างทำ interrupt ระบบทั่วไปมัก ปิด interrupt (ตั้ง bit ใน flags register) — interrupt ที่ถูกเมินแบบนี้คือ maskable
- Nonmaskable = ต้องจัดการเสมอเพื่อให้ระบบเสถียร
- Interrupt เหมาะกับ I/O; แต่ MARIE ใช้ programmed I/O แบบปรับ: ผลลัพธ์ใส่ OutREG และ CPU polling InREG จนมีข้อมูลก็คัดลอกเข้า AC
Timing กับ I/O และ Multiple interrupts
- Short I/O wait — การรอ I/O สั้น CPU รอไม่เสียมาก; Long I/O wait — รอนาน ถ้าไม่มี interrupt CPU ว่างเปล่า ถ้ามี interrupt CPU ไปทำงานอื่นระหว่างรอได้ → ใช้ CPU คุ้มกว่า
- Multiple interrupts: จัดการได้ 2 วิธี — (1) ปิด interrupt ระหว่างทำ ISR (เรียงตามลำดับที่มา) (2) ใช้ priority ให้ interrupt สำคัญกว่า ขัดจังหวะ ISR ที่ต่ำกว่าได้ (nested)
- ตัวอย่างสไลด์: printer (t=10), communication (t=15), disk (t=25) ขัดผ่านโปรแกรมผู้ใช้ — ตัวที่ priority สูงกว่าแทรกเข้าไปก่อน
Data Representation, ISA & Assembly Language (RISC-V)
A1 Data Representation & Signed integers
- ข้อมูลเก็บใน register ซึ่งมีจำนวนและขนาด จำกัด
- ข้อมูลแบ่งเป็น Quantitative (ตัวเลข) และ Qualitative (อักขระ/สัญลักษณ์)
- Quantitative → Integers (unsigned เช่น 20; signed เช่น +20, −20) และ Non-integers / Floating point (10.25, 3.3333…, 1/8 = 0.125)
- Unsigned n bit: ช่วง 0 ถึง 2n − 1
Signed integer ต้องมีวิธีแทนค่าลบ 3 แบบ: (1) Sign & Magnitude (2) Complement method (1's และ 2's) (3) Bias / Excess notation
A2 Sign & Magnitude (S&M)
- บิตซ้ายสุด = sign bit S: 0 = บวก (หรือศูนย์), 1 = ลบ (หรือศูนย์); ที่เหลือ n บิตเป็น magnitude
- ช่วงค่า: −(2n−1) ถึง +(2n−1) (n = จำนวนบิต magnitude)
- ตัวอย่าง 8 บิต:
0000 0000= +0,1000 0000= −0 → ศูนย์ไม่ unique (มี 2 ค่า); 8 บิตมีช่วง −127 ถึง +127
| ข้อดี | ข้อเสีย |
|---|---|
| กลับเครื่องหมายง่าย (flip sign bit) · หาค่าสัมบูรณ์ |a| ง่าย (flip sign bit) | บวกค่าลบ ≠ ลบ: เช่น 2 + (−3) ต้องใช้ operation ต่างกัน · ศูนย์ไม่ unique |
A3 Complement Method
(r−1)'s complement = (rn − 1) − m
r's complement = (rn − 1) − m + 1 = rn − m
ตัวอย่างฐาน 10: n = 3, m = 382 → 9's complement (−382) = 617 · 10's complement = 618
1's complement (ฐาน 2)
- คำนวณ (2n−1) − m = กลับทุกบิต (invert)
- m = 0101 (4 บิต) → 1010 = −5 ใน 1's complement
- m = 00101011 → 11010100 · m = 00000000 (= 0) → 11111111 (= −0)
- ช่วง 8 บิต: −127 ถึง +127 · มี สองศูนย์ (+0, −0)
- การบวก: ถ้าผลมี carry ออกมา ให้ นำ carry ไปบวกที่ LSB (end-around carry)
110 + 100 = 1 010 → carry 1 → 010 + 1 = 011 = 3 ✔
2's complement
- ไม่ต้องทำ end-around carry · สร้างโดย หา 1's complement แล้ว +1 ที่ LSB
- ช่วง 8 บิต: −128 ถึง +127 (−128 เพราะมีการ +1 ให้ค่าลบ) · มีศูนย์ตัวเดียว
- Short-cut: เริ่มจาก LSB หาบิต 1 ตัวแรก → คงบิตนั้นและบิตขวาไว้ แล้ว กลับ (invert) ทุกบิตทางซ้าย
6 + (−5) บน 4 บิต: 5 = 0101, −5 = 1011 → 0110 + 1011 = 1 0001 → ทิ้ง (discard) carry ออก → 0001 = 1 ✔
เปรียบเทียบ
| Sign & Magnitude | 1's complement | 2's complement | |
|---|---|---|---|
| ศูนย์ | 2 ค่า | 2 ค่า | 1 ค่า |
| ช่วง 8 บิต | −127…+127 | −127…+127 | −128…+127 (ไม่สมมาตร) |
| บวก/ลบ | ต่างกัน ต้องแยกวงจร | end-around carry | วงจรบวกอย่างเดียว ทิ้ง carry |
2's complement ไม่ต้องมีวงจรลบแยก (ใช้ NOT + บวก ถูกกว่าในการออกแบบวงจร) แต่ คูณ/หารช้า
A4 Bias (Excess) Notation
ค่าที่เก็บ = ค่าจริง + bias · ตาราง Biased-127 (8 บิต):
| Bit pattern | Unsigned | Biased-127 |
|---|---|---|
| 0000 0000 | 0 | −127 |
| 0000 0001 | 1 | −126 |
| 0111 1110 | 126 | −1 |
| 0111 1111 | 127 | 0 |
| 1000 0000 | 128 | +1 |
| 1111 1111 | 255 | +128 |
ค่าจริง = unsigned − 127 (ใช้เป็น exponent ใน floating point)
A5 Floating Point & IEEE 754
| Single precision | Double precision | |
|---|---|---|
| ขนาด | 32 bit | 64 bit |
| Sign | 1 bit (bit 31) | 1 bit (bit 63) |
| Exponent | 8 bit (bit 30–23) | 11 bit (bit 62–52) |
| Mantissa | 23 bit (bit 22–0) | 52 bit (bit 51–0) |
e = E − 127 ⇒ E = e + 127 · สิ่งที่ถูก เก็บ คือ E (biased)
- mantissa m อยู่ในช่วง 1 ถึง (2 − 2−23) (มี implicit leading 1)
- E ใช้ได้ 1 ถึง 254 → e = −126 ถึง +127
- E = 0 และ E = 255 สงวนไว้ แทน −∞, +∞, NaN
- ค่ามากสุด ≈ 2 × 2127 = 2128
ทบทวน Binary fraction
5.8125 เป็นฐาน 2: ส่วนเต็ม 5 = 101 · ส่วนทศนิยม คูณ 2 ซ้ำ เก็บส่วนเต็มทุกครั้ง: 0.8125×2=1.625 → 0.625×2=1.25 → 0.25×2=0.5 → 0.5×2=1.0 ⇒ .1101 ⇒ 101.1101₂
ตัวอย่าง: 17.15 เป็น IEEE single
e = 4 → E = 4 + 127 = 131 = 1000 0011
Sign = 0 · Exponent =
1000 0011 · Mantissa = 0001 0010 0110 0… (เก็บเฉพาะหลัง "1.")A6 Character Representation
- 1 ไบต์ (8 บิต) แทนได้ 256 อักขระ · มาตรฐาน: ASCII (American Standard Code for Information Interchange), EBCDIC (Extended Binary-Coded Decimal Interchange Code), Unicode
- ASCII: มาตรฐานโลก de facto มี 128 ตัว (7 บิต: 000 0000–111 1111) = ตัวอักษรละติน ใหญ่/เล็ก ตัวเลข เครื่องหมายวรรคตอน และ control; อาจมี parity bit เพิ่ม · (RISC-V ส่วนอักขระ: 95 graphic + 33 control)
- จุดต้องรู้: รหัส ASCII ของตัวเลข ไม่เท่ากับค่าตัวเลข · พิมพ์ใหญ่/เล็กต่างกัน 0x20 (= 32 = 0010 0000) — Shift key clear bit 5 · ตัวอย่าง A = 65 = 0100 0001, a = 97 = 0110 0001
- ภาษาส่วนใหญ่ต้องการมากกว่า 128 ตัว → Latin-1 (256 ตัว = ASCII + graphic เพิ่ม 96), Unicode (32-bit ใน Java, C++ wide char; รองรับอักษรทั่วโลก; UTF-8 / UTF-16 เป็น variable-length)
B1 RISC-V — พื้นฐาน
- Instruction set ต่างกันในแต่ละเครื่อง; เครื่องยุคแรกคำสั่งง่าย (implement ง่าย) เครื่องสมัยใหม่หลายตัวก็ง่ายเช่นกัน
- RISC-V: เกิดที่ UC Berkeley เป็น open ISA ปัจจุบันดูแลโดย RISC-V Foundation; เป็นตัวแทนของ ISA ยุคใหม่ ใช้ใน embedded (consumer electronics, network/storage, cameras, printers)
Arithmetic
add/sub มี 3 operands (2 source, 1 destination): add a, b, c // a gets b + c
f = (g + h) − (i + j); (f…j ใน x19…x23)add x5, x20, x21 // t0 = g + h add x6, x22, x23 // t1 = i + j sub x19, x5, x6 // f = t0 - t1
Register file
- RISC-V มี 32 × 64-bit register (x0–x31) · ข้อมูล 64 บิต = doubleword · 32 บิต = word
- Design Principle 2: Smaller is faster — register น้อยเร็วกว่า (เทียบ main memory ที่มีล้านตำแหน่ง)
| Register | ชื่อ/หน้าที่ |
|---|---|
| x0 | ค่าคงที่ 0 (เขียนทับไม่ได้) |
| x1 | return address (ra) |
| x2 | stack pointer (sp) |
| x3 | global pointer (gp) |
| x4 | thread pointer (tp) |
| x5–x7, x28–x31 | temporaries (callee ไม่ต้องเก็บรักษา) |
| x8 (fp), x9, x18–x27 | saved registers (ถ้าใช้ callee ต้อง save/restore) |
| x10–x11 | function arguments / return values |
| x12–x17 | function arguments |
Registers vs Memory: register เร็วกว่า; ทำงานกับ memory ต้อง load/store (instruction เพิ่ม) → compiler ควรใช้ register ให้มากที่สุด ย้ายลง memory (spill) เฉพาะตัวแปรที่ใช้ไม่บ่อย
Immediate operands
ค่าคงที่ฝังในคำสั่ง เช่น addi x22, x22, 4 — ไม่มี subi (ใช้ addi กับค่าลบ) · Make the common case fast: ค่าคงที่เล็กพบบ่อย ไม่ต้อง load จาก memory
B2 Memory operands & Endian
- Main memory เก็บ composite data (array, structure, dynamic data); ทำเลขต้อง load → register → store กลับ
- Memory เป็น byte addressed (แต่ละ address = 1 byte); RISC-V เป็น Little Endian — byte น้อยที่สุด (LSB) อยู่ address ต่ำสุด ของ word · (Big Endian = MSB ที่ address ต่ำสุด)
- RISC-V ไม่บังคับ alignment (บาง ISA บังคับ)
A[12] = h + A[8]; (h ใน x21, base address ของ A ใน x22)index 8 × 8 byte/doubleword = offset 64, index 12 → 96
ld x9, 64(x22) // x9 = A[8] add x9, x21, x9 // x9 = h + A[8] sd x9, 96(x22) // A[12] = x9
ld = load doubleword · sd = store doubleword · รูปแบบ op reg, offset(base)
B3 Instruction formats (เข้ารหัส 32 บิต)
คำสั่งถูกเก็บเป็น เลขฐานสองเหมือนข้อมูล (stored program) — ทุก instruction ยาว 32 bit
R-format (register-register)
| funct7 | rs2 | rs1 | funct3 | rd | opcode |
|---|---|---|---|---|---|
| 7 bit | 5 | 5 | 3 | 5 | 7 |
- opcode ชนิดคำสั่ง · rd register ปลายทาง · funct3 / funct7 opcode เพิ่มเติม · rs1, rs2 register ต้นทาง
0000000 10101 10100 000 01001 0110011 = 0x015A04B3I-format (immediate arithmetic & load)
| immediate [11:0] | rs1 | funct3 | rd | opcode |
|---|---|---|---|---|
| 12 bit | 5 | 3 | 5 | 7 |
- immediate เป็น 2's complement และ sign-extended · rs1 = source หรือ base address · ใช้กับ addi, ld ฯลฯ
S-format (store)
| imm[11:5] | rs2 | rs1 | funct3 | imm[4:0] | opcode |
|---|---|---|---|---|---|
| 7 | 5 | 5 | 3 | 5 | 7 |
- rs1 = base address · rs2 = ค่าที่จะเก็บ · immediate = offset ถูก แยกเป็นสองท่อน เพื่อให้ตำแหน่ง rs1/rs2 อยู่ที่เดิมเสมอ
สรุปทุก format (Encoding summary)
| Format | ใช้กับ |
|---|---|
| R | คำสั่งเลขคณิต/ตรรกะ register-register |
| I | immediate arithmetic, loads |
| S | stores |
| SB | conditional branch |
| UJ | unconditional jump (jal) |
| U | upper immediate (lui) |
Stored-program
คำสั่งและข้อมูลเป็นเลขฐานสองเก็บใน memory เหมือนกัน → โปรแกรมกระทำกับโปรแกรมได้ (compiler, linker) · Binary compatibility ทำให้โปรแกรมที่ compile แล้วรันบนเครื่องอื่นได้ (ISA มาตรฐาน)
Sign extension & ตัวเลข
- Unsigned n บิต: 0…2n−1 · 2's complement: −2n−1…2n−1−1
- Negation = complement แล้ว +1 (เช่น +2 = 0…0010, −2 = 1…1110)
- Sign extension: ขยายความกว้างโดยทำซ้ำ sign bit —
lbsign-extend,lbuzero-extend
B4 Logical & Shift
| Operation | C | Java | RISC-V |
|---|---|---|---|
| Shift left | << | << | slli |
| Shift right | >> | >>> | srli |
| AND | & | & | and, andi |
| OR | | | | | or, ori |
| XOR | ^ | ^ | xor, xori |
| NOT | ~ | ~ | (ใช้ xor กับ −1) |
- slli by i bit = คูณด้วย 2i (เติม 0 ทางขวา) · srli by i bit = หารด้วย 2i (เฉพาะ unsigned)
- Shift format: funct6 (6) | immed (6) | rs1 | funct3 | rd | opcode — immed = จำนวนตำแหน่งที่เลื่อน
- AND ใช้ mask บิต: เลือกบางบิต ที่เหลือเคลียร์เป็น 0 · OR ใช้ set บิต · XOR ใช้ toggle/เปรียบเทียบ
B5 Conditional, If, Loop
beq rs1, rs2, L1: if (rs1 == rs2) กระโดดไป L1 ·bne: if (rs1 != rs2)blt(<) ·bge(≥) signed ·bltu,bgeuunsigned- ไม่ branch ก็ทำคำสั่งถัดไปตามลำดับ
bne x22, x23, Else
add x19, x20, x21
beq x0, x0, Exit // unconditional
Else: sub x19, x20, x21
Exit: ...
Assembler คำนวณ address ของ label เองLoop: slli x10, x22, 3 // x10 = i*8
add x10, x10, x25 // address of save[i]
ld x9, 0(x10)
bne x9, x24, Exit
addi x22, x22, 1
beq x0, x0, Loop
Exit: ...bge x23, x22, Exit // branch if b >= a addi x22, x22, 1 Exit:
Basic block = ลำดับคำสั่งที่ ไม่มี branch ฝังกลาง (ยกเว้นท้าย) และ ไม่มี branch target (ยกเว้นต้น) — compiler ใช้ optimize, processor ขั้นสูงเร่งได้
blt taken · unsigned: x22 > x23 (4,294,967,295 > 1) → bltu ไม่ takenB6 Procedure Calling & Stack
6 ขั้นตอน
- วาง parameter ใน x10–x17
- โอนการควบคุมไปที่ procedure
- จัดสรร storage (stack) ให้ procedure
- ทำงานของ procedure
- วางผลลัพธ์ใน register ให้ caller
- กลับไปจุดที่เรียก (address ใน x1)
- Call:
jal x1, ProcedureLabel— เก็บ address ของคำสั่งถัดไปใน x1 แล้วกระโดด - Return:
jalr x0, 0(x1)— กระโดดไป 0 + ค่าใน x1 · ใช้ x0 เป็น rd (เขียนทับ x0 ไม่ได้ = ทิ้งค่า) · jalr ยังใช้ทำ computed jump (switch/case)
Leaf procedure (ไม่เรียกฟังก์ชันอื่น)
f = (g + h) − (i + j); g…j ใน x10…x13, f ใน x20, temp x5, x6 → ต้อง save x5, x6, x20 ลง stack
leaf_example: addi sp, sp, -24 // ขอที่ stack 3 doubleword sd x5, 16(sp) sd x6, 8(sp) sd x20, 0(sp) add x5, x10, x11 // g+h add x6, x12, x13 // i+j sub x20, x5, x6 // f addi x10, x20, 0 // copy f ไป return register ld x20, 0(sp) // restore ld x6, 8(sp) ld x5, 16(sp) addi sp, sp, 24 // pop jalr x0, 0(x1) // return
- Stack โตลง (ที่อยู่ต่ำลง) :
addi sp,sp,-Nขอที่ ·addi sp,sp,Nคืนที่
Register usage
- x5–x7, x28–x31 temporaries: callee ไม่ต้องรักษา
- x8–x9, x18–x27 saved: ถ้าใช้ callee ต้อง save/restore
Non-leaf procedure (เรียกฟังก์ชันอื่น / recursion)
caller ต้องเก็บลง stack: return address (x1) และ argument/temporary ที่ต้องใช้หลังการเรียก แล้ว restore หลังเรียกเสร็จ
if (n < 1) return 1; else return n * fact(n−1); (n และ result ใน x10)
fact: addi sp, sp, -16 sd x1, 8(sp) // save return address sd x10, 0(sp) // save n addi x5, x10, -1 // x5 = n-1 bge x5, x0, L1 // if n-1 >= 0 (n >= 1) go L1 addi x10, x0, 1 // else return 1 addi sp, sp, 16 // pop (ไม่ต้อง restore) jalr x0, 0(x1) L1: addi x10, x10, -1 // n = n-1 jal x1, fact // call fact(n-1) addi x6, x10, 0 // x6 = fact(n-1) ld x10, 0(sp) // restore n ld x1, 8(sp) // restore return address addi sp, sp, 16 mul x10, x10, x6 // n * fact(n-1) jalr x0, 0(x1)
Memory layout
| ส่วน | เก็บ |
|---|---|
| Text | program code |
| Static data | global variables (static ใน C, constant arrays/strings) · x3 (gp) ชี้เข้ามาให้ใช้ ±offset |
| Dynamic data (heap) | malloc ใน C, new ใน Java |
| Stack | automatic storage / local data / procedure frame (activation record) |
B7 Characters, 32-bit constants, Addressing
Byte/Halfword/Word operations
| Load (sign-extend) | Load unsigned (zero-extend) | Store (เก็บ 8/16/32 บิตขวา) |
|---|---|---|
lb, lh, lw rd, off(rs1) | lbu, lhu, lwu | sb, sh, sw rs2, off(rs1) |
strcpy: addi sp,sp,-8 ; sd x19,0(sp) ; add x19,x0,x0 // i=0
L1: add x5,x19,x10 ; lbu x6,0(x5) // x6 = y[i]
add x7,x19,x10 ; sb x6,0(x7) // x[i] = y[i]
beq x6,x0,L2 // ถ้าเป็น '\0' จบ
addi x19,x19,1 ; jal x0,L1
L2: ld x19,0(sp) ; addi sp,sp,8 ; jalr x0,0(x1)ค่าคงที่ 32 บิต
- ค่าคงที่ส่วนใหญ่เล็ก → 12-bit immediate พอ · ค่า 32 บิตใช้
lui rd, constant - lui = load upper immediate: คัดลอก 20 บิตไปที่ bit [31:12] ของ rd, extend bit 31 ไป [63:32], เคลียร์ [11:0] = 0
lui x19, 976 // 976 = 0x003D0 → x19 = 0x003D0000addi x19, x19, 128 // +0x080 → x19 = 0x003D0080Branch & Jump addressing
- Branch (SB format): opcode + 2 register + immediate · PC-relative: target = PC + immediate × 2 (target ส่วนมากอยู่ใกล้ ทั้งไปหน้า/ย้อนหลัง)
- Jump (jal, UJ format): immediate 20 บิต (rd + opcode + imm[20|10:1|11|19:12]) ได้ช่วงไกลกว่า
- กระโดดไกล (absolute 32 บิต):
luiใส่ address[31:12] ใน temp แล้วjalrบวก address[11:0] และกระโดด
4 Addressing modes ของ RISC-V
- Immediate addressing — operand คือค่าคงที่ในคำสั่ง
- Register addressing — operand อยู่ใน register
- Base (displacement) addressing — register + offset ได้ address memory (byte/halfword/word/doubleword)
- PC-relative addressing — PC + offset (ใช้ใน branch)
B8 หัวข้ออ่านเพิ่ม (Part II: self-study)
อาจารย์ระบุว่า "Students can explore by themselves" — ความสำคัญรองลงมา แต่สรุปไว้ครบ
Synchronization
- ปัญหา: สอง processor แชร์ memory — P1 เขียน P2 อ่าน ถ้าไม่ synchronize เกิด data race (ผลลัพธ์ขึ้นกับลำดับการเข้าถึง)
- ต้องมี hardware support เป็น atomic read/write (ไม่มีใครเข้าถึง location นั้นระหว่าง read กับ write) — instruction เดียว (เช่น atomic swap) หรือคู่ instruction
- RISC-V:
lr.d rd,(rs1)(load reserved — จอง address) +sc.d rd,(rs1),rs2(store conditional — สำเร็จถ้า location ไม่เปลี่ยนตั้งแต่ lr.d → rd = 0; ล้มเหลว → rd ≠ 0) - Atomic swap:
again: lr.d x10,(x20)→sc.d x11,(x20),x23→bne x11,x0,again→addi x23,x10,0 - Lock: ตั้ง x12 = 1 → วน lr.d อ่านล็อกจนเป็น 0 → sc.d พยายามเขียน 1 → ถ้าล้มเหลววนใหม่ · Unlock:
sd x0,0(x20)
Translation & Startup (ลำดับ: Compile → Assemble → Link → Load)
| ขั้น | ทำอะไร |
|---|---|
| Object module (จาก assembler/compiler) | ประกอบด้วย Header, Text segment, Static data segment, Relocation info, Symbol table, Debug info |
| Linking | ① รวม segments ② resolve labels (หา address) ③ patch location-dependent และ external references → ได้ executable image (ด้วย virtual memory ไม่ต้อง relocate) |
| Loading | ① อ่าน header หาขนาด segment ② สร้าง virtual address space ③ คัดลอก text/initialized data เข้า memory (หรือตั้ง page table) ④ ตั้ง arguments บน stack ⑤ initialize registers (sp, fp, gp) ⑥ กระโดดไป startup routine → ก็เรียก main; เมื่อ main จบทำ exit syscall |
| Dynamic linking | link/load procedure ของ library เฉพาะตอน ถูกเรียก — หลีกเลี่ยง image บวม, ได้ library เวอร์ชันใหม่อัตโนมัติ; ใช้ lazy linkage (indirection table + stub โหลด routine ID แล้วกระโดดไป linker/loader) |
| Java | คอมไพล์เป็น bytecode (instruction set พกพาของ JVM) → JVM interpret bytecode, และ JIT compile เฉพาะ method ที่ "hot" เป็น native code |
ตัวอย่าง C Sort (bubble)
- swap (leaf): v ใน x10, k ใน x11, temp ใน x5 →
slli x6,x11,3(k*8) ·add x6,x10,x6·ld x5,0(x6)·ld x7,8(x6)·sd x7,0(x6)·sd x5,8(x6)·jalr x0,0(x1) - sort (non-leaf เรียก swap): v ใน x10, n ใน x11, i ใน x19, j ใน x20 → ต้อง save x1, x19–x22 บน stack (
addi sp,sp,-40) และ restore ก่อน return - Outer loop:
li x19,0/for1tst: bge x19,x11,exit1/ … /addi x19,x19,1/j for1tst - Inner loop:
addi x20,x19,-1/for2tst: blt x20,x0,exit2/ คำนวณ address v[j], v[j+1] /ble x6,x7,exit2/ ย้าย parameter /jal x1,swap/addi x20,x20,-1
Effect of Compiler Optimization / Language / Algorithm (Lessons learnt)
- Instruction count และ CPI ไม่ใช่ตัวชี้วัด performance ที่ดีเมื่อดูโดด ๆ
- Compiler optimization ขึ้นกับ algorithm
- Java JIT เร็วกว่า JVM interpret มาก และใกล้เคียง C ที่ optimize ในบางกรณี
- "Nothing can fix a dumb algorithm!"
Arrays vs Pointers
- Array indexing = คูณ index ด้วยขนาด element + บวก base address · Pointer = address ตรง ๆ ตัดความซับซ้อนของการ index
- clear1 (array): ใน loop มี
slli+addทุกรอบ · clear2 (pointer):sd x0,0(x5);addi x5,x5,8;bltu x5,x7,loop2— เร็วกว่าเล็กน้อย - Compiler ทำได้เทียบเท่า (strength reduction: คูณ→shift; induction variable elimination) — เขียนให้อ่านง่ายและปลอดภัยดีกว่า
MIPS & ส่วนขยาย RISC-V
- MIPS = รุ่นก่อนเชิงพาณิชย์ของ RISC-V: 32-bit instructions, 32 GPR (reg 0 = 0 เสมอ), 32 FP registers, memory ผ่าน load/store เท่านั้น · เปรียบเทียบ branch: RISC-V ใช้
blt, bge, bltu, bgeu; MIPS ใช้slt, sltu(set less than → 0/1) แล้วbeq/bne - RV64I เพิ่ม:
auipc rd, immed(rd = (imm<<12) + pc, ตามด้วย jalr สำหรับ long jump) ·slt, sltu, slti, sltui·addw, subw, addiw(32-bit add/sub) · shift 32-bitsllw, srlw, slliw, srliw, sraiw· RV32I = register 32 บิต - Extensions: M multiply/divide/remainder · A atomic memory ops · F single-precision FP · D double-precision FP · C compressed (16-bit สำหรับ instruction ที่ใช้บ่อย)
Memory System Organization, Hierarchy, Cache Memory
4.1 Principle of Locality & Memory Hierarchy
โปรแกรมเข้าถึง ส่วนเล็ก ๆ ของ address space ในช่วงเวลาหนึ่ง
| Temporal locality | Spatial locality |
|---|---|
| ของที่เพิ่งใช้ มีแนวโน้มถูกใช้ซ้ำเร็ว ๆ เช่น instruction ใน loop, induction variable | ของที่ อยู่ใกล้ ของที่เพิ่งใช้ มีแนวโน้มถูกใช้ต่อ เช่น instruction ที่เรียงต่อกัน, ข้อมูล array |
Memory hierarchy
- เก็บทุกอย่างบน disk
- คัดลอกของที่ใช้ล่าสุด (และข้างเคียง) จาก disk → DRAM (main memory) ที่เล็กกว่า
- คัดลอกจาก DRAM → SRAM (cache ติดกับ CPU) ที่เล็กกว่าและเร็วกว่า
| คำศัพท์ | ความหมาย |
|---|---|
| Block (line) | หน่วยที่ถูกคัดลอก (อาจหลาย word) |
| Hit | ข้อมูลที่ต้องการอยู่ใน level บน · Hit ratio = hits / accesses |
| Miss | ข้อมูลไม่อยู่ ต้องคัดลอก block จาก level ล่าง · Miss penalty = เวลาที่เสีย · Miss ratio = misses/accesses = 1 − hit ratio |
4.2 Memory Technology
| เทคโนโลยี | เวลาเข้าถึง | ราคา / GB |
|---|---|---|
| SRAM | 0.5–2.5 ns | $2000–$5000 |
| DRAM | 50–70 ns | $20–$75 |
| Magnetic disk | 5–20 ms | $0.20–$2 |
Ideal memory = เวลาเข้าถึงเท่า SRAM + ความจุและราคาต่อ GB เท่า disk
DRAM
- เก็บข้อมูลเป็น ประจุใน capacitor เข้าถึงด้วย transistor ตัวเดียว · ต้อง refresh เป็นระยะ (อ่านแล้วเขียนกลับ ทีละ "row")
- จัดเป็นอาร์เรย์สี่เหลี่ยม; เข้าถึงทั้ง row; Burst mode ส่ง word ต่อเนื่องจาก row ด้วย latency ต่ำ
- DDR (Double Data Rate) ส่งข้อมูลทั้งขอบขาขึ้นและขาลงของ clock · QDR แยก input/output DDR
- ปัจจัย performance: Row buffer (อ่าน/refresh หลาย word ขนาน) · Synchronous DRAM (burst ไม่ต้องส่ง address ทุกครั้ง) · DRAM banking (เข้าถึงหลาย DRAM พร้อมกัน)
- ราคา/ความจุ: 1980 = 64 Kbit ($1,500,000/GB) → 2007 = 1 Gbit ($50/GB)
เพิ่ม Memory bandwidth (block 4 word; bus: 1 cycle address, 15 cycle DRAM access, 1 cycle/transfer)
| แบบ | Miss penalty | Bandwidth |
|---|---|---|
| 1-word-wide DRAM | 1 + 4×15 + 4×1 = 65 bus cycles | 16 B / 65 = 0.25 B/cycle |
| 4-word wide memory | 1 + 15 + 1 = 17 | 16/17 = 0.94 B/cycle |
| 4-bank interleaved | 1 + 15 + 4×1 = 20 | 16/20 = 0.8 B/cycle |
Flash Storage
- nonvolatile semiconductor; เร็วกว่า disk 100×–1000×; เล็ก กินไฟน้อย ทนทาน; แต่ $/GB แพงกว่า disk (อยู่ระหว่าง disk กับ DRAM)
- NOR flash: random read/write, ใช้เป็น instruction memory ใน embedded · NAND flash: หนาแน่นกว่า เข้าถึงทีละ block ถูกต่อ GB ใช้ใน USB, media storage
- เสื่อมหลังเขียนหลายพันครั้ง → ใช้แทน RAM/disk ตรง ๆ ไม่ได้ · Wear leveling = ย้ายข้อมูลไป block ที่ใช้น้อย
Disk
- nonvolatile, หมุนแม่เหล็ก · แต่ละ sector เก็บ: Sector ID, Data (512 byte; เสนอ 4096), ECC, sync fields และ gaps
- เวลาเข้าถึง: Queuing delay + Seek + Rotational latency + Data transfer + Controller overhead
= 4 ms (seek) + ½ / (15,000/60) = 2 ms (rotational) + 512 B/100 MB/s = 0.005 ms (transfer) + 0.2 ms = 6.2 ms
ถ้า seek จริงเฉลี่ย 1 ms → 3.2 ms
ผู้ผลิตบอก seek เฉลี่ยจากทุกการ seek; แต่ locality + OS scheduling ทำให้จริงสั้นกว่า · controller อัจฉริยะแสดง logical sector (SCSI, ATA, SATA) · disk มี cache และ prefetch
4.3 Cache & Direct Mapped
Cache = ระดับของ hierarchy ที่ ใกล้ CPU ที่สุด · คำถาม: ข้อมูลอยู่ในนั้นไหม? ไปหาที่ไหน?
Cache index = (Block address) modulo (#Blocks in cache) · #Blocks เป็นกำลังของ 2 → ใช้ บิตต่ำ ของ address
- Tag = บิตสูงของ address (เก็บแยกเพื่อรู้ว่า block ใดอยู่ที่ตำแหน่งนั้น)
- Valid bit: 1 = มีข้อมูล, 0 = ไม่มี (เริ่มต้น 0)
| Word addr | Binary | Index | ผล |
|---|---|---|---|
| 22 | 10 110 | 110 | Miss |
| 26 | 11 010 | 010 | Miss |
| 22 | 10 110 | 110 | Hit |
| 26 | 11 010 | 010 | Hit |
| 16 | 10 000 | 000 | Miss |
| 3 | 00 011 | 011 | Miss |
| 16 | 10 000 | 000 | Hit |
| 18 | 10 010 | 010 | Miss (แทนที่ 11 010 ซึ่ง tag ต่างกัน) |
Address subdivision (block ใหญ่ขึ้น)
Offset = log₂(bytes/block) · Index = log₂(#blocks) · Tag = ที่เหลือ
Block address = ⌊Byte address / Bytes per block⌋ · Block number = Block address mod #Blocks
Block address = ⌊1200/16⌋ = 75 → Block number = 75 mod 64 = 11
Offset 4 bit (bit 0–3), Index 6 bit (bit 4–9), Tag 22 bit (bit 10–31)
4.4 Block size, Misses & Write policy
Block Size
- block ใหญ่ → miss rate ลด (spatial locality) แต่ ใน cache ขนาดคงที่ block ใหญ่ = จำนวนน้อยลง → แย่งกัน miss rate เพิ่ม + pollution + miss penalty สูงขึ้น
- บรรเทาด้วย early restart และ critical-word-first
Cache miss
- hit → CPU ทำงานต่อปกติ
- miss → stall pipeline → ดึง block จาก level ถัดไป · I-cache miss: restart instruction fetch · D-cache miss: ทำ data access ให้เสร็จ
Write policy
| Write-through | Write-back |
|---|---|
| เมื่อ write hit อัปเดตทั้ง cache และ memory (คงความสอดคล้อง) แต่ write ช้า | เมื่อ write hit อัปเดตแค่ cache และติดตามด้วย dirty bit |
| ตัวอย่าง: base CPI = 1, 10% เป็น store, write ใช้ 100 cycle → CPI = 1 + 0.1×100 = 11 | เมื่อ block ที่ dirty ถูกแทนที่ → เขียนกลับ memory |
| แก้ด้วย write buffer (CPU ทำงานต่อ stall เมื่อ buffer เต็ม) | ใช้ write buffer เพื่ออ่าน block ใหม่ก่อนได้ |
Write allocation (เมื่อ write miss)
- สำหรับ write-through: Allocate on miss (ดึง block มา) หรือ Write around (ไม่ดึง — เพราะโปรแกรมมักเขียนทั้ง block ก่อนอ่าน เช่น initialization)
- สำหรับ write-back: โดยปกติ ดึง block มา
ตัวอย่าง Intrinsity FastMATH
MIPS embedded, pipeline 12 stage, split cache (I-cache + D-cache แยก) แต่ละอัน 16 KB = 256 blocks × 16 words · D-cache เลือก write-through/write-back ได้ · miss rate: I-cache 0.4%, D-cache 11.4%, weighted average 3.2%
4.5 Measuring Cache Performance
Memory stall cycles = Memory accesses/Program × Miss rate × Miss penalty
= Instructions/Program × Misses/Instruction × Miss penalty
AMAT = Hit time + Miss rate × Miss penalty
I-cache: 0.02 × 100 = 2 · D-cache: 0.36 × 0.04 × 100 = 1.44
Actual CPI = 2 + 2 + 1.44 = 5.44 → ideal cache เร็วกว่า 5.44/2 = 2.72 เท่า
สรุป: เมื่อ CPU เร็วขึ้น (base CPI ลด หรือ clock เร็วขึ้น) miss penalty ยิ่งมีน้ำหนัก สัดส่วนเวลาใน memory stall มากขึ้น → ประเมินระบบโดยไม่ดู cache ไม่ได้
4.6 Associative Caches
| แบบ | Block ลงได้ที่ไหน | การค้นหา / Comparator |
|---|---|---|
| Direct mapped (1-way) | ที่เดียว (index) | 1 comparator |
| n-way set associative | n ตำแหน่งใน set — set = (Block number) mod (#Sets) | ค้นทั้ง set พร้อมกัน, n comparators |
| Fully associative | ที่ไหนก็ได้ | ค้นทุก entry พร้อมกัน, comparator ต่อ entry (แพง) |
Associativity เพิ่ม → miss rate ลด แต่ผลตอบแทนลดลงเรื่อย ๆ (diminishing returns) และเพิ่มความซับซ้อน ต้นทุน เวลาเข้าถึง
| แบบ | ผลแต่ละ access | รวม |
|---|---|---|
| Direct mapped | miss, miss, miss, miss, miss (0, 8, 6 ... 0 และ 8 ชนกันที่ index 0) | 5 miss |
| 2-way set assoc. | miss, miss, hit, miss, miss | 4 miss, 1 hit |
| Fully associative | miss, miss, hit, miss, hit | 3 miss, 2 hit |
ข้อมูลจำลอง (64 KB D-cache, 16-word blocks, SPEC2000): miss rate 1-way 10.3% · 2-way 8.6% · 4-way 8.3% · 8-way 8.1%
Replacement policy
- Direct mapped: ไม่มีทางเลือก
- Set associative: เลือก entry ที่ไม่ valid ก่อน ถ้าไม่มีเลือกจาก set: LRU (ไม่ได้ใช้นานสุด — ง่ายสำหรับ 2-way, ไหวสำหรับ 4-way, เกินนั้นยากมาก) หรือ Random (ประสิทธิภาพใกล้ LRU เมื่อ associativity สูง)
4.7 Multilevel Caches
- Primary (L1) ติด CPU เล็กแต่เร็ว → เน้น minimal hit time
- L2 รับ miss ของ L1 ใหญ่กว่า ช้ากว่า แต่เร็วกว่า main memory → เน้น low miss rate (hit time ผลน้อยกว่า)
- Main memory รับ miss ของ L2 · ระบบบางตัวมี L3
- ผลลัพธ์: L1 มักเล็กกว่า cache เดี่ยว และ L1 block size เล็กกว่า L2 block size
L1 อย่างเดียว: penalty = 100/0.25 = 400 cycle → CPI = 1 + 0.02×400 = 9
เพิ่ม L2 (access 5 ns, global miss rate ไป memory 0.5%): L1 miss + L2 hit penalty = 5/0.25 = 20 cycle · L1+L2 miss เพิ่ม 400 cycle (สไลด์ใช้ "extra 500")
CPI = 1 + 0.02×20 + 0.005×400 = 3.4 → เร็วขึ้น 9/3.4 ≈ 2.6 เท่า
CPU ขั้นสูง & Software
- Out-of-order CPU ทำคำสั่งอื่นต่อระหว่าง cache miss (store ค้างใน load/store unit, dependent instruction รอใน reservation station) → วิเคราะห์ยาก ต้องใช้ simulation
- miss ขึ้นกับรูปแบบการเข้าถึง memory (algorithm, compiler)
- Software optimization via blocking (DGEMM): แบ่งเมทริกซ์เป็น block (เช่น BLOCKSIZE 32) เพื่อ ใช้ข้อมูลให้มากที่สุดก่อนถูกแทนที่ — loop 3 ชั้นนอก (sj, si, sk) เรียก
do_blockที่ทำคูณเฉพาะ block ย่อย
4.8 Dependable Memory Hierarchy
- Fault = component ล้มเหลว (อาจหรือไม่นำไปสู่ system failure)
- สถานะ: Service accomplishment (บริการตามระบุ) ⇄ Service interruption (เบี่ยงเบน) — Failure → Restoration
MTBF = MTTF + MTTR · Availability = MTTF / (MTTF + MTTR)
เพิ่ม availability: เพิ่ม MTTF (fault avoidance, fault tolerance, fault forecasting) หรือลด MTTR (เครื่องมือ/กระบวนการวินิจฉัยซ่อมที่ดีขึ้น)
Hamming SEC code
- Hamming distance = จำนวนบิตที่ต่างกันระหว่างสอง bit pattern
- distance ต่ำสุด 2 → ตรวจจับ error 1 บิต (เช่น parity code) · distance 3 → แก้ error 1 บิต (SEC) และตรวจจับ 2 บิต
- Encoding: นับบิตจาก 1 ทางซ้าย · ตำแหน่งที่เป็นกำลังของ 2 = parity bit (1, 2, 4, 8, …) · แต่ละ parity bit ตรวจ data bit บางตำแหน่ง
- Decoding: ค่า parity bits บอกว่าบิตไหนผิด —
0000= ไม่มี error ·1010= บิต 10 พลิก
SEC/DEC (Single Error Correct / Double Error Detect)
เพิ่ม parity bit pn ให้ทั้ง word → Hamming distance = 4 · ให H = SEC parity bits
| H | pn | ความหมาย |
|---|---|---|
| even | even | ไม่มี error |
| odd | odd | single-bit error → แก้ได้ |
| even | odd | error ที่บิต pn เอง |
| odd | even | double error เกิดขึ้น (ตรวจพบแต่แก้ไม่ได้) |
ECC DRAM ใช้ SEC/DEC โดย 8 bit ปกป้องทุก 64 bit
4.9 Virtual Machines
- Host จำลอง guest OS และทรัพยากรเครื่อง · แยก (isolation) ดีขึ้น หลีกเลี่ยงปัญหา security/reliability · ช่วยแชร์ทรัพยากร · มี performance impact บ้าง · ตัวอย่าง: IBM VM/370 (ยุค 1970), VMware, Microsoft Virtual PC
- VMM (Virtual Machine Monitor): map virtual resource → physical (memory, I/O, CPU); guest code รันบนเครื่องจริงใน user mode, trap ไป VMM เมื่อใช้ privileged instruction หรือเข้าถึงทรัพยากรที่ป้องกัน; guest OS ต่างจาก host ได้; VMM จัดการ I/O จริงและจำลอง virtual I/O
- ตัวอย่าง Timer: เครื่องจริง OS ระงับ process → handle → เลือก process ถัดไป · มี VMM: VMM ระงับ VM → handle → เลือก VM ถัดไป; ถ้า VM ต้องการ timer → VMM จำลอง virtual timer และสร้าง interrupt ให้ VM เมื่อ timer จริงเกิด
- Instruction set support: มี user mode / system mode; privileged instruction ใช้ได้ใน system mode เท่านั้น (ใน user mode → trap) · ทรัพยากรกายภาพทั้งหมด (page table, interrupt control, I/O register) เข้าถึงผ่าน privileged instruction
4.10 Virtual Memory, Page Table, TLB
VM "block" = page · VM translation "miss" = page fault
- Address translation แบ่งเป็น page ขนาดคงที่ (เช่น 4 KB)
- Page fault penalty: ต้องดึง page จาก disk — ใช้เวลา หลายล้าน clock cycle · OS จัดการ · ลด page fault rate ด้วย fully associative placement และ replacement algorithm ฉลาด
Page table
- เก็บข้อมูล placement · เป็น array ของ PTE (page table entry) ที่ index ด้วย virtual page number · page table register ใน CPU ชี้ page table ใน physical memory
- page อยู่ใน memory → PTE เก็บ physical page number + status bits (reference, dirty, …) · ไม่อยู่ → PTE ชี้ตำแหน่งใน swap space บน disk
Replacement & writes
- ใช้ LRU เพื่อลด page fault: reference bit (use bit) ใน PTE ตั้งเป็น 1 เมื่อเข้าถึง page; OS เคลียร์เป็น 0 เป็นระยะ — reference bit = 0 แปลว่าไม่ได้ใช้เร็ว ๆ นี้
- เขียน disk ช้าหลายล้าน cycle → เขียนทั้ง block ครั้งเดียว; write-through ไม่เหมาะ → ใช้ write-back พร้อม dirty bit ใน PTE
TLB (Translation Look-aside Buffer)
- ปัญหา: translation ต้องอ้าง memory เพิ่ม (1 ครั้งเพื่ออ่าน PTE + 1 ครั้งสำหรับ access จริง) แต่ page table มี locality ดี → ใช้ cache ของ PTE ใน CPU = TLB
- ทั่วไป: 16–512 PTEs, hit 0.5–1 cycle, miss 10–100 cycle, miss rate 0.01%–1% · miss จัดการได้ทั้ง hardware หรือ software
| กรณี | การจัดการ |
|---|---|
| TLB miss แต่ page อยู่ใน memory | โหลด PTE จาก memory แล้ว retry (hardware หรือ software exception handler) · ต้องรู้ว่า TLB miss ก่อน destination register ถูกเขียนทับ → raise exception → handler copy PTE เข้า TLB → restart instruction |
| Page fault (page ไม่อยู่ใน memory) | OS: ① ใช้ faulting virtual address หา PTE ② หา page บน disk ③ เลือก page จะถูกแทนที่ (ถ้า dirty เขียนลง disk ก่อน) ④ อ่าน page เข้า memory + อัปเดต page table ⑤ ทำ process ให้ runnable ⑥ restart จาก instruction ที่ fault |
TLB & Cache interaction / Protection
- cache tag ใช้ physical address → ต้องแปลก่อน lookup; ทางเลือก virtual address tag มีปัญหา aliasing (virtual address ต่างกันชี้ physical เดียวกัน)
- Memory protection: task แชร์ virtual space บางส่วนได้ แต่ต้องกันการเข้าถึงผิดพลาด — ต้องมี OS ช่วย และ hardware: supervisor (kernel) mode, privileged instructions, page table เข้าถึงได้เฉพาะ supervisor mode, system call exception (เช่น
ecallใน RISC-V)
4.11 Common Framework & Sources of Misses
หลักการเดียวกันที่ ทุกระดับ ของ hierarchy (ใช้แนวคิด caching): ① Block placement ② Finding a block ③ Replacement on a miss ④ Write policy
| Associativity | วิธีหา (Location method) | Tag comparisons |
|---|---|---|
| Direct mapped | Index | 1 |
| n-way set associative | Set index แล้วค้นใน set | n |
| Fully associative | ค้นทุก entry | #entries |
| (Virtual memory) Full table | Full lookup table | 0 |
- Placement: ตาม associativity — สูงขึ้น miss rate ลด แต่ซับซ้อน/ต้นทุน/เวลาเพิ่ม · VM ใช้ full table lookup ทำ fully associative ได้
- Replacement: LRU (hardware ซับซ้อนเมื่อ associativity สูง) หรือ Random · VM ใช้ LRU approximation
- Write policy: write-through (ง่ายต่อ replacement อาจต้อง write buffer) / write-back (เก็บ state เพิ่ม) · VM ใช้ได้เฉพาะ write-back
3Cs — แหล่งที่มาของ Miss
| ชนิด | เกิดเมื่อ |
|---|---|
| Compulsory (cold start) | เข้าถึง block ครั้งแรก |
| Capacity | cache มีขนาดจำกัด block ที่ถูกแทนที่ถูกเรียกอีก |
| Conflict (collision) | cache ที่ไม่ fully associative — แย่ง entry ใน set เดียวกัน (ไม่เกิดใน fully associative ขนาดเท่ากัน) |
Cache design trade-offs
| เปลี่ยน | ผลต่อ miss | ผลเสีย |
|---|---|---|
| เพิ่ม cache size | ลด capacity miss | อาจเพิ่ม access time |
| เพิ่ม associativity | ลด conflict miss | อาจเพิ่ม access time |
| เพิ่ม block size | ลด compulsory miss | เพิ่ม miss penalty; block ใหญ่มากอาจเพิ่ม miss rate จาก pollution |
4.12 Cache Control FSM & Cache Coherence
Simple cache + FSM
- ตัวอย่าง: direct-mapped, write-back, write allocate · block 4 words (16 B) · cache 16 KB (1024 blocks) · address 32 บิต · valid bit และ dirty bit ต่อ block · blocking cache (CPU รอจนจบ)
- แบ่ง address: Offset 4 bit (0–3) + Index 10 bit (4–13) + Tag 18 bit (14–31)
- สัญญาณ CPU ↔ Cache: Read/Write, Valid, Address (32), Write Data (32), Read Data (32), Ready · Cache ↔ Memory: Address 32, data 128 บิต (หลายรอบต่อ access)
- FSM: ชุด state เปลี่ยนที่ clock edge; Next state = fn(current state, inputs); Control outputs = fo(current state) · state เก็บใน register
Cache Coherence
ปัญหา: 2 core แชร์ physical address space แต่ cache แยก (เช่น write-through) → CPU A เขียน X=1 แต่ cache ของ CPU B ยังเป็น 0
เป็นทางการ: ① P เขียน X แล้วอ่าน X (ไม่มีใครเขียนคั่น) → ได้ค่าที่เขียน ② P1 เขียน X, P2 อ่าน X (ห่างพอ) → ได้ค่าที่เขียน ③ P1, P2 เขียน X → ทุก processor เห็นลำดับการเขียนเหมือนกัน (ค่าสุดท้ายเดียวกัน)
- Protocol: migration (ย้ายข้อมูลมา cache ท้องถิ่น ลดภาระ shared memory) + replication (สำเนา read-shared ลดการแย่ง)
- Snooping — ทุก cache คอยดู bus read/write · Directory-based — cache และ memory บันทึกสถานะแชร์ของ block ใน directory
- Invalidating snooping: cache ขอสิทธิ์ exclusive ก่อนเขียน → broadcast invalidate บน bus → read ถัดไปใน cache อื่น miss → cache เจ้าของส่งค่าใหม่ให้
- Memory consistency: write ถือว่าสำเร็จเมื่อทุก processor เห็น; processor ไม่จัดลำดับ write ใหม่ → ถ้า P เขียน X แล้ว Y ใครเห็น Y ใหม่ต้องเห็น X ใหม่ด้วย · อ่านจัดลำดับใหม่ได้ แต่เขียนไม่ได้
ตัวอย่างจริง: ARM Cortex-A53 & Intel Core i7
- cache หลายระดับบนชิป, 2-level TLB, multi-banked cache (เข้าถึงหลายครั้ง/cycle ถ้าไม่ชน bank)
- optimization: return requested word first, non-blocking cache (hit under miss, miss under miss), data prefetching
RISC-V system instructions: memory ordering (fence.i, fence, sfence.vm) · CSR access (csrrw/rs/rc และแบบ immediate) · system (ecall, ebreak, sret, wfi)
4.13 Pitfalls & Concluding Remarks
- Byte vs word addressing: cache 32 byte direct-mapped, block 4 byte → byte 36 ไป block 1 แต่ word 36 ไป block 4
- เขียนโค้ดโดยไม่สนใจ memory system (เช่น วน row vs column ของ array — stride ใหญ่ = locality แย่)
- multiprocessor ที่แชร์ L2/L3: associativity น้อยกว่าจำนวน core → conflict miss; core มากขึ้นต้องเพิ่ม associativity
- ใช้ AMAT ประเมิน out-of-order CPU ไม่ได้ (ไม่รวม non-blocked accesses) → ใช้ simulation
- ขยาย address ด้วย segment (Intel 80286) — segment ไม่พอ ทำให้คำนวณ address ซับซ้อน
- ทำ VMM บน ISA ที่ไม่ได้ออกแบบสำหรับ virtualization (non-privileged instruction เข้าถึง hardware) → ต้องขยาย ISA หรือห้าม guest OS ใช้คำสั่งเหล่านั้น
I/O Systems
5.1 External Devices & I/O Module
External device แลกเปลี่ยนข้อมูลระหว่างโลกภายนอกกับคอมพิวเตอร์ เชื่อมผ่าน link ไปที่ I/O module · มี transducer (ตัวแปลงสัญญาณ) ในอุปกรณ์
| ประเภท | ตัวอย่าง / ความหมาย |
|---|---|
| Human readable | จอภาพ, เครื่องพิมพ์, keyboard |
| Machine readable | สื่อสารกับอุปกรณ์/เครื่องจักร (disk, sensor) |
| Communication | สื่อสารกับอุปกรณ์ระยะไกล เช่น terminal หรือคอมพิวเตอร์เครื่องอื่น |
5 หน้าที่หลักของ I/O module
- Control and timing — ประสานการไหลของข้อมูลระหว่างทรัพยากรภายในกับอุปกรณ์ภายนอก
- Processor communication — command decoding, data, status reporting, address recognition
- Device communication — คำสั่ง สถานะ ข้อมูลกับอุปกรณ์
- Data buffering — บัฟเฟอร์เพื่อ ปรับสมดุลความเร็ว ระหว่างอุปกรณ์กับ memory
- Error detection — ตรวจและรายงานความผิดพลาดการส่ง
5.2 สามเทคนิคของ I/O
| เทคนิค | หลักการ | ข้อเสีย/ข้อดี |
|---|---|---|
| 1. Programmed I/O | CPU รัน program ควบคุม I/O โดยตรง; หลังสั่ง command ต้องรอ (polling) จน I/O เสร็จ | ถ้า CPU เร็วกว่า I/O → เปลืองเวลา CPU |
| 2. Interrupt-driven I/O | CPU สั่ง I/O แล้ว ทำคำสั่งอื่นต่อ; I/O module interrupt เมื่อเสร็จ | CPU ไม่ต้องรอ แต่ยังต้องผ่าน CPU ในการถ่ายข้อมูล |
| 3. DMA (Direct Memory Access) | I/O module กับ main memory แลกเปลี่ยนข้อมูลกันโดยตรง ไม่ผ่าน processor | เหมาะกับข้อมูลปริมาณมาก |
| ไม่มี Interrupts | ใช้ Interrupts | |
|---|---|---|
| I/O → memory ผ่าน processor | Programmed I/O | Interrupt-driven I/O |
| I/O → memory ตรง | DMA | |
I/O Commands (4 ชนิดที่ module รับจาก processor)
- Control — activate peripheral และบอกให้ทำอะไร
- Test — ตรวจสถานะของ module และอุปกรณ์
- Read — ให้ module รับข้อมูลหนึ่งรายการจาก peripheral ไปไว้ใน internal buffer
- Write — ให้ module รับข้อมูลจาก data bus แล้วส่งให้ peripheral
5.3 I/O Addressing: Memory-mapped vs Isolated
แต่ละอุปกรณ์ที่ต่อผ่าน I/O module มี unique identifier / address; command ที่ CPU ออกมี address ของอุปกรณ์ที่ต้องการ → I/O module ต้อง แปลความ address lines ว่าเป็นของตัวเองไหม
| Memory-mapped I/O | Isolated I/O |
|---|---|
| อุปกรณ์และ memory ใช้ address space ร่วมกัน | address space แยกกัน |
| I/O เหมือน memory read/write ธรรมดา | ต้องมีเส้น I/O หรือ memory select |
| ไม่ต้องมี command พิเศษสำหรับ I/O | มี command พิเศษ สำหรับ I/O (จำกัดชุดคำสั่ง) |
| ใช้คำสั่งเข้าถึง memory ได้หลากหลาย; bus ใช้ read line เดียว write line เดียว | ชุดคำสั่ง I/O มีจำกัด |
5.4 Interrupt-Driven I/O
Simple interrupt processing
- I/O module ส่งสัญญาณ interrupt
- CPU ทำคำสั่งปัจจุบันจนเสร็จ
- CPU เก็บ PC และ PSW (Status register) ลง stack ก่อน
- เริ่มทำงานที่ ISR (Interrupt Service Routine)
- เสร็จแล้ว restore PC/PSW กลับไปทำโปรแกรมเดิม
Design issues 2 ข้อ
- มี I/O module หลายตัว — CPU รู้ได้อย่างไรว่าอุปกรณ์ไหนเป็นผู้ interrupt?
- ถ้ามีหลาย interrupt พร้อมกัน — CPU เลือกทำตัวไหนก่อน?
Device identification — 4 เทคนิค
| # | เทคนิค | รายละเอียด |
|---|---|---|
| 1 | Multiple interrupt lines | ตรงไปตรงมาที่สุด แต่มักมีหลาย module ต่อ 1 เส้นอยู่ดี |
| 2 | Software poll | เมื่อ interrupt CPU กระโดดไป ISR ที่ ไล่ถามทีละ module ว่าใครเป็นผู้ขอ — เสียเวลา |
| 3 | Daisy chain (hardware poll, vectored) | interrupt acknowledge line ต่อผ่านทุก module เป็นสายโซ่ · Vector = address ของ I/O module หรือ id เฉพาะ · Vectored interrupt: CPU ใช้ vector เป็น pointer ไปยัง device-service routine โดยตรง ไม่ต้องผ่าน general ISR ก่อน |
| 4 | Bus arbitration (vectored) | I/O module ต้อง ได้ควบคุม bus ก่อน จึงยก interrupt request line · CPU ตรวจพบแล้วตอบทาง interrupt acknowledge line · module ที่ร้องขอส่ง vector ลง data lines |
Intel 82C59A Interrupt Controller — ตัวจัดการ interrupt หลายแหล่งและ priority · Intel 8255A Programmable Peripheral Interface — ชิป I/O ที่ตั้งค่าด้วย control word (ต่อ keyboard/display ผ่าน 82C55A)
5.5 DMA (Direct Memory Access)
- ใช้ DMA controller ถ่ายข้อมูลระหว่าง I/O กับ memory โดยตรง · CPU เพียง เริ่มต้นและรับ interrupt ตอนจบ
- DMA ขอใช้ system bus; จุดที่ processor หยุดตรวจคำขอ: DMA แทรกได้เร็วและถี่กว่า (เกี่ยวกับ hardware bus ตรง ๆ แทรกได้ในหลาย จุดของ instruction cycle) · Interrupt ต้องรอจน instruction ปัจจุบันเสร็จ
- ตัวอย่างชิป: Intel 8237A มี register: Command, Status (channel 0–3 reached TC = terminal count), Mode (verify/write/read transfer, auto-init, address increment/decrement, demand/single/block/cascade), Single Mask, All Mask
- Alternative DMA configurations: DMA module แยกบน bus / เชื่อมหลาย I/O ผ่าน DMA เดียว / I/O bus แยก — ลดจำนวนการใช้ system bus
5.6 Direct Cache Access (DCA)
- ปัญหา: DMA ไม่ scale พอเมื่อ data rate เพิ่มมาก — Ethernet 10/100 Gbps ที่ database server, Wi-Fi ระดับ Gbps (3.2 และ 6.76 Gbps)
- Network traffic เป็น packet (protocol data unit): link level ปกติ Ethernet โดยมี IP และ TCP ซ้อนอยู่ใน payload · ขาออก packet ถูกสร้างที่ NIC/I/O controller · ขาเข้า controller ลอก Ethernet header ส่ง TCP/IP packet ให้ host CPU
- ทั้งขาเข้า-ขาออก core, main memory และ cache ล้วนเกี่ยวข้อง: แอปวางข้อมูลใน application buffer → core ย้ายไป system buffer สร้าง TCP/IP header → DMA ดึงไปส่งที่ NIC
| ขาเข้า (Incoming) | ขาออก (Outgoing) |
|---|---|
| Packet arrives → DMA → NIC interrupts host → ดึง descriptors/headers → cache miss → process header → transfer payload | Packet transfer requested → packet created → output operation invoked → DMA transfer → NIC signals completion → driver frees buffer |
DCA strategies
- ได้ผลมากกว่าถ้าตัด system buffer ใน main memory ทิ้ง — core เข้าถึง packet/descriptor ใน system buffer แค่ครั้งเดียว (อ่านแล้วย้าย payload ไป application buffer)
- วิธีง่ายสุด (prototype บน Xeon ปี 2006–2010): DCA ใช้ได้เฉพาะ incoming network traffic · DCA function อยู่ใน memory controller ส่ง prefetch hint ให้ core ทันทีที่ข้อมูลอยู่ใน system memory → core prefetch data packet จาก system buffer
- Cache injection = วางข้อมูลลง cache โดยตรง — ใน Intel Xeon เรียก Direct Data I/O (DDIO)
5.7 Evolution of the I/O Function (6 ขั้น)
- CPU ควบคุมอุปกรณ์ต่อพ่วงโดยตรง
- เพิ่ม controller/I/O module — CPU ใช้ programmed I/O ไม่มี interrupt
- เหมือนข้อ 2 แต่ใช้ interrupt — CPU ไม่ต้องรอ I/O เสร็จ ประสิทธิภาพเพิ่ม
- I/O module มี DMA เข้าถึง memory ตรง — ย้ายข้อมูลทั้ง block โดย CPU เกี่ยวข้องเฉพาะตอนเริ่มและจบ
- I/O module พัฒนาเป็น processor ในตัวเอง มี instruction set เฉพาะ I/O (I/O channel)
- I/O module มี local memory เป็นคอมพิวเตอร์ในตัวเอง (I/O processor) — ควบคุมอุปกรณ์จำนวนมากด้วย CPU ยุ่งน้อยที่สุด
ตัวอย่าง: IBM zEC12 I/O Channel Subsystem (I/O frames และโครงสร้างระบบ I/O ของ mainframe)
5.8 I/O Interfaces ที่ควรรู้ (9 เรื่อง)
| Interface | จุดสำคัญ |
|---|---|
| 1. USB (Universal Serial Bus) | ใช้กว้าง default ของอุปกรณ์ความเร็วต่ำ/สูง · USB 1.0: Low 1.5 Mbps, Full 12 Mbps · USB 2.0: 480 Mbps · USB 3.0 (=3.1 Gen1 = 3.2 Gen1): SuperSpeed 5 Gbps (ใช้ได้จริง ~4 Gbps) · USB 3.1 Gen2: SuperSpeed+ 10 Gbps (ใช้ได้ ~9.7 Gbps) · USB 3.2 Gen2x2: 20 Gbps · ควบคุมโดย root host controller โครงสร้าง hierarchical tree |
| 2. FireWire (IEEE 1394, 1999–2000) | ทางเลือกแทน SCSI สำหรับเครื่องขนาดเล็ก · daisy chain ต่อได้ถึง 63 อุปกรณ์/พอร์ต · เชื่อม bridge ได้ 1022 buses · hot plugging · auto-configuration ไม่ต้องมี termination |
| 3. SCSI (Small Computer System Interface) | ยุคเก่า สูญความนิยมให้ USB/FireWire แต่รุ่นเร็วยังใช้กับ storage ใน enterprise · shared bus รองรับ 16 หรือ 32 อุปกรณ์ · ส่งขนาน (16→32 bit) · 5 Mbps (SCSI-1) ถึง 160 Mbps (SCSI-3 U3) |
| 4. Thunderbolt | Intel ร่วมกับ Apple · 10 Gbps ต่อทิศทาง และจ่ายไฟได้ถึง 10 W · รวม data, video, audio, power ในสายเดียว (HDD, RAID, video-capture box, network interface) |
| 5. InfiniBand | I/O spec ตลาด high-end server (ปล่อย v.แรกต้นปี 2001) · IBM zEnterprise พึ่งพามาก · นิยมใน SAN · switch-based fabric ต่อได้ถึง 64,000 อุปกรณ์ |
| 6. PCI / PCI Express | high-speed bus ต่ออุปกรณ์ต่อพ่วงหลากชนิดหลายความเร็ว |
| 7. SATA (Serial ATA) | interface ของ disk storage · สูงสุด 6 Gbps (ต่ออุปกรณ์สูงสุด 300 Mbps ตามสไลด์) · ใช้ใน desktop, industrial และ embedded |
| 8. Ethernet | เครือข่ายแบบมีสายหลัก · สูงสุด 100 Gbps ระยะตั้งแต่ไม่กี่เมตรถึงหลายสิบ km · เริ่มจาก bus-based 3 Mbps → switch-based (ทุกอุปกรณ์ต่อเข้า central switch) · เพิ่มความเร็วทีละ 10 เท่าเป็นช่วง ๆ |
| 9. Wi-Fi | wireless Internet หลัก · IEEE 802.11 · รุ่นล่าสุดในสไลด์ 802.11ac (2014) สูงสุด 3.2 Gbps |
Storage Systems (External Memory)
6.1 Magnetic Disk
- จานกลม (platter) ทำจากวัสดุ ไม่เป็นแม่เหล็ก เรียก substrate เคลือบด้วยวัสดุที่ทำให้เป็นแม่เหล็กได้ · เดิมใช้ อะลูมิเนียม/โลหะผสม ปัจจุบันมี แก้ว
- ข้อดีของ glass substrate: ผิวฟิล์มแม่เหล็กสม่ำเสมอขึ้น (reliability สูง) · ข้อบกพร่องผิวลดมาก (read-write error ต่ำ) · รองรับ fly height ต่ำกว่า · แข็งกว่า (disk dynamics ดีขึ้น) · ทนแรงกระแทก/เสียหายได้ดี
Read / Write
- ทิศทางของอนุภาคแม่เหล็ก บนผิวจานแทนค่า "0" และ "1" (N/S)
- Head แบบ Inductive write / Magnetoresistive (MR) read: เขียนด้วย inductive write element (write current สร้างสนามแม่เหล็ก) · อ่านด้วย MR sensor (ต้านทานเปลี่ยนตามทิศสนาม)
6.2 Disk Data Layout & Classification
โครงสร้างข้อมูล
| ศัพท์ | ความหมาย |
|---|---|
| Platter | จานแม่เหล็ก (หลายจานซ้อนบน spindle) |
| Track | วงแหวนศูนย์กลางเดียวกันบนผิวจาน |
| Sector | ส่วนแบ่งของ track (หน่วยอ่าน/เขียน); มี inter-sector gap และ inter-track gap คั่น |
| Cylinder | track ที่ตำแหน่งเดียวกันของทุก surface/platter (head ทุกตัวอยู่ตำแหน่งเดียวกัน) |
| Read-write head | 1 หัวต่อ 1 surface · ติดบน boom/arm ที่เลื่อนเข้า-ออก |
วิธีจัดเรียง layout
| (a) Constant Angular Velocity (CAV) | (b) Multiple Zone Recording |
|---|---|
| sector เท่ากันทุก track; ความหนาแน่นบิต track ใน (ด้านใน) สูงกว่า track นอก → เปลืองความจุ | แบ่งเป็น zone; zone ด้านนอกมี sector มากกว่า → ใช้ความจุเต็มที่ขึ้น |
รูปแบบ sector (Winchester, Seagate ST506)
แต่ละ physical sector = 600 bytes ประกอบด้วย Gap1 · ID field (synch byte, track #, head #, sector #, CRC) · Gap2 · Data field (synch byte, 512 byte data, CRC) · Gap3 — มี 30 sector/track (physical sector 0–29) และ index
Physical characteristics (Table 6.1)
| ลักษณะ | ประเภท |
|---|---|
| Head motion | Fixed head (1 หัวต่อ track, ติดแขนแข็งที่ครอบทุก track) · Movable head (1 หัวต่อ surface บนแขนที่ยืด/หดได้) |
| Disk portability | Non-removable (ติดตายในไดรฟ์ เช่น HDD ใน PC) · Removable (ถอดเปลี่ยนได้ — ข้อมูลไม่จำกัดด้วย disk system จำนวนจำกัด, ย้ายเครื่องได้ เช่น floppy, ZIP) |
| Sides | Single sided · Double sided (เคลือบทั้งสองด้าน) |
| Platters | Single platter · Multiple platter |
| Head mechanism | Contact (floppy) · Fixed gap · Aerodynamic gap (Winchester) |
ตัวอย่างพารามิเตอร์ HDD (Table 6.2)
| Seagate Enterprise | Barracuda XT | Cheetah NS | Laptop HDD | |
|---|---|---|---|---|
| งาน | Enterprise | Desktop | NAS, app servers | Laptop |
| ความจุ | 6 TB | 3 TB | 600 GB | 2 TB |
| Avg seek | 4.16 ms | N/A | 3.9 (r) / 4.2 (w) ms | 13 ms |
| Spindle | 7200 rpm | 7200 rpm | 10,075 rpm | 5400 rpm |
| Avg latency | 4.16 ms | 4.16 ms | 2.98 ms | 5.6 ms |
| Max transfer | 216 MB/s | 149 MB/s | 97 MB/s | 300 MB/s |
| Bytes/sector | 512/4096 | 512 | 512 | 4096 |
| Surfaces/cylinder | 8 | 10 | 8 | 4 |
| Cache | 128 MB | 64 MB | 16 MB | 8 MB |
6.3 Disk Performance Parameters
ดิสก์หมุนด้วยความเร็วคงที่; ก่อนอ่าน/เขียน head ต้องไปที่ track ที่ต้องการ แล้วรอให้ sector หมุนมาตรงหัว
Rotational delay / latency = เวลาที่ต้นของ sector หมุนมาถึง head · เฉลี่ย = ครึ่งรอบ = ½ ÷ (rpm/60)
Access time = Seek time + Rotational delay (เวลาเข้าตำแหน่ง)
Transfer time = เวลาอ่าน/เขียนเมื่อ sector ผ่านใต้ head (= ขนาดข้อมูล ÷ transfer rate)
รวมต่อครั้ง = Seek + Rotational latency + Transfer (+ controller overhead, queuing)
10,075 rpm → 2.98 ms · 5400 rpm → 5.56 ms ≈ 5.6 ms
Timing ของ disk I/O transfer: Wait for device → Wait for channel → Seek → Rotational delay → Data transfer (ช่วงนี้ device busy)
6.4 RAID (Redundant Array of Independent Disks)
เทคนิคนำ HDD หลายตัวมารวมทำงานเป็นกลุ่มเดียว มี 7 ระดับ (0–6) — ระดับ ไม่ได้ซ้อนเป็นลำดับชั้น แต่เป็นสถาปัตยกรรมต่างกัน ที่มี 3 คุณสมบัติร่วม:
- ชุด physical disk หลายตัว OS มองเป็น logical drive เดียว
- ข้อมูลถูกกระจายข้าม disk ใน array ด้วย striping
- ใช้ความจุส่วนเกินเก็บ parity เพื่อ กู้ข้อมูล เมื่อ disk เสีย
เกี่ยวกับ RAID 0 ไม่มีการเก็บ redundancy (จริง ๆ ไม่ครบเงื่อนไขข้อ 3)
ตารางสรุป RAID levels (N = จำนวน data disks)
| Level | ชื่อ / Category | Disks ที่ต้องใช้ | Data availability | Large I/O transfer | Small I/O request rate |
|---|---|---|---|---|---|
| 0 | Nonredundant (Striping) | N | ต่ำกว่า disk เดี่ยว | สูงมาก (read และ write) | สูงมาก (read/write) |
| 1 | Mirrored (Mirroring) | 2N | สูงกว่า RAID 2,3,4,5; ต่ำกว่า RAID 6 | read สูงกว่า single; write เท่า single | read ได้ถึง 2× ของ single; write เท่า single |
| 2 | Redundant via Hamming code (Parallel access) | N + m (m ∝ log N) | สูงกว่า single มาก | สูงที่สุดในกลุ่ม | ~2× single |
| 3 | Bit-interleaved parity (Parallel access) | N + 1 | สูงกว่า single มาก | สูงที่สุดในกลุ่ม | ~2× single |
| 4 | Block-interleaved parity (Independent access) | N + 1 | สูงกว่า single มาก | read ≈ RAID 0; write ต่ำกว่า single อย่างมาก | read ≈ RAID 0; write ต่ำกว่า single มาก |
| 5 | Block-interleaved distributed parity | N + 1 | สูงกว่า single มาก | read ≈ RAID 0; write ต่ำกว่า single | read ≈ RAID 0; write โดยทั่วไปต่ำกว่า single |
| 6 | Block-interleaved dual distributed parity | N + 2 | สูงที่สุด | read ≈ RAID 0; write ต่ำกว่า RAID 5 | read ≈ RAID 0; write ต่ำกว่า RAID 5 มาก |
รายละเอียดแต่ละระดับ
| Level | แนวคิด (แบบเข้าใจง่ายตามสไลด์) | จุดเด่น/ข้อเสีย |
|---|---|---|
| RAID 0 | แบ่งข้อมูลเป็นชิ้นเล็ก ๆ (strips) กระจายเขียนลงหลาย disk พร้อมกัน · logical disk ถูก map เป็น strip 0,1,2,3 ไปยัง disk 0–3 วนไป | เร็วมาก แต่ ไม่มี redundancy (disk เดียวเสีย = ข้อมูลหาย) · ต้องการ transfer capacity สูงตลอดเส้นทาง host↔disk และ application ส่งคำขอ I/O ให้เหมาะ · small request: เวลาถูกครอบงำด้วย seek+latency → กระจาย load ข้าม disk ได้ rate สูง; strip ใหญ่ทำให้คำขอรอจัดการขนานกันได้ ลดเวลาคิว |
| RAID 1 | Mirroring — เขียนข้อมูลชุดเดียวกันซ้ำลง disk สองตัว (แต่ละ logical strip map ไป 2 physical disk) | read ใช้ disk ตัวใดก็ได้ · ไม่มี write penalty · กู้คืนง่าย (ไปอ่านอีกตัว) · สำเนา real-time · request rate สูงถ้าเป็น read ส่วนใหญ่ · ข้อเสียหลัก ราคา (ใช้ 2× disk) |
| RAID 2 | Bit-level striping + Hamming code (ECC) เก็บแยกไว้ใน disk ต่างหาก · parallel access: ทุก disk ร่วมทำทุกคำขอ, spindle synchronized · strip เล็กมาก (1 byte/word) | แก้ error 1 bit ตรวจ 2 bit · จำนวน redundant disk ∝ log N · ซับซ้อนที่สุด แทบไม่มีใช้จริงในปัจจุบัน · เหมาะเฉพาะที่ disk error บ่อย |
| RAID 3 | Byte(bit)-level striping + parity disk ตัวเดียว (parity bit คำนวณจากบิตตำแหน่งเดียวกันในทุก data disk) · parallel access, strip เล็ก | ใช้ redundant disk แค่ 1 ตัว ไม่ว่า array ใหญ่แค่ไหน · transfer rate สูงมาก · disk เสีย → อ่านจาก parity+disk ที่เหลือ กู้ข้อมูล (reduced mode) · ต้องเปลี่ยน disk แล้ว regenerate ทั้งหมดจึงกลับ full operation · แย่ใน transaction-oriented |
| RAID 4 | Block-level striping + parity disk แยก 1 ตัว · independent access: แต่ละ disk ทำงานอิสระ คำขอ I/O หลายอันขนานกันได้ · strip ใหญ่ | Write penalty: ต้องอ่าน old data strip + old parity แล้วคำนวณ parity ใหม่ → 1 strip write = 2 read + 2 write · parity disk เป็นคอขวด (RAID 5 มาแก้) |
| RAID 5 | เหมือน RAID 4 แต่ กระจาย parity ไปทุก disk (round-robin) → ตัดคอขวด | ยังมี write penalty (1 write = 2 read + 2 write) · ใช้กันแพร่หลาย |
| RAID 6 | เหมือน RAID 5 แต่มี parity 2 ชุด (P และ Q — คำนวณด้วยอัลกอริทึมต่างกัน) เก็บในต่าง block ต่าง disk | availability สูงมาก — ต้อง disk 3 ตัวเสียในช่วง MTTR ข้อมูลจึงหาย · write penalty มาก (แต่ละ write กระทบ 2 parity block) · ต้องใช้ N + 2 disks |
Parallel access (2, 3) = ทุก disk ทำทุกคำขอ + spindle sync · Independent access (4, 5, 6) = แต่ละ disk ทำคำขอแยก
6.5 SSD (Solid State Drive)
SSD vs HDD (Table 6.5)
| NAND Flash (SSD) | Seagate Laptop HDD | |
|---|---|---|
| File copy/write speed | 200–550 Mbps | 50–120 Mbps |
| Power draw | เฉลี่ย 2–3 W → battery ยืดได้ 30+ นาที | เฉลี่ย 6–7 W |
| ความจุ | notebook ≤ 512 GB; desktop สูงสุด 1 TB | notebook ~500 GB–2 TB; desktop สูงสุด 4 TB |
| ราคา | ~$0.50/GB (1 TB) | ~$0.15/GB (4 TB) |
ข้อดีของ SSD เทียบ HDD: IOPS สูง · ทนทาน (durability) · อายุยาวกว่า · กินไฟต่ำ · เงียบและเย็น · access time/latency ต่ำ
SSD architecture
Host system (OS software, file system, I/O driver) → Interface → SSD: Interface controller + Addressing + Data buffer/cache + Error correction → Flash memory components หลายตัว
Practical issues เฉพาะ SSD (HDD ไม่เจอ)
- ช้าลงเมื่อใช้งานนาน: การเขียนต้อง ① อ่านทั้ง block จาก flash ไปไว้ใน RAM buffer ② erase ทั้ง block ③ เขียนทั้ง block จาก buffer กลับ flash
- Flash เสื่อมใช้งานไม่ได้หลังจำนวนครั้งการเขียนจำกัด
วิธียืดอายุ: ใส่ cache หน้า flash เพื่อหน่วงและรวมการเขียน · wear-leveling กระจายการเขียนให้ทั่ว block · bad-block management · flash ส่วนใหญ่ประเมินอายุที่เหลือเองเพื่อให้ระบบเตรียมรับ
6.6 Optical Memory
| ชนิด | ความหมาย / ความจุ |
|---|---|
| CD | Compact Disk — เก็บเสียงดิจิทัล แบบ nonerasable · 12 cm · เล่นต่อเนื่อง >60 นาที |
| CD-ROM | Read-Only — เก็บข้อมูลคอมพิวเตอร์ ≥ 650 MB (ตาม Fig = 682 MB) |
| CD-R | Recordable — เขียนได้ ครั้งเดียว (WORM) |
| CD-RW | Rewritable — ลบ/เขียนซ้ำได้หลายครั้ง |
| DVD | Digital Versatile Disk — วิดีโอบีบอัด/ข้อมูลขนาดใหญ่ · 8 และ 12 cm · double-sided สูงสุด 17 GB · พื้นฐานเป็น DVD-ROM |
| DVD-R / DVD-RW | เขียนครั้งเดียว / เขียนซ้ำ — ใช้ได้เฉพาะ แผ่นด้านเดียว |
| Blu-ray | วิดีโอ HD · ความหนาแน่นสูงกว่า DVD มาก ใช้เลเซอร์ 405 nm (น้ำเงิน-ม่วง) · 1 layer 1 ด้านจุ 25 GB |
CD-ROM
- เทคโนโลยีเหมือน audio CD; CD-ROM player ทนกว่าและมี error correction เพื่อให้ข้อมูลถูกต้อง
- การผลิต: แผ่นจากเรซิน (polycarbonate) → บันทึกข้อมูลเป็น pit จิ๋วด้วยเลเซอร์ความเข้มสูงสร้าง master → ทำ die ปั๊มสำเนา → เคลือบชั้นสะท้อน (aluminum/ทอง) → ชั้นป้องกัน acrylic → พิมพ์ label
- การอ่าน: เลเซอร์ส่องผ่าน polycarbonate ไปที่ pit/land หน้าชั้นสะท้อน (Pit สะท้อนต่าง Land)
- CD-ROM block format: 12 byte Sync + 4 byte ID (Min, Sec, Sector, Mode) + 2048 byte data + 288 byte L-ECC (layered ECC) = 2352 byte
- ข้อดี: ผลิตซ้ำจำนวนมากราคาถูก · ถอดได้ เก็บถาวรได้ · ข้อเสีย: อ่านอย่างเดียว อัปเดตไม่ได้ · access time ช้ากว่า magnetic disk มาก · ต้นทุนการเขียนต้นฉบับสูงจึงไม่เหมาะงานเฉพาะบุคคล
CD-R และ CD-RW
| CD-R (write-once read-many) | CD-RW |
|---|---|
| เขียนครั้งเดียวด้วยเลเซอร์ความเข้มปานกลาง · มี dye layer เปลี่ยนค่า reflectivity เมื่อถูกเลเซอร์ความเข้มสูง · บันทึกถาวร ใช้เมื่อต้องการสำเนาไม่กี่ชุด | เขียนทับได้ · ใช้วัสดุ phase change ที่มี 2 สถานะ reflectivity ต่างกัน: amorphous (โมเลกุลสุ่ม สะท้อนแย่) กับ crystalline (ผิวเรียบ สะท้อนดี) · เลเซอร์เปลี่ยนสถานะได้ · ข้อเสีย: วัสดุเสื่อมถาวรในที่สุด |
เปรียบเทียบ CD / DVD / Blu-ray
| CD | DVD | Blu-ray | |
|---|---|---|---|
| Laser wavelength | 780 nm | 650 nm | 405 nm |
| Track / pit (ตัวเลขในภาพสไลด์) | ใหญ่ที่สุด (เช่น 1.2 / 2.11 µm) | เล็กลง (เช่น 0.6 µm) | เล็กที่สุด (เช่น 0.1 µm) |
ตัวเลข track/pit ในภาพสไลด์ (Fig 6.12): 2.11, 1.2, 0.6, 0.1, 1.32, 0.58 µm — ความหมาย: wavelength สั้นลง → beam spot เล็กลง → pit/track เล็กลง → จุข้อมูลได้มากขึ้น (CD → DVD → Blu-ray)
รูปที่ 6.11: CD-ROM (ความจุ 682 MB, หนา 1.2 mm, ชั้น polycarbonate + reflective aluminum + acrylic + label) vs DVD-ROM double-sided dual-layer (17 GB; แต่ละด้านมี semireflective + fully reflective layer; เลเซอร์ focus ทีละชั้นทีละด้าน ต้องพลิกแผ่น เพื่ออ่านอีกด้าน)
6.7 Magnetic Tape
- ใช้เทคนิคอ่าน/บันทึกเหมือน disk · สื่อเป็น เทปโพลีเอสเตอร์ยืดหยุ่น เคลือบแม่เหล็ก (ผงโลหะบริสุทธิ์ในตัวประสาน หรือฟิล์มโลหะ vapor-plated)
- ข้อมูลเป็น แทร็กขนานตามความยาวเทป · serial recording (บิตเรียงต่อกันตาม track) · อ่าน/เขียนเป็นบล็อกต่อเนื่องเรียก physical records คั่นด้วย inter-record gaps
- Serpentine recording: เขียนไปตามความยาว track 0 → ถึงปลายเทป → กลับทิศไป track 1 (ตัวอย่างระบบอ่าน/เขียน 4 track พร้อมกัน — block 1,2,3,4 ลง 4 track ขนาน แล้ว block 5…)
LTO Tape Drives (Linear Tape-Open)
| LTO-1 | LTO-2 | LTO-3 | LTO-4 | LTO-5 | LTO-6 | LTO-7 | LTO-8 | |
|---|---|---|---|---|---|---|---|---|
| ปีออก | 2000 | 2003 | 2005 | 2007 | 2010 | TBA | ||
| ความจุ (compressed) | 200 GB | 400 GB | 800 GB | 1.6 TB | 3.2 TB | 8 TB | 16 TB | 32 TB |
| Transfer rate | 40 MB/s | 80 | 160 | 240 | 280 | 525 | 788 | 1.18 GB/s |
| Tracks | 384 | 512 | 704 | 896 | 1280 | — | — | — |
| WORM | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Encryption | No | No | No | Yes | Yes | Yes | Yes | Yes |
| Partitioning | No | No | No | No | Yes | Yes | Yes | Yes |
รุ่นแรก ๆ: tape length 609→846 m, กว้าง 1.27 cm, write elements 8→16, linear density 4,880→15,142 bits/mm (LTO-1→5)
Computing Unit — Pipelining
7.1 Pipelining Overview
กรณี non-stop (n ชุดมาก ๆ): Speedup = 2n / (0.5n + 1.5) ≈ 4 = จำนวน stage
RISC-V pipeline 5 stage — "ทำ 1 ขั้นต่อ 1 stage"
| Stage | ทำอะไร |
|---|---|
| IF Instruction Fetch | ดึง instruction จาก memory |
| ID Instruction Decode | ถอดรหัส + อ่าน register |
| EX Execute | ทำ operation หรือ คำนวณ address |
| MEM Memory access | เข้าถึง memory operand |
| WB Write Back | เขียนผลกลับ register |
7.2 Pipeline Performance
สมมติเวลา: register read/write = 100 ps, stage อื่น = 200 ps → เปรียบเทียบ pipelined กับ single-cycle datapath
| Instr | Instr fetch | Register read | ALU op | Memory access | Register write | Total |
|---|---|---|---|---|---|---|
ld | 200 | 100 | 200 | 200 | 100 | 800 ps |
sd | 200 | 100 | 200 | 200 | — | 700 ps |
| R-format | 200 | 100 | 200 | — | 100 | 600 ps |
beq | 200 | 100 | 200 | — | — | 500 ps |
Pipelined: Tc = 200 ps (ตาม stage ที่ช้าที่สุด)
ตัวอย่างตำรา: 3
ld ติดกัน → single-cycle = 3 × 800 = 2400 ps · pipelined = 1400 ps (เร็วขึ้น ≈ 1.7×); ถ้ามีคำสั่งมาก ๆ → 800/200 = 4×.ถ้า stage สมดุล: Time between instructions (pipelined) = Time between instructions (nonpipelined) / จำนวน stage
ISA ที่ออกแบบมาเพื่อ pipelining (RISC-V)
- instruction ยาว 32 บิตเท่ากันทุกตัว → fetch/decode ง่ายใน 1 cycle (เทียบ x86: ยาว 1–17 byte)
- format น้อยและสม่ำเสมอ → decode และอ่าน register ได้ในขั้นเดียว
- Load/store addressing: คำนวณ address ใน stage 3 (EX) แล้วเข้าถึง memory ใน stage 4 (MEM)
7.3 Hazards — สถานการณ์ที่ขวางการเริ่ม instruction ถัดไปใน cycle ถัดไป
| ชนิด | สาเหตุ |
|---|---|
| Structure hazard | ทรัพยากรที่ต้องใช้ ถูกใช้อยู่ |
| Data hazard | ต้อง รอ คำสั่งก่อนหน้าอ่าน/เขียนข้อมูลเสร็จ |
| Control hazard | การตัดสินใจเรื่องควบคุม (branch) ขึ้นกับคำสั่งก่อนหน้า |
Structure hazard
- ตัวอย่าง: pipeline RISC-V ที่มี memory เดียว — load/store ต้อง access data ตรงกับ IF ของอีกคำสั่ง → IF ต้อง stall 1 cycle → เกิด bubble
- แก้: pipelined datapath ต้องมี instruction memory / data memory แยก (หรือ I-cache/D-cache แยก)
Data hazard
add x19, x0, x1sub x2, x19, x3 ← ต้องใช้ x19 ที่ add ยังไม่เขียนกลับForwarding (bypassing) = นำผลมาใช้ ทันทีที่คำนวณได้ ไม่ต้องรอเขียนลง register · ต้องเพิ่มการเชื่อมต่อใน datapath
Load-use data hazard: forwarding แก้ได้ไม่เสมอ — ถ้าค่ายังไม่ถูกคำนวณตอนต้องใช้ ("ส่งย้อนเวลาไม่ได้!") ต้อง stall 1 cycle
Code scheduling เพื่อเลี่ยง stall
a = b + e; c = b + f;ลำดับเดิม (ld → add ใช้ค่าทันทีสองจุด → stall 2 ครั้ง): ld x1,0(x0) · ld x2,8(x0) · [stall] add x3,x1,x2 · sd x3,24(x0) · ld x4,16(x0) · [stall] add x5,x1,x4 · sd x5,32(x0) → 13 cycles
จัดลำดับใหม่ (ย้าย ld x4 ขึ้นมาก่อน): ld x1 · ld x2 · ld x4 · add x3,x1,x2 · sd x3 · add x5,x1,x4 · sd x5 → 11 cycles (ไม่มี stall)
→ compiler ช่วย จัดลำดับเพื่อเลี่ยง hazard ได้ (ต้องรู้โครงสร้าง pipeline)
Control hazard
- branch กำหนดทิศทาง — การ fetch คำสั่งถัดไปขึ้นกับผล branch แต่ branch ยังอยู่ใน ID
- ใน RISC-V pipeline ต้อง เปรียบเทียบ register และคำนวณ target เร็ว → เพิ่ม hardware ทำใน ID stage
- Stall on branch — รอผล branch ก่อน fetch ต่อ (ช้า)
7.4 Pipelined Datapath & Control
- datapath แบ่งเป็น IF, ID, EX, MEM, WB · ข้อมูลไหล ซ้ายไปขวา ยกเว้น 2 จุดที่ไหล ขวาไปซ้าย (WB เขียน register, และเลือก PC ใหม่) → เป็นต้นเหตุของ hazards
- ต้องมี pipeline registers คั่นระหว่าง stage เพื่อเก็บข้อมูลที่ได้จาก cycle ก่อน: IF/ID, ID/EX, EX/MEM, MEM/WB
- Single-clock-cycle diagram = สถานะ pipeline ใน 1 cycle (เห็นทรัพยากรที่ใช้) vs multi-clock-cycle diagram = กราฟตามเวลา (รูปแบบ "traditional" และแบบแสดงทรัพยากร)
- ตัวอย่าง load: IF → ID → EX (คำนวณ address) → MEM (อ่าน memory) → WB (เขียน register) · จุดผิดพลาดที่แก้: ใน WB หมายเลข register ปลายทาง (Rd) ต้อง ส่งต่อผ่าน pipeline registers มาจนถึง MEM/WB — เดิมใช้ผิดตัว ("wrong register number") → "Corrected datapath for load"
- Pipelined control (simplified): สัญญาณควบคุมถูกสร้างใน ID แล้วส่งไปตาม pipeline registers ตามสถานะของแต่ละ stage (EX, MEM, WB)
7.5 Data Hazards: Forwarding vs Stalling
sub x2, x1, x3and x12, x2, x5or x13, x6, x2add x14, x2, x2sd x15, 100(x2)ทุกคำสั่งหลัง sub ใช้ x2 → แก้ด้วย forwarding · คำถาม: ตรวจอย่างไรว่าต้อง forward?
Detecting the need to forward
ส่ง เลข register ไปตาม pipeline · ใน EX stage ALU operand คือ ID/EX.RegisterRs1 และ ID/EX.RegisterRs2
| เงื่อนไข data hazard | forward จาก |
|---|---|
1a. EX/MEM.RegisterRd = ID/EX.RegisterRs11b. EX/MEM.RegisterRd = ID/EX.RegisterRs2 | EX/MEM pipeline register |
2a. MEM/WB.RegisterRd = ID/EX.RegisterRs12b. MEM/WB.RegisterRd = ID/EX.RegisterRs2 | MEM/WB pipeline register |
แต่ เฉพาะเมื่อ instruction ที่ forward เขียน register จริง (EX/MEM.RegWrite, MEM/WB.RegWrite) และ Rd ≠ x0 (RegisterRd ≠ 0)
| Mux control | Source | ความหมาย |
|---|---|---|
| ForwardA = 00 | ID/EX | operand แรกของ ALU มาจาก register file |
| ForwardA = 10 | EX/MEM | operand แรก forward จากผล ALU ก่อนหน้า |
| ForwardA = 01 | MEM/WB | operand แรก forward จาก data memory หรือผล ALU เก่ากว่า |
| ForwardB = 00 / 10 / 01 | เช่นเดียวกัน แต่สำหรับ operand ที่สอง | |
Double data hazard
add x1,x1,x2 · add x1,x1,x3 · add x1,x1,x4 — เกิดทั้ง EX hazard และ MEM hazard พร้อมกัน → ต้องใช้ค่าล่าสุดแก้: MEM hazard forward เฉพาะเมื่อเงื่อนไข EX hazard ไม่เป็นจริง
if (MEM/WB.RegWrite and (MEM/WB.RegisterRd ≠ 0) and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0) and (EX/MEM.RegisterRd = ID/EX.RegisterRs1)) and (MEM/WB.RegisterRd = ID/EX.RegisterRs1)) ForwardA = 01 (เช่นเดียวกันสำหรับ Rs2 → ForwardB = 01)7.6 Load-Use Hazard Detection & Stalling
- ตรวจใน ID stage ตอนถอดรหัสคำสั่งที่ใช้ค่า: operand คือ
IF/ID.RegisterRs1,IF/ID.RegisterRs2 - Load-use hazard เมื่อ:
ID/EX.MemReadและ (ID/EX.RegisterRd = IF/ID.RegisterRs1หรือ= IF/ID.RegisterRs2) (สไลด์พิมพ์ Rs1 ซ้ำสองครั้ง — ตัวที่สองควรเป็น Rs2) - ถ้าตรวจพบ: stall และสอด bubble
วิธี stall pipeline
- บังคับค่าควบคุมใน ID/EX register เป็น 0 → EX, MEM, WB ทำ nop (no-operation)
- ห้ามอัปเดต PC และ IF/ID register → คำสั่งที่ใช้ค่าถูก decode ซ้ำ และคำสั่งถัดไปถูก fetch ซ้ำ
- stall 1 cycle ให้ MEM อ่านข้อมูลของ
ldได้ แล้วจึง forward เข้า EX ได้
7.7 Control Hazards & Branch Prediction
Branch hazard
- ถ้ารู้ผล branch ที่ MEM stage: คำสั่งที่ fetch ผิดไปแล้ว (3 คำสั่ง) ต้อง flush (ตั้งค่า control เป็น 0)
- Reducing branch delay: ย้าย hardware ตัดสินผลมาที่ ID stage — เพิ่ม target address adder + register comparator
36: sub x10,x4,x8 · 40: beq x1,x3,16 // PC-relative → target = 40 + 16×2 = 72 · 44: and · 48: orr · 52: add · 56: sub … · 72: ld x4,50(x7)เมื่อ taken: คำสั่งที่ 44 ถูก flush แล้ว fetch จาก 72 (เสีย 1 cycle เมื่อตัดสินใน ID)
Branch prediction
- pipeline ยาวขึ้นรู้ผลเร็วไม่ได้ → stall penalty รับไม่ได้ → ทำนายผล branch และ stall เฉพาะเมื่อ ทำนายผิด
- RISC-V pipeline: ทำนายว่า ไม่ taken — fetch คำสั่งถัดไปได้เลยไม่เสียเวลา
| Static branch prediction | Dynamic branch prediction |
|---|---|
| ตามพฤติกรรม branch ทั่วไป (loop และ if-statement) — backward branch → predict taken, forward branch → predict not taken | Hardware วัดพฤติกรรมจริง เช่น บันทึกประวัติล่าสุดของแต่ละ branch แล้วสมมติว่าแนวโน้มจะต่อไป · ถ้าผิด → stall ระหว่าง re-fetch และอัปเดตประวัติ |
Parallel Processors from Client to Cloud
8.1 Introduction & ความยากของ Parallel Programming
- เป้าหมาย: เชื่อมต่อคอมพิวเตอร์หลายเครื่อง/หลาย processor เพื่อ performance สูงขึ้น — ได้ scalability, availability, power efficiency
- Task-level (process-level) parallelism: throughput สูงสำหรับงานอิสระหลายงาน
- Parallel processing program: โปรแกรมเดียวรันบนหลาย processor · Multicore microprocessor: ชิปที่มีหลาย processor (core)
| Sequential software | Concurrent software | |
|---|---|---|
| Serial hardware (เช่น Pentium 4) | — | — |
| Parallel hardware (เช่น quad-core Xeon e5345) | เช่น matrix multiplication | เช่น operating system |
ซอฟต์แวร์ sequential/concurrent รันบน hardware serial/parallel ได้ · ความท้าทาย = ใช้ parallel hardware ให้ได้ผลจริง
สิ่งที่เรียนมาแล้วเกี่ยวกับ parallelism: Synchronization (§2.11) · Subword parallelism (§3.6) · Advanced ILP (§4.10) · Cache coherence (§5.10)
8.2 SISD, SIMD, MIMD, SPMD และ Vector
| Data stream: Single | Data stream: Multiple | |
|---|---|---|
| Instruction stream: Single | SISD — เช่น Intel Pentium 4 | SIMD — เช่น SSE instructions ของ x86 |
| Instruction stream: Multiple | MISD — ปัจจุบันไม่มีตัวอย่าง | MIMD — เช่น Intel Xeon e5345 |
SPMD (Single Program Multiple Data) = โปรแกรม parallel บนเครื่อง MIMD ที่มี conditional code ให้ processor ต่างตัวทำต่างกัน
Vector processors
- function unit แบบ pipeline สูง · stream ข้อมูลจาก/ไป vector registers · ข้อมูลถูกเก็บจาก memory เข้า register และผลเก็บกลับ
- ตัวอย่าง Vector extension ของ RISC-V: v0–v31 = 32 registers × 64 element (element 64 บิต) ·
fld.v / fsd.vload/store vector ·fadd.d.vบวก vector double ·fadd.d.vsบวก scalar เข้าทุก element ·fmul.d.vsคูณ vector กับ scalar - ลด instruction-fetch bandwidth ได้มาก
// Conventional RISC-V // Vector RISC-V
fld f0, a(x3) // load scalar a fld f0, a(x3)
addi x5, x19, 512 // end of array X fld.v v0, 0(x19) // load vector x
loop: fld f1, 0(x19) fmul.d.vs v0, v0, f0 // vector-scalar multiply
fmul.d f1, f1, f0 fld.v v1, 0(x20) // load vector y
fld f2, 0(x20) fadd.d.v v1, v1, v0 // vector-vector add
fadd.d f2, f2, f1 fsd.v v1, 0(x20) // store vector y
fsd f2, 0(x20)
addi x19,x19,8 ; addi x20,x20,8
bltu x19,x5,loop
Conventional ใช้ loop 64 รอบ ~ 8 คำสั่งต่อรอบ; Vector ใช้ 6 คำสั่งเท่านั้นVector vs Scalar
- ทำ data-parallel programming ง่ายขึ้น · ระบุชัดว่าไม่มี loop-carried dependence → hardware ตรวจน้อยลง
- access pattern สม่ำเสมอได้ประโยชน์จาก interleaved และ burst memory
- เลี่ยง control hazard เพราะไม่มี loop
- general กว่า media extension แบบ ad-hoc (MMX, SSE) และเข้ากับ compiler ดีกว่า
SIMD
- ทำงานกับ vector of data ทีละ element · เช่น MMX, SSE ของ x86 — เก็บหลาย element ใน register กว้าง 128 บิต
- ทุก processor ทำ instruction เดียวกันในเวลาเดียวกัน (แต่ address ข้อมูลต่างกัน) → sync ง่าย, instruction control hardware น้อย · เหมาะกับงาน data-parallel สูง
| Vector instructions | Multimedia extensions (SIMD) |
|---|---|
| ความกว้าง vector ปรับได้ (variable) | ความกว้าง คงที่ (fixed) |
| รองรับ strided access | ไม่รองรับ strided access |
| vector unit = ผสม pipelined และ arrayed functional units |
8.3 Hardware Multithreading
รันหลาย thread พร้อมกัน · replicate registers, PC ฯลฯ · สลับ thread เร็ว
| แบบ | วิธี | ข้อดี/ข้อเสีย |
|---|---|---|
| Fine-grain | สลับ thread ทุก cycle (interleave การ execute) | ถ้า thread หนึ่ง stall อีก thread ทำต่อ — ซ่อน stall ได้ทั้งสั้นและยาว |
| Coarse-grain | สลับเมื่อ stall ยาว เท่านั้น (เช่น L2 cache miss) | hardware ง่าย แต่ ซ่อน stall สั้นไม่ได้ (เช่น data hazard) |
| Simultaneous (SMT) | ใน processor แบบ multiple-issue, dynamically scheduled — จัด instruction จากหลาย thread · instruction จาก thread อิสระ execute เมื่อ function unit ว่าง · dependency ภายใน thread ใช้ scheduling + register renaming | เช่น Intel Pentium-4 HT: 2 threads, register ซ้ำ แต่ function units และ caches ใช้ร่วม |
อนาคต: ด้วย power → microarchitecture ง่ายขึ้น · multithreading แบบง่าย ทน cache-miss latency · หลาย core ง่าย ๆ อาจแชร์ทรัพยากรได้ดีกว่า
8.4 Shared Memory & Multicore
- SMP (Shared memory Multiprocessor): hardware ให้ single physical address space สำหรับทุก processor · sync ตัวแปรร่วมด้วย locks
- เวลาเข้าถึง memory: UMA (Uniform Memory Access — เท่ากันทุก processor) vs NUMA (Nonuniform — ขึ้นกับว่า memory อยู่ใกล้ไกล)
① แบ่ง ตัวเลข 1000 ตัวต่อ processor แล้วรวมส่วนของตัวเอง:
sum[Pn]=0; for (i=1000*Pn; i<1000*(Pn+1); i+=1) sum[Pn] += A[i];② Reduction แบบ divide and conquer: ครึ่งหนึ่งของ processor บวกคู่, แล้วเหลือ ¼, … ต้อง synchronize ทุกขั้น
half = 64;
do {
synch();
if (half%2 != 0 && Pn == 0)
sum[0] += sum[half-1]; // half เป็นเลขคี่ — P0 รับ element ที่ขาด
half = half/2;
if (Pn < half) sum[Pn] += sum[Pn+half];
} while (half > 1);
64 → 32 → 16 → 8 → 4 → 2 → 1 = 6 ขั้น8.5 Introduction to GPUs
- ประวัติ: video card ยุคแรก = frame buffer memory + address generation ส่งออกวิดีโอ → 3D graphics (เริ่มจากเครื่องระดับสูงเช่น SGI) → Moore's Law ทำให้ถูกลง ความหนาแน่นสูง → 3D graphics card ใน PC และ game console
- GPU = Graphics Processing Unit: processor ที่มุ่งงาน 3D graphics: vertex/pixel processing, shading, texture mapping, rasterization
สถาปัตยกรรม GPU
- การประมวลผล data-parallel สูง · GPU เป็น highly multithreaded — ใช้ thread switching ซ่อน memory latency จึงพึ่ง multi-level cache น้อย
- graphics memory กว้างและ bandwidth สูง · แนวโน้ม general-purpose GPU
- Heterogeneous CPU/GPU: CPU ทำโค้ด sequential, GPU ทำโค้ด parallel
- Languages/APIs: DirectX, OpenGL, C for Graphics (Cg), HLSL, CUDA (Compute Unified Device Architecture)
Classifying GPUs
ไม่เข้าโมเดล SIMD/MIMD เป๊ะ: conditional execution ใน thread ให้ภาพลวง MIMD แต่ performance ตก ต้องเขียนโค้ด general-purpose อย่างระวัง
| Static (discovered at compile time) | Dynamic (discovered at runtime) | |
|---|---|---|
| Instruction-Level Parallelism | VLIW | Superscalar |
| Data-Level Parallelism | SIMD or Vector | Tesla Multiprocessor (GPU) |
เปรียบเทียบ Multicore with SIMD vs GPU
| Feature | Multicore with SIMD | GPU |
|---|---|---|
| SIMD processors | 4–8 | 8–16 |
| SIMD lanes/processor | 2–4 | 8–16 |
| Multithreading HW support (SIMD threads) | 2–4 | 16–32 |
| Single : double-precision ratio | 2:1 | 2:1 |
| Largest cache | 8 MB | 0.75 MB |
| Memory address size | 64-bit | 64-bit |
| Main memory | 8–256 GB | 4–6 GB |
| Page-level memory protection | Yes | Yes |
| Demand paging | Yes | No |
| Integrated scalar/SIMD processor | Yes | No |
| Cache coherent | Yes | No |
8.6 Clusters & Message Passing
| Shared memory (SMP) | Message passing |
|---|---|
| single physical address space · ใช้ lock | แต่ละ processor มี private physical address space · hardware ส่ง/รับ message ระหว่าง processor |
Loosely coupled clusters
- เครือข่ายของคอมพิวเตอร์อิสระ — แต่ละเครื่องมี private memory และ OS · เชื่อมผ่าน I/O system (เช่น Ethernet/switch, Internet)
- เหมาะกับงานอิสระ: web server, database, simulation · high availability, scalable, ราคาไม่แพง
- ปัญหา: ค่าบริหารจัดการ (นิยมใช้ virtual machine) · interconnect bandwidth ต่ำ เมื่อเทียบ processor/memory bandwidth ของ SMP
Grid computing
คอมพิวเตอร์แยกกันเชื่อมด้วย long-haul network (เช่น Internet) · แจก work unit ไปประมวลผลแล้วส่งผลกลับ · ใช้ เวลาว่างของ PC ได้ — เช่น SETI@home, World Community Grid
8.7 Interconnection Network Topologies
Network topology = การจัดเรียง processor, switch และ link
| Topology | ลักษณะ |
|---|---|
| Bus | สายร่วมสายเดียว — ง่าย แต่ bandwidth ถูกแชร์ |
| Ring | ต่อเป็นวง |
| 2D Mesh | ตารางสองมิติ |
| N-cube (N = 3) | โครงแบบลูกบาศก์/hypercube |
| Fully connected | ทุกโหนดต่อถึงกันทุกโหนด — performance ดีสุด ต้นทุนสูงสุด |
| Multistage networks | ชั้นของ switch หลายชั้น |
Network characteristics
- Performance: latency ต่อ message (เครือข่ายไม่โหลด) · throughput: link bandwidth, total network bandwidth, bisection bandwidth · congestion delays (ขึ้นกับ traffic)
- และ Cost, Power, Routability in silicon
8.8 Parallel Benchmarks & Performance Model
| Benchmark | คืออะไร |
|---|---|
| Linpack | matrix linear algebra |
| SPECrate | รัน SPEC CPU programs แบบขนาน — job-level parallelism |
| SPLASH | Stanford Parallel Applications for Shared Memory — kernels + applications, strong scaling |
| NAS | NASA Advanced Supercomputing — kernels ด้าน computational fluid dynamics |
| PARSEC | Princeton Application Repository for Shared Memory Computers — multithreaded apps ด้วย Pthreads และ OpenMP |
- Code or applications? Benchmark ดั้งเดิมใช้โค้ด/ข้อมูลตายตัว แต่ parallel programming กำลังวิวัฒน์ → ควรเปรียบเทียบระบบจากการที่มัน implement application ที่กำหนด (เช่น Linpack, Berkeley Design Patterns) เพื่อกระตุ้นนวัตกรรม
Modeling performance (Roofline)
- metric ที่สนใจ: achievable GFLOPs/sec (วัดด้วย computational kernels จาก Berkeley Design Patterns)
- Arithmetic intensity ของ kernel = FLOPs ต่อ byte ของ memory ที่เข้าถึง
- สำหรับแต่ละเครื่องหา: Peak GFLOPS (จาก data sheet) และ Peak memory bytes/sec (ใช้ Stream benchmark)