Pipelining & Hazards
เทคนิค Pipelining และปัญหาที่เกิดขึ้น
Pipelining & Hazards (สรุปด่วน)
1. Pipelining
คือเทคนิคที่ทำให้ CPU สามารถทำงานหลายคำสั่งพร้อมกันได้ (Instruction-Level Parallelism) โดยเปรียบเทียบเหมือน "สายพานในโรงงาน"
- แบบเดิม (Non-Pipelined): ต้องรอให้คำสั่งที่ 1 ทำครบ 4 ขั้นตอน (Fetch, Decode, Execute, Store) ถึงจะเริ่มคำสั่งที่ 2 ได้
- แบบ Pipelined: ขณะที่คำสั่งที่ 1 กำลัง Execute คำสั่งที่ 2 สามารถทำ Decode และคำสั่งที่ 3 สามารถทำ Fetch ได้พร้อมกันใน Clock Cycle เดียวกัน ทำให้ Throughput เพิ่มขึ้นมหาศาล
2. Pipeline Hazards (ปัญหาที่ทำให้สายพานสะดุด)
เมื่อคำสั่งทำงานซ้อนทับกัน อาจเกิดปัญหาที่ทำให้ Pipeline ต้องหยุดรอ (Stall / Bubble)
- Structural Hazard: Resource ไม่พอ (เช่น พยายามใช้ Memory ตัวเดียวกันในการอ่าน Instruction และอ่าน Data พร้อมกัน)
- วิธีแก้: แยก Cache เป็น Instruction Cache และ Data Cache
- Data Hazard: คำสั่งที่ 2 ต้องใช้ผลลัพธ์จากคำสั่งที่ 1 แต่คำสั่งที่ 1 ยังประมวลผลไม่เสร็จ
- วิธีแก้: ใช้เทคนิค Data Forwarding (ส่งผลลัพธ์ตรงจากวงจร ALU ข้ามกลับมาให้เลยโดยไม่ต้องรอเขียนลง Register)
- Control Hazard (Branch Hazard): เกิดจากการเจอคำสั่ง
if-elseหรือjumpทำให้ CPU ไม่รู้ว่าคำสั่งถัดไปที่ต้อง Fetch คือเส้นทางไหน- วิธีแก้: ใช้เทคนิค Branch Prediction (เดาทางล่วงหน้า ถ้าเดาผิดค่อย Flush Pipeline ทิ้ง)