Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 12: Khắc phục hazard
Truyền tiếp dữ liệu
Lấy kết quả từ điểm sớm nhất mà kết quả hiện hữu trong bất
kỳ thanh ghi trạng thái đường ống nào và truyền tiếp kết quả
đến các đơn vị chức năng (e.g.ALU) cần kết quả của chu kỳ đó.
Đối với đơn vị chức năng ALU: các đầu vào có thể đến từ bất
kỳ thanh ghi đường ống nào thay vì chỉ đến từ ID/EX thông qua
việc thêm vào các mạch ghép kênh ở các ngõ vào của ALU.
việc kết nối dữ liệu ghi Rd trong EX/MEM hoặc MEM/WB đến
một trong hai hoặc cả hai ngõ vào mạch ghép kênh (mux) Rt
và Rs của ALU của tầng EX.
việc thêm vào “phần cứng điều khiển” để điều khiển các
mux mới.
Các đơn vị chức năng khác có thể cần mạch logic truyền tiếp
tương tự (e.g., DM).
Với việc truyền tiếp, ta có thể đạt được CPI bằng 1 ngay cả khi
có sự hiện diện của những phụ thuộc dữ liệu
Lấy kết quả từ điểm sớm nhất mà kết quả hiện hữu trong bất
kỳ thanh ghi trạng thái đường ống nào và truyền tiếp kết quả
đến các đơn vị chức năng (e.g.ALU) cần kết quả của chu kỳ đó.
Đối với đơn vị chức năng ALU: các đầu vào có thể đến từ bất
kỳ thanh ghi đường ống nào thay vì chỉ đến từ ID/EX thông qua
việc thêm vào các mạch ghép kênh ở các ngõ vào của ALU.
việc kết nối dữ liệu ghi Rd trong EX/MEM hoặc MEM/WB đến
một trong hai hoặc cả hai ngõ vào mạch ghép kênh (mux) Rt
và Rs của ALU của tầng EX.
việc thêm vào “phần cứng điều khiển” để điều khiển các
mux mới.
Các đơn vị chức năng khác có thể cần mạch logic truyền tiếp
tương tự (e.g., DM).
Với việc truyền tiếp, ta có thể đạt được CPI bằng 1 ngay cả khi
có sự hiện diện của những phụ thuộc dữ liệu
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 12: Khắc phục hazard", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_vi_xu_ly_nang_cao_phan_1_thiet_ke_cpu_risc_bai_12.pdf
- Lec12.ppt
Nội dung text: Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 12: Khắc phục hazard
- Bài giảng “Vi xử lý nâng cao” Phần 1: Thiết kế CPU RISC Bài 12: Khắc phục hazard 1
- Nhắc lại : Các đường dữ liệu và điều khiển của MIPS có đường ống Mỗi thanh ghi đường ống dài bao nhiêu bit ? PC – 32 bit IF/ID – 64 bit ID/EX – 9 + 32x4 + 10 = 147 bit EX/MEM – 5 + 1 + 32x3 + 5 = 107 bit MEM/WB – 2 + 32x2 + 5 = 71 bit 3
- Nhắc lại : Phương pháp sửa chữa hazard dữ liệu Sửa chữa ALU hazard dữ liệu I add $1 , IM Reg DM Reg n bằng cách chờ s – stall – nhưng t stall ảnh hưởng r. đến CPI O stall r d ALU e sub $4, $1 ,$5 IM Reg DM Reg r ALU and $6,$7, $1 IM Reg DM Reg 5
- Nhắc lại : Phương pháp khác sửa chữa hazard Lưu ý rằng cho đến lúc này, ta đang trình bày dữ liệu được truyền tiếp từ ALU xuất ra. Sau khi xem xét vấn đề này tỉ mỉ hơn, ta sẽ thấy rằng dữ liệu thực sự được cung cấp bởi thanh ghi EX/MEM của đường ống và sẽ mô tả dữ liệu theo đúng nghĩa của dữ liệu này. 7
- Các điều kiện điều khiển truyền tiếp dữ liệu 1. EX/MEM hazard: Truyền tiếp if (EX/MEM.RegWrite kết quả từ and (EX/MEM.RegisterRd != 0) lệnh trước đó and (EX/MEM.RegisterRd = ID/EX.RegisterRs)) đến một ForwardA = 10 if (EX/MEM.RegWrite trong hai ngõ and (EX/MEM.RegisterRd != 0) vào của ALU and (EX/MEM.RegisterRd = ID/EX.RegisterRt)) ForwardB = 10 2. MEM/WB hazard: if (MEM/WB.RegWrite Truyền tiếp and (MEM/WB.RegisterRd != 0) and (MEM/WB.RegisterRd = ID/EX.RegisterRs)) kết quả từ ForwardA = 01 lệnh thứ hai if (MEM/WB.RegWrite trước đó đến and (MEM/WB.RegisterRd != 0) một trong hai and (MEM/WB.RegisterRd = ID/EX.RegisterRt)) ngõ vào của ForwardB = 01 ALU 9
- Rắc rối khác nữa! Hazard dữ liệu tiềm tàng khác có thể xảy ra khi có xung đột giữa kết quả của lệnh tầng WB và lệnh tầng MEM – kết quả nào được truyền tiếp ? I ALU add $1 ,$1,$2 IM Reg DM Reg n s t r. ALU add $1 ,$1 ,$3 IM Reg DM Reg O r ALU d add $1, $1 ,$4 IM Reg DM Reg e r 11
- Đường dữ liệu với phần cứng truyền tiếp PCSrc ID/EX EX/MEM Control IF/ID Add Branch MEM/WB Add 4 Shift left 2 Instruction Read Addr 1 Register Read Data Memory Read Addr 2 Data 1 Memory Read File Read PC Address Address Write Addr ALU Read Data Data 2 Write Data Write Data ALU 16Sign 32 cntrl Extend EX/MEM.RegisterRd ID/EX.RegisterRt Forward MEM/WB.RegisterRd ID/EX.RegisterRs Unit 13
- Sao chép bộ nhớ-bộ nhớ Điều gì xảy ra nếu lệnh lw được thay thế bằng lệnh add $1, - việc truyền tiếp vẫn còn được cần đến? Từ đâu, đến đâu? Điều gì xảy ra nếu $1 đã được sử dụng để tính địa chỉ hiệu dụng (effective address) ( đây là hazard dữ liệu load-use và yêu cầu việc chèn một stall giữa lw và sw)? 15
- Đơn vị phát hiện hazard load-use Cần đơn vị phát hiện hazard trong tầng ID chèn một stall giữa việc nạp và việc sử dụng. 2. ID Hazard Detection if (ID/EX.MemRead and ((ID/EX.RegisterRt = IF/ID.RegisterRs) or (ID/EX.RegisterRt = IF/ID.RegisterRt))) stall the pipeline Dòng đầu tiên kiểm tra xem có phải lúc này lệnh trong tầng EX là lw ; hai dòng tiếp theo kiểm tra xem có phải thanh ghi đích của lệnh lw tương thích với một trong hai thanh ghi nguồn của lệnh ở trong tầng ID (lệnh load-use ). Sau stall một chu kỳ này , mạch logic truyền tiếp có thể xử lý các hazard dữ liệu còn lại. 17
- Thêm vào phần cứng hazard PCSrc ID/EX.MemRead Hazard ID/EX Unit EX/MEM 0 IF/ID 1 Control 0 Add Branch MEM/WB Add 4 Shift left 2 Instruction Read Addr 1 Register Read Data Memory Read Addr 2 Data 1 Memory Read File Read PC Address Address Write Addr ALU Read Data Data 2 Write Data Write Data ALU 16Sign 32 cntrl Extend Forward Unit ID/EX.RegisterRt 19
- Các hazard điều khiển Khi luồng các địa chỉ lệnh không liên tục (i.e., PC = PC + 4); phải gánh chịu do sự thay đổi các lệnh của luồng. Các rẽ nhánh có điều kiện (beq , bne ). Các rẽ nhánh không điều kiện (j, jal, jr ). Các ngoại lệ. Các tiếp cận khả thi Stall ( ảnh hưởng đến CPI). Di chuyển sớm điểm quyết định trong đường ống như có thể, bằng cách này làm giảm số chu kỳ stall. Quyết định trì hoãn (yêu cầu sự hỗ trợ của trình dịch). Dự đoán và hy vọng điều tốt nhất ! Các hazard điều khiển xảy ra ít thường xuyên hơn so với các hazard dữ liệu , nhưng không có gì hiệu quả đối phó với hazard điều khiển giống như việc truyền tiếp đối với hazard dữ liệu. 21
- Các lệnh nhảy phải chịu một stall Các lệnh nhảy không được giải mã cho đến ID, do vậy một flush được cần đến. ALU Sửa chữa j IM Reg DM Reg I hazard n nhảy bằng s ALU cách chờ – t flush IM Reg DM Reg r. stall – nhưng ALU ảnh hưởng O j target IM Reg DM Reg đến CPI r d e r May mắn thay , các lệnh nhảy hiếm khi thường xuyên – chỉ 3% của hỗn hợp lệnh SPECint. 23
- Hai loại stall Lệnh noop (or bubble) được chèn giữa hai lệnh trong đường ống (như được thực hiện đối với các tình huống load-use). Giữ cho các lệnh sớm (trước ) trong đường ống (trễ [sau] trong chương trình ) không cho phát triển xuống đường ống trong một chu kỳ (“loại bỏ” chúng đúng vị trí bằng các tín hiệu điều khiển ghi ). Chèn noop bằng cách cho bằng 0 các bit điều khiển trong thanh ghi đường ống ở tầng thích hợp. Cho các lệnh trễ (sau) trong đường ống (sớm [trước] trong chương trình) phát triển xuống đường ống bình thường. Các flush (hay sự gạt bỏ lệnh) là một lệnh trong đường ống được thay thế bằng lệnh noop (như được thực hiện đối với các lệnh được đặt liên tiếp sau các lệnh j). Cho bằng 0 các bit điều khiển đối với lệnh bị flush. 25
- Nhắc lại : Rẽ nhánh gánh chịu 3 stall “Giải pháp” khác là đưa vào phần cứng vừa đủ sao cho ta có thể kiểm tra các thanh ghi, tính địa chỉ rẽ nhánh và cập nhật PC trong thời gian tầng thứ hai của đường ống. Điều này sẽ làm giảm số stall chỉ còn 1. Tiếp cận thứ ba là dự đoán để xử lý các rẽ nhánh, e.g., luôn luôn dự đoán rằng các rẽ nhánh sẽ không được thực hiện. Khi đúng, đường ống tiếp tục ở tốc độ đầy đủ. Khi sai, phải stall (và đảm bảo không có điều gì hoàn tất – thay đổi trạng thái máy không được thực hiện). Ta sẽ đề cập đến những tùy chọn này một cách chi tiết trong bài kế tiếp. 27
- Di chuyển các quyết định rẽ nhánh sớm hơn trong đường ống Muốn một penalty rẽ nhánh nhỏ. Cần thêm phần cứng truyền tiếp và phát hiện hazard cho tùy chọn thứ hai (thực hiện một stall ) do rẽ nhánh phụ thuộc vào kết quả vẫn còn trong đường ống (đó là một trong các toán hạng nguồn đối với mạch logic so sánh) phải được truyền tiếp từ các mạch chốt EX/MEM hoặc MEM/WB của đường ống . 29
- Các vấn đề truyền tiếp rẽ nhánh (ID) , tt Nếu lệnh ngay trước rẽ WB add3 $3, nhánh tạo ra một trong MEM add2 $4, các toán hạng nguồn rẽ EX add1 $1 , ID beq $1 ,$2,Loop nhánh, kế đến một stall IF next_seq_instr cần được chèn vào (giữa beq và add1 ) do thao tác ALU tầng EX sẽ xảy ra cùng lúc với thao tác so sánh rẽ nhánh tầng ID. “Loại bỏ” beq (trong ID) và lệnh kế tiếp theo sau next_seq_instr ( trong IF) đúng vị trí (đơn vị hazard ( Hazard Unit) ID không xác lập PC.Write và IF/ID.Write ). Chèn một stall giữa add trong tầng EX và beq trong tầng ID bằng cách cho bằng 0 các bit điều khiển đi đến thanh ghi đường ống ID/EX ( được thực hiện bởi ID Hazard Unit). Nếu rẽ nhánh tìm thấy được thực hiện, kế đến flush lệnh hiện ở trong IF ( IF.Flush ). 31
- Hỗ trợ rẽ nhánh tầng ID Lúc này IF.Flush được tạo ra bởi đơn vị hazard (Hazard Unit) cho cả các lệnh nhảy lẫn rẽ nhánh được thực hiện. Có thể khẳng định rằng ta cần truyền tiếp từ mạch chốt đường ống MEM/WB, nhưng với thao tác ghi RegFile trước thao tác đọc. 33
- Lập chương trình các khe trì hoãn rẽ nhánh A. Từ trước rẽ nhánh B. Từ đích rẽ nhánh C. Từ thất bại add $1,$2,$3 sub $4,$5,$6 add $1,$2,$3 if $2=0 then if $1=0 then delay slot delay slot add $1,$2,$3 if $1=0 then delay slot sub $4,$5,$6 trở thành trở thành trở thành add $1,$2,$3 if $2=0 then if $1=0 then add $1,$2,$3 sub $4,$5,$6 add $1,$2,$3 if $1=0 then sub $4,$5,$6 A là lựa chọn tốt nhất , làm đầy khe trì hoãn và giảm IC. Trong B và C, lệnh sub có thể cần để được sao chép , tăng IC. Trong B và C, phải tán thành thực thi sub khi rẽ nhánh thất bại. 35
- Dự đoán rẽ nhánh tĩnh Giải quyết các hazard rẽ nhánh bằng cách giả định kết quả cho trước và tiếp tục mà không chờ xem kết quả rẽ nhánh thực sự. 1. Dự đoán không được thực hiện – luôn luôn dự đoán các rẽ nhánh sẽ không được thực hiện , tiếp tục tìm nạp từ chuỗi lệnh theo sau , chỉ khi rẽ nhánh được thực hiện sẽ stall đường ống. Nếu được thực hiện , flush các lệnh sau rẽ nhánh (sớm hơn trong đường ống). - trong các tầng IF, ID và EX nếu mạch logic rẽ nhánh trong MEM – ba stall. - trong các tầng IF và ID nếu mạch logic rẽ nhánh trong EX – hai stall. - trong tầng IF nếu mạch logic rẽ nhánh trong ID – một stall. đảm bảo rằng các lệnh bị flush này không làm thay đổi trạng thái máy – tự động trong đường ống MIPS do các thao tác thay đổi trạng thái máy ở đầu cuối của đường ống (MemWrite ( trong MEM) hoặc RegWrite ( trong WB)) . khởi động lại đường ống ở đích rẽ nhánh. Đây là sơ đồ tĩnh do quyết định như vậy luôn luôn được thực hiện . 37
- Các cấu trúc rẽ nhánh “Dự đoán không được thực hiện” hoạt động tốt đối với các cấu trúc rẽ nhánh “đỉnh của vòng lặp”. Loop: beq $1,$2,Out nd Nhưng những vòng lặp như vậy 1 loop instr có các nhảy ở đáy của vòng lặp . để trở về đỉnh của vòng lặp – và . phải chịu tổn phí stall nhảy. . last loop instr j Loop Out: fall out instr “Dự đoán không được thực hiện” sẽ không hoạt động tốt đối với các cấu trúc rẽ nhánh “đáy của vòng lặp”. Loop: 1 st loop instr 2nd loop instr . . . last loop instr bne $1,$2,Loop fall out instr 39
- Dự đoán rẽ nhánh tĩnh, tiếp theo “Dự đoán được thực hiện” luôn luôn chịu tối thiểu một stall – giả định phần cứng địa chỉ đích rẽ nhánh đã được di chuyển lên đến tầng ID. Do vậy, “dự đoán không được thực hiện” là dễ dàng hơn do địa chỉ lệnh theo sau có thể được tính trong tầng IF. 41
- Mạch đệm đích rẽ nhánh BHT dự đoán lúc một rẽ nhánh được thực hiện, nhưng không cho biết nơi được thực hiện! Mạch đệm đích rẽ nhánh (branch target buffer (BTB)) trong tầng IF có thể “trữ” địa chỉ đích rẽ nhánh , nhưng ta cũng cần tìm nạp lệnh kế tiếp theo sau . Bit dự đoán trong IF/ID lựa chọn lệnh “kế tiếp” nào sẽ được nạp vào trong IF/ID ở cạnh clock tiếp theo. - Sẽ cần bộ nhớ lệnh 2 port đọc. BTB Instruction Memory Hoặc BTB có thể “trữ” lệnh rẽ Read 0 nhánh được thực thi trong khi bộ PC Address nhớ lệnh đang tìm nạp lệnh kế tiếp theo sau. Nếu tiên đoán là đúng , các stall có thể tránh được, bất kể hướng chúng di chuyển, Ngoại trừ lần đầu tiên việc rẽ nhánh bị bắt gặp , khi ta không có lệnh rẽ nhánh được nạp vào trong BTB. 43
- Mạch dự đoán 2-bit Sơ đồ 2-bit có thể cho ta độ chính xác 90% do một dự đoán phải sai 2 lần trước khi bit dự đoán được thay đổi. đúng 9 lần Loop: 1 st loop instr 2nd loop instr Sai khi rời khỏi . Taken vòng lặp . Not taken . Predict 1 last loop instr 1 Predict 11 10 Taken Taken bne $1,$2,Loop Taken fall out instr Taken Đúng trên lần Not taken lặp lại đầu tiên Not taken 00 Predict 0 0 Predict 01 BHT cũng Not Taken Not Taken Taken lưu trạng Not taken thái ban đầu Taken: thực hiện của FSM. Predict: dự đoán 45
- Xử lý các ngoại lệ Ngoại lệ chỉ là dạng khác của hazard điều khiển. Các ngoại lệ phát sinh do: Tràn số học loại R. Cố gắng thực thi lệnh chưa định nghĩa. Yêu cầu của thiết bị IO. Yêu cầu phục vụ của OS (e.g., lỗi trang , ngoại lệ TLB). Sự cố phần cứng. Đường ống phải dừng việc thực thi lệnh phạm lỗi giữa chừng , cho các lệnh trước đó hoàn tất , flush mọi lệnh theo sau , thiết lập một thanh ghi để cho thấy nguyên nhân của ngoại lệ, lưu địa chỉ của lệnh phạm lỗi và rồi nhảy đến địa chỉ đã được sắp xếp trước (địa chỉ của trình xử lý ngoại lệ). Phần mềm (OS) xem xét nguyên nhân của ngoại lệ và “xử lý” ngoại lệ. 47
- Hai loại ngoại lệ Ngắt – không đồng bộ với việc thực thi chương trình. gây ra bởi các sự kiện bên ngoài. có thể được xử lý giữa các lệnh , do vậy có thể cho các lệnh đang tích cực trong đường ống hoàn tất trước khi chuyển điều khiển đến trình xử lý ngắt của OS. đơn thuần tạm ngưng và tiếp tục chương trình của người sử dụng. Bẫy (Ngoại lệ) – đồng bộ với việc thực thi chương trình. gây ra bởi các sự kiện bên trong. điều kiện phải được khắc phục bởi trình xử lý bẫy đối với lệnh đó , do vậy phải dừng lệnh phạm lỗi giữa chừng trong đường ống và chuyển điều khiển đến trình xử lý bẫy của OS. lệnh phạm lỗi có thể được thử lại (hoặc được mô phỏng bởi OS) và chương trình có thể tiếp tục hoặc bị bỏ dở. 49
- Các ngoại lệ xảy ra ở đâu trong đường ống Lưu ý rằng yêu cầu phục vụ I/O không kết hợp với bất kỳ việc thực thi lệnh nào nên có thể được xử lý khi phần cứng quyết định (đến giới hạn nào đó) –i.e., chọn cẩn thận vị trí thích hợp nhất để xử lý ngoại lệ. TLB: Translation Lookaside Buffer, được sử dụng như một cache. 51
- Thêm vào MIPS để xử lý các ngoại lệ Thanh ghi cause (ghi lại các ngoại lệ) – phần cứng để ghi lại trong cause các ngoại lệ và tín hiệu để điều khiển ghi đến cause (CauseWrite ). Thanh ghi EPC ( ghi lại địa chỉ của các lệnh phạm lỗi ) – phần cứng để ghi vào trong EPC địa chỉ của lệnh phạm lỗi và tín hiệu điều khiển ghi đến EPC (EPCWrite ) Phần mềm ngoại lệ phải tương thích ngoại lệ đối với lệnh. Một phương pháp để nạp PC bằng địa chỉ của trình xử lý ngoại lệ. Mở rộng mux ngõ vào PC ở nơi ngõ vào mới được nối dây đến địa chỉ của trình xử lý ngoại lệ - (e.g., 8000 0180 hex đối với tràn số học ). Một phương pháp để flush lệnh phạm lỗi và các lệnh theo sau lệnh này. 53