ITDS-211 Computer Architecture
ITDS-211 · Mahidol ICT · W. Suntiamorntut

สรุป Computer Architecture
ครบทั้ง 8 บท

อ่านทีละบท หนึ่งบทต่อหนึ่งหน้าจอ สรุปเป็นไทยแทรกศัพท์อังกฤษที่ใช้สอบ มีสูตร ตัวอย่างโจทย์ และเช็กลิสต์ท้ายบท

เริ่มอ่านบท 01 → 0 / 8 บทอ่านแล้ว
8บท
~4.5ชั่วโมงอ่านรวม
513หน้าสไลด์ที่ย่อให้
ค้นหาได้พิมพ์ศัพท์ที่ช่องบนสุด

เลือกบทที่จะอ่าน

ทดสอบตัวเอง

อ่านสีของกล่องให้เป็น

ประเด็นหลัก
ใจความที่ควรจำ
สูตร
สูตรคำนวณ/นิยาม
ตัวอย่าง
โจทย์พร้อมวิธีทำ
เน้นสอบ
จุดที่มักออก/เช็กลิสต์
ระวัง
จุดผิดพลาด/ข้อสังเกต

หมายเหตุ: สรุปจากข้อความและรูปในสไลด์ PDF บางส่วนเสริมจากตำราอ้างอิงของสไลด์ (Patterson & Hennessy / Stallings) ถ้าขัดกับที่อาจารย์สอน ให้ยึดอาจารย์

Chapter 01

Basic Computer Components & Introduction to Computer Architecture

สไลด์ 43 หน้า · อ่านราว 25 นาที · หัวใจของบท: Performance (CPU Time, CPI)

1.1 Architecture vs Organization

Computer Architecture (สถาปัตยกรรม)Computer Organization (โครงสร้างการจัดระบบ)
คืออะไรคุณสมบัติของระบบที่ programmer มองเห็น และมีผลต่อการทำงานเชิงตรรกะของโปรแกรมหน่วยปฏิบัติการและการเชื่อมต่อที่ทำให้ architecture เกิดขึ้นจริง
ตัวอย่างInstruction set, addressing modes, data typesCache, pipeline, bus width, clock speed, control signals
คำถามที่ตอบWHAT — เครื่องทำอะไรได้HOW — ทำได้อย่างไรในระดับวงจร
เกี่ยวกับใครผู้ใช้ / programmerวิศวกรฮาร์ดแวร์
ข้อสอบชอบถาม: architecture ตัวเดียวกัน (เช่น ISA เดียวกัน) มี organization ต่างกันได้ เช่น CPU สองรุ่นรัน instruction set เดียวกันแต่ cache/pipeline ไม่เหมือนกัน

มุมมองเก่า: 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 ServiceVirtual machine, server, storage, networkOS, runtime, DB, applicationAWS, Azure VM (ควบคุมผ่าน API)
จำง่าย: ยิ่งไป SaaS ยิ่ง ง่าย · ถูกตั้งแต่แรก · scale ง่าย แต่ ปรับแต่ง (customize) ได้น้อย; ยิ่งไป IaaS ยิ่งปรับแต่งได้มาก แต่ซับซ้อนและค่าใช้จ่ายตั้งต้นสูง (Traditional IT = ลูกค้าดูแลทุกชั้นเอง)

1.3 Eight Great Ideas in Computer Architecture

  1. Design for Moore's Law — ออกแบบโดยคาดว่าทรานซิสเตอร์เพิ่มขึ้นเรื่อย ๆ
  2. Use abstraction to simplify design — ซ่อนรายละเอียดเป็นชั้น ๆ
  3. Make the common case fast — ทำเคสที่เกิดบ่อยให้เร็ว
  4. Performance via parallelism — ทำหลายอย่างพร้อมกัน
  5. Performance via pipelining — ทำเป็นสายพาน (ซ้อนขั้นตอน)
  6. Performance via prediction — เดาล่วงหน้า (เช่น branch prediction) ถ้าเดาถูกคุ้มกว่ารอ
  7. Hierarchy of memories — หน่วยความจำเป็นลำดับชั้น เร็ว/เล็ก/แพง → ช้า/ใหญ่/ถูก
  8. Dependability via redundancy — ทนทานโดยมีของสำรอง

ข้อ 4–6 อาจารย์จัดเป็นกลุ่ม "เพิ่ม Performance"

ปัจจัยที่กำหนด Performance

ส่วนมีผลต่อ
Algorithmจำนวน operations ที่ต้องทำ
Programming language, compiler, architectureจำนวน machine instructions ต่อ operation
Processor & memory systeminstructions ถูก 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

  1. High-level language (เช่น C) — ใกล้โจทย์ ผลิตภาพดี พกพาข้ามเครื่องได้ ↓ Compiler
  2. Assembly language — ข้อความแทนคำสั่ง (ตัวอย่างในสไลด์เป็น RISC-V: slli, add, ld, sd, jalr) ↓ Assembler
  3. 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

  1. Fetch ดึง instruction จาก memory
  2. Decode แปล instruction เป็นคำสั่งย่อยให้ control unit
  3. Execute ทำคำสั่ง (ที่ ALU)
  4. 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-coreMulti-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

RISCCISC
Reduced Instruction Set ComputingComplex 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 ParallelismILP Instruction-Level · Vector/GPU · Thread-Level · Request-Level
TLP Task-Level Parallelism

Flynn's Taxonomy

ชนิดความหมายตัวอย่าง
SISD1 instruction stream, 1 data streamCPU ธรรมดา
SIMD1 instruction, หลาย dataVector architectures, Multimedia extensions, GPU
MISDหลาย instruction, 1 dataไม่มี commercial implementation
MIMDหลาย instruction, หลาย dataTightly-coupled / Loosely-coupled MIMD

System-level architecture patterns

Monolithic (ระบบเดียวรวม) · Client-server (แยกเครื่องร้องขอ/ให้บริการ) · Distributed (คำนวณกระจายหลายเครื่องในเครือข่าย) · Microservices (บริการย่อยแยก deploy อิสระ — เป็น software pattern)

1.8 Performance — สูตรที่ต้องจำ

Performance = 1 / Execution Time
"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
CPU Time = CPU Clock Cycles × Clock Cycle Time = CPU Clock Cycles / Clock Rate

ปรับปรุง performance ได้โดย ลดจำนวน clock cycles หรือ เพิ่ม clock rate (ผู้ออกแบบมักต้อง trade-off ระหว่าง clock rate กับจำนวน cycle)

Instruction Count และ CPI

Clock Cycles = Instruction Count × CPI (Cycles Per Instruction)
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

Computer A: 2 GHz, CPU time 10 s · Computer B ต้องการ 6 s แต่มี clock cycles มากกว่า A 1.2 เท่า → B ต้อง clock rate เท่าไร?
Clock CyclesA = 10 s × 2 GHz = 20×109
Clock RateB = (1.2 × 20×109) / 6 s = 24×109 / 6 = 4 GHz

ตัวอย่างที่ 2: CPI (ISA เดียวกัน)

A: cycle time 250 ps, CPI 2.0 · B: cycle time 500 ps, CPI 1.2 · ใครเร็วกว่า?
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 เท่า
เทคนิคทำโจทย์: เขียน CPU Time = IC × CPI × T ของแต่ละเครื่องก่อน เมื่อ IC เท่ากันตัดทิ้งได้ แล้วหารเปรียบเทียบ — เครื่องที่มี CPI ต่ำกว่าไม่ได้เร็วกว่าเสมอ ต้องดู clock ด้วย
Chapter 02

Computer Systems, Computer Functions, Processor Structure and Function

สไลด์ 46 หน้า · อ่านราว 30 นาที · หัวใจของบท: Instruction cycle, MARIE, Interrupt

2.1 Von Neumann vs Harvard

Von NeumannHarvard
แนวคิด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

  1. ต้นทุก instruction cycle CPU ดึง instruction จาก memory
  2. PC เก็บ address ของ instruction ที่จะดึง
  3. หลัง fetch PC เพิ่มอัตโนมัติ เพื่อชี้ instruction ถัดไป
  4. instruction ที่ดึงมาถูกโหลดเข้า IR
  5. 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 Accumulator16 bitoperand ตัวหนึ่ง / ผลลัพธ์ / ค่าเงื่อนไข
MAR12 bitaddress ของ instruction หรือ operand
MBR16 bitข้อมูลหลังดึง / ก่อนใส่ memory
PC12 bitaddress ของ instruction ถัดไป
IR16 bitinstruction ที่กำลังจะทำ
InREG8 bitข้อมูลจาก input device
OutREG8 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 คำสั่งพื้นฐานในสไลด์)

BinaryHexInstructionความหมาย
00011Load Xโหลดค่าที่ address X เข้า AC
00102Store Xเก็บค่า AC ลง address X
00113Add Xบวกค่าที่ address X เข้า AC
01004Subt Xลบค่าที่ address X ออกจาก AC
01015Inputรับค่าจาก keyboard เข้า AC
01106Outputแสดงค่าใน AC ที่จอ
01117Haltจบโปรแกรม
10008Skipcondข้าม instruction ถัดไปตามเงื่อนไข
10019Jump Xโหลดค่า X เข้า PC
ตัวอย่างการอ่านบิต: LOAD 3 ใน IR = opcode 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 XADD X
MAR ← X
MBR ← M[MAR]
AC ← MBR
MAR ← X
MBR ← 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

  1. Fetch instruction จาก memory ใส่ IR (MAR ← PC, IR ← M[MAR], PC ← PC + 1)
  2. Decode หาว่าต้องทำอะไร (MAR ← IR[11–0], ถอดรหัส IR[15–12])
  3. ถ้ามี operand ใน memory ดึงมาใส่ MBR
  4. Execute

ตัวอย่างโปรแกรม (address 100–106 hex)

AddrInstructionHex
100Load 1041104
101Add 1053105
102Store 1064106 (ตามสไลด์; Store ควรเป็น 2xxx)
103Halt7000
10400230023 (ข้อมูล = 35)
105FFE9FFE9 (= −23)
10600000000 (เก็บผล)

ผล: 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)

สไลด์ตารางเดิมพิมพ์ Store 106 เป็น 4106 ซึ่งไม่ตรง opcode Store (2) ในตาราง ระวังเวลาทำข้อสอบ ให้ยึด opcode จากตาราง instruction

2.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 ของผู้ใช้
Timertimer ภายใน processor ให้ OS ทำงานเป็นช่วง ๆ
I/OI/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 สูงกว่าแทรกเข้าไปก่อน
จำ: Interrupt ≠ ทำให้ cycle เสีย แต่เพิ่ม step "check interrupt" · Maskable = ปิดได้ · Nonmaskable = ปิดไม่ได้ · 4 class: Program, Timer, I/O, Hardware failure
Chapter 03

Data Representation, ISA & Assembly Language (RISC-V)

สไลด์ 121 หน้า · อ่านราว 45–60 นาที (บทใหญ่สุด) · ส่วน A = การแทนข้อมูล, ส่วน B = RISC-V

แผนที่บท: เลขในเครื่องแทนยังไง (unsigned, signed 3 แบบ, floating point, อักขระ) → คำสั่ง RISC-V (ทำงานกับ register / memory) → การเข้ารหัสเป็น 32 บิต → if/loop/procedure

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

เลข m ฐาน r มี n หลัก
(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)
6 + (−3) บน 3 บิต: 6 = 110, −3 = 100 (1's compl ของ 011)
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) ทุกบิตทางซ้าย
หา 2's complement ของ 0101011: invert = 1010100, +1 = 1010101
6 + (−5) บน 4 บิต: 5 = 0101, −5 = 1011 → 0110 + 1011 = 1 0001 → ทิ้ง (discard) carry ออก → 0001 = 1 ✔

เปรียบเทียบ

Sign & Magnitude1's complement2'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 patternUnsignedBiased-127
0000 00000−127
0000 00011−126
0111 1110126−1
0111 11111270
1000 0000128+1
1111 1111255+128

ค่าจริง = unsigned − 127 (ใช้เป็น exponent ใน floating point)

A5 Floating Point & IEEE 754

N = (−1)s · m · 2e — s = sign, m = mantissa, 2 = radix, e = exponent
Single precisionDouble precision
ขนาด32 bit64 bit
Sign1 bit (bit 31)1 bit (bit 63)
Exponent8 bit (bit 30–23)11 bit (bit 62–52)
Mantissa23 bit (bit 22–0)52 bit (bit 51–0)
N = (−1)s × [1.m] × 2E−127 (single)
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

101.1101₂ เป็นฐาน 10: 4+0+1+0.5+0.25+0+0.0625 = 5.8125
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

17.15 = 10001.0010011… = 1.00010010011… × 24
e = 4 → E = 4 + 127 = 131 = 1000 0011
Sign = 0 · Exponent = 1000 0011 · Mantissa = 0001 0010 0110 0… (เก็บเฉพาะหลัง "1.")
ขั้นตอนมาตรฐาน: ① แปลงเป็นฐาน 2 ② ทำ normalize ให้เป็น 1.xxx × 2e ③ E = e + 127 ④ sign ⑤ mantissa = หลังจุดทศนิยม เติม 0 ให้ครบ 23 บิต

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)
ใบงานที่ 2 (ในสไลด์): งานกลุ่ม 2 คน ใช้เลขฐาน 2 ขนาด 16 บิต แสดงขั้นตอน add และ sub ด้วย 1) sign magnitude 2) two's complement — ส่งใน MyCourse (Sec1 23 ส.ค. 2569, Sec2 25 ส.ค. 2569)

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

Design Principle 1: Simplicity favours regularity — รูปแบบเหมือนกันทุกคำสั่ง ทำให้ implement ง่าย ถูก และเร็ว
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 (เขียนทับไม่ได้)
x1return address (ra)
x2stack pointer (sp)
x3global pointer (gp)
x4thread pointer (tp)
x5–x7, x28–x31temporaries (callee ไม่ต้องเก็บรักษา)
x8 (fp), x9, x18–x27saved registers (ถ้าใช้ callee ต้อง save/restore)
x10–x11function arguments / return values
x12–x17function 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 บังคับ)
C: 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)

funct7rs2rs1funct3rdopcode
7 bit55357
  • opcode ชนิดคำสั่ง · rd register ปลายทาง · funct3 / funct7 opcode เพิ่มเติม · rs1, rs2 register ต้นทาง
add x9, x20, x21 → funct7=0, rs2=21, rs1=20, funct3=0, rd=9, opcode=51
0000000 10101 10100 000 01001 0110011 = 0x015A04B3

I-format (immediate arithmetic & load)

immediate [11:0]rs1funct3rdopcode
12 bit5357
  • immediate เป็น 2's complement และ sign-extended · rs1 = source หรือ base address · ใช้กับ addi, ld ฯลฯ
Design Principle 3: Good design demands good compromises — format หลายแบบทำให้ decode ยากขึ้น แต่ทุกคำสั่งยาว 32 บิตเท่ากัน; พยายามให้ format คล้ายกันที่สุด

S-format (store)

imm[11:5]rs2rs1funct3imm[4:0]opcode
755357
  • rs1 = base address · rs2 = ค่าที่จะเก็บ · immediate = offset ถูก แยกเป็นสองท่อน เพื่อให้ตำแหน่ง rs1/rs2 อยู่ที่เดิมเสมอ

สรุปทุก format (Encoding summary)

Formatใช้กับ
Rคำสั่งเลขคณิต/ตรรกะ register-register
Iimmediate arithmetic, loads
Sstores
SBconditional branch
UJunconditional jump (jal)
Uupper 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 — lb sign-extend, lbu zero-extend

B4 Logical & Shift

OperationCJavaRISC-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, bgeu unsigned
  • ไม่ branch ก็ทำคำสั่งถัดไปตามลำดับ
if (i==j) f = g+h; else f = g-h; (f,g,h,i,j ใน x19–x23)
        bne x22, x23, Else
        add x19, x20, x21
        beq x0, x0, Exit     // unconditional
Else:   sub x19, x20, x21
Exit:   ...
Assembler คำนวณ address ของ label เอง
while (save[i] == k) i += 1; (i ใน x22, k ใน x24, save ใน x25)
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: ...
if (a > b) a += 1; (a ใน x22, b ใน x23)
bge  x23, x22, Exit   // branch if b >= a
addi x22, x22, 1
Exit:

Basic block = ลำดับคำสั่งที่ ไม่มี branch ฝังกลาง (ยกเว้นท้าย) และ ไม่มี branch target (ยกเว้นต้น) — compiler ใช้ optimize, processor ขั้นสูงเร่งได้

Signed vs Unsigned: x22 = 1111…1111, x23 = 0…0001 → signed: x22 < x23 (−1 < +1) → blt taken · unsigned: x22 > x23 (4,294,967,295 > 1) → bltu ไม่ taken

B6 Procedure Calling & Stack

6 ขั้นตอน

  1. วาง parameter ใน x10–x17
  2. โอนการควบคุมไปที่ procedure
  3. จัดสรร storage (stack) ให้ procedure
  4. ทำงานของ procedure
  5. วางผลลัพธ์ใน register ให้ caller
  6. กลับไปจุดที่เรียก (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 (ไม่เรียกฟังก์ชันอื่น)

C: 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 หลังเรียกเสร็จ

fact(n) — 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

ส่วนเก็บ
Textprogram code
Static dataglobal variables (static ใน C, constant arrays/strings) · x3 (gp) ชี้เข้ามาให้ใช้ ±offset
Dynamic data (heap)malloc ใน C, new ใน Java
Stackautomatic 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, lwusb, sh, sw rs2, off(rs1)
strcpy (null-terminated): วนคัดลอกทีละ byte จนเจอ '\0'
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 = 0x003D0000
addi x19, x19, 128 // +0x080 → x19 = 0x003D0080

Branch & 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

  1. Immediate addressing — operand คือค่าคงที่ในคำสั่ง
  2. Register addressing — operand อยู่ใน register
  3. Base (displacement) addressing — register + offset ได้ address memory (byte/halfword/word/doubleword)
  4. 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 linkinglink/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-bit sllw, 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 ที่ใช้บ่อย)
Checklist ก่อนสอบบทนี้: ① แปลง/บวก/ลบ 1's & 2's complement ได้ ② รู้ช่วงค่า −128…+127 ③ IEEE 754 single: E = e+127, 1+8+23 บิต, 17.15 ④ แปล C → RISC-V (if/while/array/procedure) ⑤ จำ R/I/S format และ encode add ได้ ⑥ x0, x1, x2, x5–x7 temp, x10–x17 args ⑦ Little Endian, byte-addressed
Chapter 04

Memory System Organization, Hierarchy, Cache Memory

สไลด์ 112 หน้า · อ่านราว 45–55 นาที · หัวใจของบท: Cache mapping, Miss/Hit, AMAT, Virtual memory (บทที่ข้อสอบคำนวณหนัก)

4.1 Principle of Locality & Memory Hierarchy

โปรแกรมเข้าถึง ส่วนเล็ก ๆ ของ address space ในช่วงเวลาหนึ่ง

Temporal localitySpatial locality
ของที่เพิ่งใช้ มีแนวโน้มถูกใช้ซ้ำเร็ว ๆ
เช่น instruction ใน loop, induction variable
ของที่ อยู่ใกล้ ของที่เพิ่งใช้ มีแนวโน้มถูกใช้ต่อ
เช่น instruction ที่เรียงต่อกัน, ข้อมูล array

Memory hierarchy

  1. เก็บทุกอย่างบน disk
  2. คัดลอกของที่ใช้ล่าสุด (และข้างเคียง) จาก disk → DRAM (main memory) ที่เล็กกว่า
  3. คัดลอกจาก 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
SRAM0.5–2.5 ns$2000–$5000
DRAM50–70 ns$20–$75
Magnetic disk5–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 penaltyBandwidth
1-word-wide DRAM1 + 4×15 + 4×1 = 65 bus cycles16 B / 65 = 0.25 B/cycle
4-word wide memory1 + 15 + 1 = 1716/17 = 0.94 B/cycle
4-bank interleaved1 + 15 + 4×1 = 2016/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
Disk access: sector 512 B, 15,000 rpm, seek เฉลี่ย 4 ms, transfer 100 MB/s, controller 0.2 ms, disk ว่าง
= 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 ที่สุด · คำถาม: ข้อมูลอยู่ในนั้นไหม? ไปหาที่ไหน?

Direct mapped: ตำแหน่งกำหนดจาก address — มีที่ให้ลงที่เดียว
Cache index = (Block address) modulo (#Blocks in cache) · #Blocks เป็นกำลังของ 2 → ใช้ บิตต่ำ ของ address
  • Tag = บิตสูงของ address (เก็บแยกเพื่อรู้ว่า block ใดอยู่ที่ตำแหน่งนั้น)
  • Valid bit: 1 = มีข้อมูล, 0 = ไม่มี (เริ่มต้น 0)
Cache 8 blocks, 1 word/block, direct mapped (word address = tag(2 bit) + index(3 bit))
Word addrBinaryIndexผล
2210 110110Miss
2611 010010Miss
2210 110110Hit
2611 010010Hit
1610 000000Miss
300 011011Miss
1610 000000Hit
1810 010010Miss (แทนที่ 11 010 ซึ่ง tag ต่างกัน)

Address subdivision (block ใหญ่ขึ้น)

Address = Tag | Index | Offset
Offset = log₂(bytes/block) · Index = log₂(#blocks) · Tag = ที่เหลือ
Block address = ⌊Byte address / Bytes per block⌋ · Block number = Block address mod #Blocks
64 blocks, 16 bytes/block — address 1200 ไป block ไหน?
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-throughWrite-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

CPU time = (Program execution cycles + Memory stall cycles) × Clock cycle time
Memory stall cycles = Memory accesses/Program × Miss rate × Miss penalty
   = Instructions/Program × Misses/Instruction × Miss penalty
AMAT = Hit time + Miss rate × Miss penalty
ตัวอย่าง CPI: I-miss 2%, D-miss 4%, miss penalty 100 cycle, base CPI 2, load/store 36%
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 เท่า
ตัวอย่าง AMAT: clock 1 ns, hit time 1 cycle, miss penalty 20 cycle, miss rate 5% → AMAT = 1 + 0.05×20 = 2 ns (= 2 cycle)

สรุป: เมื่อ 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 associativen ตำแหน่งใน set — set = (Block number) mod (#Sets)ค้นทั้ง set พร้อมกัน, n comparators
Fully associativeที่ไหนก็ได้ค้นทุก entry พร้อมกัน, comparator ต่อ entry (แพง)

Associativity เพิ่ม → miss rate ลด แต่ผลตอบแทนลดลงเรื่อย ๆ (diminishing returns) และเพิ่มความซับซ้อน ต้นทุน เวลาเข้าถึง

เปรียบเทียบ cache 4 block ลำดับ block address: 0, 8, 0, 6, 8
แบบผลแต่ละ accessรวม
Direct mappedmiss, miss, miss, miss, miss (0, 8, 6 ... 0 และ 8 ชนกันที่ index 0)5 miss
2-way set assoc.miss, miss, hit, miss, miss4 miss, 1 hit
Fully associativemiss, miss, hit, miss, hit3 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
CPU base CPI = 1, 4 GHz (0.25 ns/cycle), miss rate 2%/instruction, main memory 100 ns
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
MTTF (mean time to failure) = reliability · MTTR (mean time to repair)
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

Hpnความหมาย
evenevenไม่มี error
oddoddsingle-bit error → แก้ได้
evenodderror ที่บิต pn เอง
oddevendouble 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

Virtual memory = ใช้ main memory เป็น "cache" ของ secondary storage (disk) · จัดการร่วมกันโดย CPU hardware + OS · แต่ละโปรแกรมมี private virtual address space และถูกป้องกันจากกัน · CPU/OS แปล virtual → physical address
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 mappedIndex1
n-way set associativeSet index แล้วค้นใน setn
Fully associativeค้นทุก entry#entries
(Virtual memory) Full tableFull lookup table0
  • 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 ครั้งแรก
Capacitycache มีขนาดจำกัด 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

Coherence (ไม่เป็นทางการ): read ต้องคืนค่าที่เขียนล่าสุด
เป็นทางการ: ① 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 ใช้คำสั่งเหล่านั้น
สรุปบท: memory เร็ว = เล็ก, memory ใหญ่ = ช้า → caching ให้ภาพลวงว่าเร็วและใหญ่ ด้วย principle of locality · hierarchy: L1 → L2 → … → DRAM → disk · memory system สำคัญมากต่อ multiprocessor
Checklist ข้อสอบ: ① แบ่ง Tag/Index/Offset จากขนาด cache ② trace hit/miss ของ direct vs n-way vs fully ③ Miss penalty/CPI/AMAT ④ ผลของ write-through/write-back ⑤ 3Cs ⑥ virtual memory: page, page table, TLB, page fault ⑦ MTTF/availability ⑧ Hamming/SEC-DEC
Chapter 05

I/O Systems

สไลด์ 52 หน้า · อ่านราว 25–30 นาที · หัวใจของบท: Programmed I/O vs Interrupt-driven vs DMA, Memory-mapped vs Isolated I/O

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

  1. Control and timing — ประสานการไหลของข้อมูลระหว่างทรัพยากรภายในกับอุปกรณ์ภายนอก
  2. Processor communication — command decoding, data, status reporting, address recognition
  3. Device communication — คำสั่ง สถานะ ข้อมูลกับอุปกรณ์
  4. Data buffering — บัฟเฟอร์เพื่อ ปรับสมดุลความเร็ว ระหว่างอุปกรณ์กับ memory
  5. Error detection — ตรวจและรายงานความผิดพลาดการส่ง

5.2 สามเทคนิคของ I/O

เทคนิคหลักการข้อเสีย/ข้อดี
1. Programmed I/OCPU รัน program ควบคุม I/O โดยตรง; หลังสั่ง command ต้องรอ (polling) จน I/O เสร็จถ้า CPU เร็วกว่า I/O → เปลืองเวลา CPU
2. Interrupt-driven I/OCPU สั่ง I/O แล้ว ทำคำสั่งอื่นต่อ; I/O module interrupt เมื่อเสร็จCPU ไม่ต้องรอ แต่ยังต้องผ่าน CPU ในการถ่ายข้อมูล
3. DMA (Direct Memory Access)I/O module กับ main memory แลกเปลี่ยนข้อมูลกันโดยตรง ไม่ผ่าน processorเหมาะกับข้อมูลปริมาณมาก
ไม่มี Interruptsใช้ Interrupts
I/O → memory ผ่าน processorProgrammed I/OInterrupt-driven I/O
I/O → memory ตรงDMA

I/O Commands (4 ชนิดที่ module รับจาก processor)

  1. Control — activate peripheral และบอกให้ทำอะไร
  2. Test — ตรวจสถานะของ module และอุปกรณ์
  3. Read — ให้ module รับข้อมูลหนึ่งรายการจาก peripheral ไปไว้ใน internal buffer
  4. Write — ให้ module รับข้อมูลจาก data bus แล้วส่งให้ peripheral
การรับ block ข้อมูล 3 เทคนิค: Programmed = CPU loop อ่าน status ซ้ำ ๆ แล้วถ่ายทีละ word · Interrupt = CPU ทำงานอื่น ถูกขัดจังหวะทุก word · DMA = CPU สั่งเริ่มแล้วไปทำอย่างอื่น ถูก interrupt เมื่อเสร็จทั้ง block

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/OIsolated 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

  1. I/O module ส่งสัญญาณ interrupt
  2. CPU ทำคำสั่งปัจจุบันจนเสร็จ
  3. CPU เก็บ PC และ PSW (Status register) ลง stack ก่อน
  4. เริ่มทำงานที่ ISR (Interrupt Service Routine)
  5. เสร็จแล้ว restore PC/PSW กลับไปทำโปรแกรมเดิม

Design issues 2 ข้อ

  1. มี I/O module หลายตัว — CPU รู้ได้อย่างไรว่าอุปกรณ์ไหนเป็นผู้ interrupt?
  2. ถ้ามีหลาย interrupt พร้อมกัน — CPU เลือกทำตัวไหนก่อน?

Device identification — 4 เทคนิค

#เทคนิครายละเอียด
1Multiple interrupt linesตรงไปตรงมาที่สุด แต่มักมีหลาย module ต่อ 1 เส้นอยู่ดี
2Software pollเมื่อ interrupt CPU กระโดดไป ISR ที่ ไล่ถามทีละ module ว่าใครเป็นผู้ขอ — เสียเวลา
3Daisy chain (hardware poll, vectored)interrupt acknowledge line ต่อผ่านทุก module เป็นสายโซ่ · Vector = address ของ I/O module หรือ id เฉพาะ · Vectored interrupt: CPU ใช้ vector เป็น pointer ไปยัง device-service routine โดยตรง ไม่ต้องผ่าน general ISR ก่อน
4Bus 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)

ข้อเสียของ Programmed และ Interrupt-driven I/O: ① อัตราถ่ายโอนถูกจำกัดโดยความเร็วที่ CPU ทดสอบและให้บริการอุปกรณ์ ② CPU ถูกผูกกับการจัดการ I/O ต้องรันหลายคำสั่งต่อการถ่ายโอนหนึ่งครั้ง → ข้อมูลปริมาณมากใช้ DMA

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
เปรียบเทียบสามเทคนิค (จุดที่ข้อสอบชอบ): CPU ว่างระหว่าง I/O? Programmed ✗, Interrupt ✔ (แต่ถูกขัดบ่อย), DMA ✔ · ใครถ่ายข้อมูล? Programmed/Interrupt → CPU, DMA → DMA controller · interrupt ถี่แค่ไหน: Interrupt-driven ทุก word / DMA ครั้งเดียวต่อ block

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 payloadPacket 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 ขั้น)

  1. CPU ควบคุมอุปกรณ์ต่อพ่วงโดยตรง
  2. เพิ่ม controller/I/O module — CPU ใช้ programmed I/O ไม่มี interrupt
  3. เหมือนข้อ 2 แต่ใช้ interrupt — CPU ไม่ต้องรอ I/O เสร็จ ประสิทธิภาพเพิ่ม
  4. I/O module มี DMA เข้าถึง memory ตรง — ย้ายข้อมูลทั้ง block โดย CPU เกี่ยวข้องเฉพาะตอนเริ่มและจบ
  5. I/O module พัฒนาเป็น processor ในตัวเอง มี instruction set เฉพาะ I/O (I/O channel)
  6. I/O module มี local memory เป็นคอมพิวเตอร์ในตัวเอง (I/O processor) — ควบคุมอุปกรณ์จำนวนมากด้วย CPU ยุ่งน้อยที่สุด

ตัวอย่าง: IBM zEC12 I/O Channel Subsystem (I/O frames และโครงสร้างระบบ I/O ของ mainframe)

งานกลุ่ม (Assignment): กลุ่มละ 6–7 คน, 9 กลุ่ม 9 เรื่อง จับฉลาก — ส่งเอกสารสรุป (ชื่อสมาชิก+รหัส) และนำเสนอกลุ่มละ 10–15 นาที ในคาบ 8, 10 ก.ย. 2569 (หัวข้อ = interface 9 ตัวด้านล่าง)

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. ThunderboltIntel ร่วมกับ Apple · 10 Gbps ต่อทิศทาง และจ่ายไฟได้ถึง 10 W · รวม data, video, audio, power ในสายเดียว (HDD, RAID, video-capture box, network interface)
5. InfiniBandI/O spec ตลาด high-end server (ปล่อย v.แรกต้นปี 2001) · IBM zEnterprise พึ่งพามาก · นิยมใน SAN · switch-based fabric ต่อได้ถึง 64,000 อุปกรณ์
6. PCI / PCI Expresshigh-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-Fiwireless Internet หลัก · IEEE 802.11 · รุ่นล่าสุดในสไลด์ 802.11ac (2014) สูงสุด 3.2 Gbps
Checklist: ① 5 หน้าที่ I/O module ② 4 I/O commands ③ 3 เทคนิค I/O เปรียบเทียบ ④ Memory-mapped vs Isolated ⑤ 4 วิธีระบุอุปกรณ์ interrupt (vectored คืออะไร) ⑥ DMA vs DCA ⑦ ตัวเลขความเร็ว USB/Thunderbolt/Ethernet
Chapter 06

Storage Systems (External Memory)

สไลด์ 45 หน้า · อ่านราว 25–30 นาที · หัวใจของบท: Disk performance parameters, RAID 0–6, SSD vs HDD

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 คั่น
Cylindertrack ที่ตำแหน่งเดียวกันของทุก surface/platter (head ทุกตัวอยู่ตำแหน่งเดียวกัน)
Read-write head1 หัวต่อ 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 motionFixed head (1 หัวต่อ track, ติดแขนแข็งที่ครอบทุก track) · Movable head (1 หัวต่อ surface บนแขนที่ยืด/หดได้)
Disk portabilityNon-removable (ติดตายในไดรฟ์ เช่น HDD ใน PC) · Removable (ถอดเปลี่ยนได้ — ข้อมูลไม่จำกัดด้วย disk system จำนวนจำกัด, ย้ายเครื่องได้ เช่น floppy, ZIP)
SidesSingle sided · Double sided (เคลือบทั้งสองด้าน)
PlattersSingle platter · Multiple platter
Head mechanismContact (floppy) · Fixed gap · Aerodynamic gap (Winchester)
Winchester head: หัวยิ่งแคบ ต้องอยู่ใกล้ผิวมาก → track แคบลง ความหนาแน่นข้อมูลสูงขึ้น แต่เสี่ยง error จากสิ่งสกปรก/ความไม่สมบูรณ์ → ใช้ในไดรฟ์ ปิดผนึก แทบไม่มีสิ่งปนเปื้อน · เป็น foil ตามหลักอากาศพลศาสตร์ พักบนผิวจานเบา ๆ ตอนหยุด; แรงอากาศจากการหมุนยกขึ้นเหนือผิวจาน (เรียกว่า "fly")

ตัวอย่างพารามิเตอร์ HDD (Table 6.2)

Seagate EnterpriseBarracuda XTCheetah NSLaptop HDD
งานEnterpriseDesktopNAS, app serversLaptop
ความจุ6 TB3 TB600 GB2 TB
Avg seek4.16 msN/A3.9 (r) / 4.2 (w) ms13 ms
Spindle7200 rpm7200 rpm10,075 rpm5400 rpm
Avg latency4.16 ms4.16 ms2.98 ms5.6 ms
Max transfer216 MB/s149 MB/s97 MB/s300 MB/s
Bytes/sector512/40965125124096
Surfaces/cylinder81084
Cache128 MB64 MB16 MB8 MB

6.3 Disk Performance Parameters

ดิสก์หมุนด้วยความเร็วคงที่; ก่อนอ่าน/เขียน head ต้องไปที่ track ที่ต้องการ แล้วรอให้ sector หมุนมาตรงหัว

Seek time (Ts) = เวลาเคลื่อน head ไปยัง track (movable-head)
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)
ตัวอย่าง (จาก Ch04): 7200 rpm → 1 รอบ = 60/7200 = 8.33 ms → latency เฉลี่ย ½ รอบ = 4.16 ms (ตรงกับตาราง Seagate)
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 คุณสมบัติร่วม:

  1. ชุด physical disk หลายตัว OS มองเป็น logical drive เดียว
  2. ข้อมูลถูกกระจายข้าม disk ใน array ด้วย striping
  3. ใช้ความจุส่วนเกินเก็บ parity เพื่อ กู้ข้อมูล เมื่อ disk เสีย

เกี่ยวกับ RAID 0 ไม่มีการเก็บ redundancy (จริง ๆ ไม่ครบเงื่อนไขข้อ 3)

ตารางสรุป RAID levels (N = จำนวน data disks)

Levelชื่อ / CategoryDisks ที่ต้องใช้Data availabilityLarge I/O transferSmall I/O request rate
0Nonredundant (Striping)Nต่ำกว่า disk เดี่ยวสูงมาก (read และ write)สูงมาก (read/write)
1Mirrored (Mirroring)2Nสูงกว่า RAID 2,3,4,5; ต่ำกว่า RAID 6read สูงกว่า single; write เท่า singleread ได้ถึง 2× ของ single; write เท่า single
2Redundant via Hamming code (Parallel access)N + m (m ∝ log N)สูงกว่า single มากสูงที่สุดในกลุ่ม~2× single
3Bit-interleaved parity (Parallel access)N + 1สูงกว่า single มากสูงที่สุดในกลุ่ม~2× single
4Block-interleaved parity (Independent access)N + 1สูงกว่า single มากread ≈ RAID 0; write ต่ำกว่า single อย่างมากread ≈ RAID 0; write ต่ำกว่า single มาก
5Block-interleaved distributed parityN + 1สูงกว่า single มากread ≈ RAID 0; write ต่ำกว่า singleread ≈ RAID 0; write โดยทั่วไปต่ำกว่า single
6Block-interleaved dual distributed parityN + 2สูงที่สุดread ≈ RAID 0; write ต่ำกว่า RAID 5read ≈ 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 1Mirroring — เขียนข้อมูลชุดเดียวกันซ้ำลง disk สองตัว (แต่ละ logical strip map ไป 2 physical disk)read ใช้ disk ตัวใดก็ได้ · ไม่มี write penalty · กู้คืนง่าย (ไปอ่านอีกตัว) · สำเนา real-time · request rate สูงถ้าเป็น read ส่วนใหญ่ · ข้อเสียหลัก ราคา (ใช้ 2× disk)
RAID 2Bit-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 3Byte(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 4Block-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 ต่าง diskavailability สูงมาก — ต้อง disk 3 ตัวเสียในช่วง MTTR ข้อมูลจึงหาย · write penalty มาก (แต่ละ write กระทบ 2 parity block) · ต้องใช้ N + 2 disks
จำเปรียบเทียบ: RAID 0 = เร็วไม่ปลอดภัย · 1 = สำเนา (ปลอดภัย แพง 2N) · 3 = parity disk เดียว byte-level parallel · 4 = block-level + parity disk เดียว (คอขวด) · 5 = distributed parity · 6 = dual parity (N+2, ทน 2 disk เสีย)
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 speed200–550 Mbps50–120 Mbps
Power drawเฉลี่ย 2–3 W → battery ยืดได้ 30+ นาทีเฉลี่ย 6–7 W
ความจุnotebook ≤ 512 GB; desktop สูงสุด 1 TBnotebook ~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 ไม่เจอ)

  1. ช้าลงเมื่อใช้งานนาน: การเขียนต้อง ① อ่านทั้ง block จาก flash ไปไว้ใน RAM buffer ② erase ทั้ง block ③ เขียนทั้ง block จาก buffer กลับ flash
  2. Flash เสื่อมใช้งานไม่ได้หลังจำนวนครั้งการเขียนจำกัด

วิธียืดอายุ: ใส่ cache หน้า flash เพื่อหน่วงและรวมการเขียน · wear-leveling กระจายการเขียนให้ทั่ว block · bad-block management · flash ส่วนใหญ่ประเมินอายุที่เหลือเองเพื่อให้ระบบเตรียมรับ

6.6 Optical Memory

ชนิดความหมาย / ความจุ
CDCompact Disk — เก็บเสียงดิจิทัล แบบ nonerasable · 12 cm · เล่นต่อเนื่อง >60 นาที
CD-ROMRead-Only — เก็บข้อมูลคอมพิวเตอร์ ≥ 650 MB (ตาม Fig = 682 MB)
CD-RRecordable — เขียนได้ ครั้งเดียว (WORM)
CD-RWRewritable — ลบ/เขียนซ้ำได้หลายครั้ง
DVDDigital 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

CDDVDBlu-ray
Laser wavelength780 nm650 nm405 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-1LTO-2LTO-3LTO-4LTO-5LTO-6LTO-7LTO-8
ปีออก20002003200520072010TBA
ความจุ (compressed)200 GB400 GB800 GB1.6 TB3.2 TB8 TB16 TB32 TB
Transfer rate40 MB/s801602402805257881.18 GB/s
Tracks3845127048961280———
WORMNoNoYesYesYesYesYesYes
EncryptionNoNoNoYesYesYesYesYes
PartitioningNoNoNoNoYesYesYesYes

รุ่นแรก ๆ: tape length 609→846 m, กว้าง 1.27 cm, write elements 8→16, linear density 4,880→15,142 bits/mm (LTO-1→5)

Checklist ก่อนสอบ: ① ศัพท์ disk: platter/track/sector/cylinder ② Seek / Rotational latency (ครึ่งรอบ) / Transfer — เขียนสูตรรวมได้ ③ RAID 0–6 ต่างกันอย่างไร (N+? disk, ความทนทาน, write penalty) ④ SSD vs HDD และปัญหา erase block / wear-leveling ⑤ CD/DVD/Blu-ray ต่างกันที่ wavelength ⑥ tape = serial/serpentine
Chapter 07

Computing Unit — Pipelining

สไลด์ 53 หน้า · อ่านราว 30 นาที · หัวใจของบท: 5-stage pipeline, 3 hazards, forwarding, load-use stall, branch prediction

7.1 Pipelining Overview

Pipelining Analogy (ซักผ้า): ซักผ้า 4 ชุด ถ้าทำทีละชุดต่อเนื่องจบ ใช้ 8 ชั่วโมง; ถ้า ซ้อนการทำงาน (overlap) ใช้ 3.5 ชั่วโมง → Speedup = 8/3.5 ≈ 2.3
กรณี 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
The BIG Picture: pipelining เพิ่ม performance โดยเพิ่ม instruction throughput (ทำหลายคำสั่งขนานกัน) · แต่ latency ของแต่ละ instruction เท่าเดิม · ติดข้อจำกัดเรื่อง hazards (structure, data, control) · การออกแบบ ISA มีผลต่อความซับซ้อนของ pipeline

7.2 Pipeline Performance

สมมติเวลา: register read/write = 100 ps, stage อื่น = 200 ps → เปรียบเทียบ pipelined กับ single-cycle datapath

InstrInstr fetchRegister readALU opMemory accessRegister writeTotal
ld200100200200100800 ps
sd200100200200—700 ps
R-format200100200—100600 ps
beq200100200——500 ps
Single-cycle: clock period Tc = 800 ps (ตาม instruction ที่ช้าที่สุด)
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
ข้อสังเกต: ในสไลด์ speedup ที่ได้จริงน้อยกว่าจำนวน stage เพราะ stage ไม่สมดุล (register 100 ps vs อื่น 200 ps) และมี pipeline fill/drain

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, x1
sub x2, x19, x3   ← ต้องใช้ x19 ที่ add ยังไม่เขียนกลับ

Forwarding (bypassing) = นำผลมาใช้ ทันทีที่คำนวณได้ ไม่ต้องรอเขียนลง register · ต้องเพิ่มการเชื่อมต่อใน datapath

Load-use data hazard: forwarding แก้ได้ไม่เสมอ — ถ้าค่ายังไม่ถูกคำนวณตอนต้องใช้ ("ส่งย้อนเวลาไม่ได้!") ต้อง stall 1 cycle

Code scheduling เพื่อเลี่ยง stall

C: 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, x3
and x12, x2, x5
or x13, x6, x2
add x14, x2, x2
sd 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 hazardforward จาก
1a. EX/MEM.RegisterRd = ID/EX.RegisterRs1
1b. EX/MEM.RegisterRd = ID/EX.RegisterRs2
EX/MEM pipeline register
2a. MEM/WB.RegisterRd = ID/EX.RegisterRs1
2b. MEM/WB.RegisterRd = ID/EX.RegisterRs2
MEM/WB pipeline register

แต่ เฉพาะเมื่อ instruction ที่ forward เขียน register จริง (EX/MEM.RegWrite, MEM/WB.RegWrite) และ Rd ≠ x0 (RegisterRd ≠ 0)

Mux controlSourceความหมาย
ForwardA = 00ID/EXoperand แรกของ ALU มาจาก register file
ForwardA = 10EX/MEMoperand แรก forward จากผล ALU ก่อนหน้า
ForwardA = 01MEM/WBoperand แรก 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

  1. บังคับค่าควบคุมใน ID/EX register เป็น 0 → EX, MEM, WB ทำ nop (no-operation)
  2. ห้ามอัปเดต PC และ IF/ID register → คำสั่งที่ใช้ค่าถูก decode ซ้ำ และคำสั่งถัดไปถูก fetch ซ้ำ
  3. stall 1 cycle ให้ MEM อ่านข้อมูลของ ld ได้ แล้วจึง forward เข้า EX ได้
Stalls ลด performance แต่จำเป็นเพื่อ ผลลัพธ์ถูกต้อง · compiler จัดโค้ดเลี่ยง hazard/stall ได้ — ต้องรู้โครงสร้าง pipeline

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
Branch taken: 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 predictionDynamic branch prediction
ตามพฤติกรรม branch ทั่วไป (loop และ if-statement) — backward branch → predict taken, forward branch → predict not takenHardware วัดพฤติกรรมจริง เช่น บันทึกประวัติล่าสุดของแต่ละ branch แล้วสมมติว่าแนวโน้มจะต่อไป · ถ้าผิด → stall ระหว่าง re-fetch และอัปเดตประวัติ
Checklist สอบ: ① ชื่อและหน้าที่ 5 stages ② Tc single-cycle 800 vs pipelined 200 และ speedup ③ 3 hazards + วิธีแก้ ④ เงื่อนไขตรวจ forwarding (EX/MEM, MEM/WB, x0, RegWrite) ⑤ load-use ต้อง stall 1 cycle ⑥ สลับลำดับโค้ด 13 → 11 cycles ⑦ static vs dynamic prediction ⑧ pipelining เพิ่ม throughput ไม่ลด latency
Chapter 08

Parallel Processors from Client to Cloud

สไลด์ 41 หน้า · อ่านราว 25 นาที · หัวใจของบท: Flynn (SISD/SIMD/MIMD), Multithreading, SMP/UMA/NUMA, GPU, Cluster, Network topology

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 softwareConcurrent 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)

Parallel software คือปัญหา: ต้องได้ performance ที่ดีขึ้นอย่างมีนัยสำคัญ ไม่งั้นใช้ uniprocessor ที่เร็วกว่าง่ายกว่า · ความยาก 3 ข้อ: Partitioning (แบ่งงาน) · Coordination (ประสานงาน) · Communications overhead

8.2 SISD, SIMD, MIMD, SPMD และ Vector

Data stream: SingleData stream: Multiple
Instruction stream: SingleSISD — เช่น Intel Pentium 4SIMD — เช่น SSE instructions ของ x86
Instruction stream: MultipleMISD — ปัจจุบันไม่มีตัวอย่าง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.v load/store vector · fadd.d.v บวก vector double · fadd.d.vs บวก scalar เข้าทุก element · fmul.d.vs คูณ vector กับ scalar
  • ลด instruction-fetch bandwidth ได้มาก
DAXPY: Y = a × X + Y (double-precision A·X Plus Y — จาก BLAS library; x ใน x19, y ใน x20)
// 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 instructionsMultimedia 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 อยู่ใกล้ไกล)
Sum reduction: รวม 64,000 ตัวเลขบน 64 processor แบบ UMA (Pn = 0–63)
① แบ่ง ตัวเลข 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)
NVIDIA Fermi: หลาย SIMD processor · แต่ละตัวมี 16 SIMD lanes · SIMD instruction ทำงานกับ thread กว้าง 32 element (schedule แบบ dynamic บน 16-wide ผ่าน 2 cycle) · register 32K × 32 bit กระจายข้าม lane · 64 registers ต่อ thread context

Classifying GPUs

ไม่เข้าโมเดล SIMD/MIMD เป๊ะ: conditional execution ใน thread ให้ภาพลวง MIMD แต่ performance ตก ต้องเขียนโค้ด general-purpose อย่างระวัง

Static (discovered at compile time)Dynamic (discovered at runtime)
Instruction-Level ParallelismVLIWSuperscalar
Data-Level ParallelismSIMD or VectorTesla Multiprocessor (GPU)

เปรียบเทียบ Multicore with SIMD vs GPU

FeatureMulticore with SIMDGPU
SIMD processors4–88–16
SIMD lanes/processor2–48–16
Multithreading HW support (SIMD threads)2–416–32
Single : double-precision ratio2:12:1
Largest cache8 MB0.75 MB
Memory address size64-bit64-bit
Main memory8–256 GB4–6 GB
Page-level memory protectionYesYes
Demand pagingYesNo
Integrated scalar/SIMD processorYesNo
Cache coherentYesNo

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คืออะไร
Linpackmatrix linear algebra
SPECrateรัน SPEC CPU programs แบบขนาน — job-level parallelism
SPLASHStanford Parallel Applications for Shared Memory — kernels + applications, strong scaling
NASNASA Advanced Supercomputing — kernels ด้าน computational fluid dynamics
PARSECPrinceton 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)
สรุปบท: เป้าหมาย performance สูงด้วยหลาย processor · ความยาก: พัฒนา parallel software และออกแบบ architecture ที่เหมาะ · SaaS มีความสำคัญเพิ่มขึ้นและ cluster เหมาะกัน · performance per dollar และ performance per Joule ขับเคลื่อนทั้ง mobile และ WSC (warehouse-scale computers)
Checklist สอบ: ① ตาราง Flynn 4 ช่อง + ตัวอย่าง ② Vector vs SIMD vs MIMD vs SPMD ③ Fine / Coarse / SMT ④ SMP: UMA vs NUMA, sum reduction ⑤ GPU vs multicore ตาราง ⑥ Cluster vs Grid ⑦ topology 5 แบบ + bisection bandwidth ⑧ arithmetic intensity