Skip to content

Pipeline

Kỹ thuật chồng lấp việc thực thi nhiều lệnh bằng cách chia mỗi lệnh thành các giai đoạn (fetch, decode, execute, memory, write-back).

Bản ôn tập

Trang này là bản ôn tập ngắn gọn, sẽ mở rộng sau (ví dụ tách riêng superscalar/out-of-order).

1. Ý tưởng cơ bản

Giống dây chuyền lắp ráp: thay vì làm xong hoàn toàn một lệnh rồi mới bắt đầu lệnh sau, CPU chia lệnh thành các giai đoạn và cho mỗi giai đoạn xử lý một lệnh khác nhau trong cùng một chu kỳ.

So sánh thực thi tuần tự và pipeline

  • Pipeline tăng throughput (số lệnh hoàn thành mỗi đơn vị thời gian), không giảm latency của từng lệnh.
  • Với pipeline k giai đoạn cân bằng và không có hazard: CPI → 1, speedup lý tưởng ≈ k.
  • Thực tế speedup thấp hơn vì hazard (mục 3) và vì các giai đoạn không đều nhau (chu kỳ clock bị giới hạn bởi giai đoạn chậm nhất).

2. Pipeline cổ điển 5 giai đoạn

Giai đoạn Viết tắt Làm gì Tài nguyên chính
Instruction Fetch IF Đọc lệnh tại PC, tính PC + 4 PC, I-cache
Instruction Decode ID Giải mã, đọc thanh ghi nguồn Register file
Execute EX Tính toán, tính địa chỉ, so sánh nhánh ALU
Memory MEM Đọc/ghi bộ nhớ (chỉ lw/sw) D-cache
Write-back WB Ghi kết quả vào thanh ghi đích Register file

Pipeline 5 giai đoạn và các thanh ghi pipeline

  • Thanh ghi pipeline (IF/ID, ID/EX, EX/MEM, MEM/WB) giữ toàn bộ trạng thái của lệnh khi chuyển sang giai đoạn kế tiếp, nhờ đó mỗi giai đoạn xử lý một lệnh độc lập.
  • Có ba đường quay ngược: ghi thanh ghi (WB → ID), nạp PC mới khi rẽ nhánh (EX → IF) và forwarding (MEM/WB, EX/MEM → EX).
  • Trên RISC-V, lệnh có độ dài đều và chỉ load/store truy cập bộ nhớ nên rất hợp với pipeline này (xem RISC-V).

3. Hazard

Hazard là tình huống khiến lệnh kế tiếp không thể chạy ngay ở chu kỳ tiếp theo.

Loại Nguyên nhân Ví dụ Cách xử lý
Structural Hai lệnh cần cùng một tài nguyên trong cùng chu kỳ IF và MEM cùng truy cập một bộ nhớ duy nhất Tách I-cache / D-cache, thêm cổng đọc/ghi
Data Lệnh sau cần kết quả của lệnh trước chưa có RAW: add x1,... rồi sub x4, x1,... Forwarding, stall
Control Chưa biết lệnh kế là lệnh nào khi gặp nhánh beq, jal, jalr Branch prediction, flush

Về data hazard, ba dạng là RAW (đọc sau ghi), WAR và WAW. Trong pipeline in-order 5 giai đoạn chỉ RAW gây vấn đề; WAR và WAW xuất hiện khi thực thi out-of-order (mục 5).

Data hazard: forwarding và stall

  • Stall (bubble): chèn chu kỳ trống cho đến khi kết quả sẵn sàng. Không có forwarding, lệnh sau phải chờ lệnh trước ghi xong ở WB, tốn thêm 2 chu kỳ.
  • Forwarding (bypassing): đưa kết quả từ đầu ra EX hoặc MEM thẳng về đầu vào EX, không cần đợi WB.
  • Load-use: kết quả của lw chỉ có sau MEM nên dù có forwarding vẫn phải stall 1 chu kỳ. Compiler thường xếp lại lệnh để lấp chỗ trống này.

RAW được forwarding và load-use hazard

Control hazard

Nhánh được quyết định ở EX nên khi đó pipeline đã nạp thêm 2 lệnh phía sau. Nếu nhánh được thực hiện, 2 lệnh này bị hủy (flush) và lệnh đích mới được nạp: tốn 2 chu kỳ (branch penalty).

Control hazard và branch penalty

4. Branch prediction

Pipeline càng sâu thì branch penalty càng lớn, nên CPU đoán trước hướng của nhánh và nạp lệnh theo dự đoán. Đoán sai thì flush, đoán đúng thì không mất chu kỳ nào.

Loại Cách hoạt động Ghi chú
Static Quy tắc cố định: luôn not-taken, hoặc nhánh lùi (vòng lặp) taken, nhánh tiến not-taken Không cần phần cứng lưu lịch sử
Dynamic 1-bit Nhớ kết quả lần trước của nhánh Đoán sai 2 lần mỗi vòng lặp (lúc thoát và lúc vào lại)
Dynamic 2-bit Bộ đếm bão hòa 4 trạng thái, đoán sai 2 lần liên tiếp mới đổi dự đoán Phổ biến, xử lý vòng lặp tốt

Bộ đếm bão hòa 2 bit

  • Bảng bộ đếm được đánh chỉ mục bằng một phần địa chỉ lệnh nhánh (PC).
  • BTB (Branch Target Buffer) lưu địa chỉ đích để biết nạp lệnh ở đâu ngay từ giai đoạn IF, không cần đợi giải mã.
  • CPU hiện đại dùng predictor phức tạp hơn (dùng lịch sử toàn cục, TAGE, perceptron), vượt phạm vi bản ôn tập này.

5. Superscalar và out-of-order

Superscalar

Superscalar nhân đôi (hoặc hơn) số đường xử lý để issue nhiều lệnh mỗi chu kỳ. Chỉ số hiệu năng chuyển từ CPI sang IPC (instructions per cycle) và IPC có thể lớn hơn 1.

Pipeline đơn và superscalar 2-way

In-order và out-of-order

Pipeline in-order phải dừng cả hàng khi một lệnh bị stall (ví dụ cache miss). Out-of-order (OoO) cho phép các lệnh phía sau, nếu không phụ thuộc, chạy trước trong lúc lệnh bị chặn đang chờ.

Luồng out-of-order

Thành phần Vai trò
Register renaming Ánh xạ thanh ghi kiến trúc sang thanh ghi vật lý để loại bỏ hazard WAR/WAW
Issue queue Giữ lệnh đã giải mã, phát lệnh nào có đủ toán hạng cho đơn vị thực thi
ROB (Reorder Buffer) Giữ kết quả tạm thời, bảo đảm lệnh commit theo đúng thứ tự chương trình

Nhờ commit theo thứ tự, ngoại lệ và đoán nhánh sai vẫn được xử lý đúng (hủy các lệnh chưa commit). Với phần mềm, CPU trông như vẫn chạy tuần tự.

6. Tóm tắt

Khái niệm Vấn đề nó giải quyết
Pipeline Tăng throughput bằng cách chồng lấp các lệnh
Forwarding / stall Data hazard (RAW)
Tách I-cache / D-cache Structural hazard
Branch prediction Control hazard, branch penalty
Superscalar Đạt IPC > 1
Out-of-order + renaming + ROB Tận dụng thời gian chờ, giữ đúng thứ tự commit

Liên quan

  • Cache và Memory Hierarchy: nguồn chính của stall ở giai đoạn IF và MEM.
  • RISC-V: ISA đơn giản, thuận lợi cho pipeline.
  • RTL / HDL: hiện thực pipeline ở mức RTL.