*)Nguyên lí chung:(có hình)
+)Việc thực hiện lệnh được chia làm 5 giai đoạn.
5 giai đoạn của một hệ thống load_store:
_Instruction Fetch-IF đọc lệnh từ bộ nhớ.
_Instruction decode-ID giải mã lệnh và các toán hạng.
_Excute Thực hiện lệnh nếu là lênh truy cập bộ nhớ, tính toán địa chỉ bộ nhớ.
_Memory access-Mem: Đọc ghi bộ nhớ, no op nếu ko truy cập bộ nhớ
_Write back- WR:ghi kết quả vào các thanh ghi.
*)Đặc điểm:
_Là dạng xử lý song song ở mức lệnh.
_Mỗi pipeline là đầy đủ khi nó luôn tiếp nhận 1 lệnh mới tại mỗi chu kì đồng bộ.
_Ngược lại 1 pipeline là không đầy đủ khi nó có một số chu kì trễ trong tiến hành trình thực hiện.
_Số lượng các giai đoạn(stage) trong pipeline phụ thuộc vào các thiết kế của vi xử lí: 5 giai đoạn(pipeline đơn giao)
14 giai đoạn(P2,P3) va 31giai đoạn (P4)
*)Lựa chọn số stage:
+Thời gian thực hiện mỗi giai đoạn:
_Các giai đoạn nên có thời gian thực hiện bằng nhau
_Các giai đoạn chậm thường được tách nhỏ
+Các vấn đề liên quan đến tài nguyên:
_Điều j xảy ra khi 2 giai đoạn đọc lệnh và toán hạng đều truy cập bộ nhớ.
_Điều j xảy ra khi hai giai đoạn đọc lệnh và thực hiện lệnh đều truy cập PC.
+Pipeline dài bao nhiêu là tốt:
_Về nguyên tắc thì càng nhiều stage, hiệu quả càng cao
_Pipeline dài nếu bị trống vì 1 vài lí do nào nó thì sẽ mất khá nhiều thời gian cho việc điền đầy.
*)Các vấn đề của pipeline:
+) Vấn đề về xung đột tài nguyên
+)Vấn đề về tranh chấp dữ liệu
+)Các lệnh rẽ nhánh
*)RAW: read after write
VD: xét hai lệnh
ADD R4,R1,R3: R1= R1+R3;
SUB R4,R1,R2: R4=R1-R2;
_Lệnh SUB sử dụng kết quả của ADD, có sự phụ thuộc vào dữ liệu giữa hai lệnh.
_Sub đọc lệnh R1 trong giai đoạn 2(JD) còn ADD ghi kết quả trong giai đoạn 5(WB)
Sub đọc giá trị cũ của R1 trước khi ADD lưu giá trị mới của R1
*Hướng khắc phục:
Lùi thời điểm thực hiện SUB bằng cách chèn 3 lệnh NO-OP(hình vẽ2)
RAW và cách khắc phục:
_Nhận dạng vấn đề RAW khi nó diễn ra.
_Khi RAW hazard diễn ra, tạm dừng pipeline cho đến khi lệnh phía trước hoàn tất giai đoạn WB.
_Có thể sử dụng compiler để nhận dạng RAW và:
.Chèn thêm các lệnh NO-OP vào giữa các lệnh có thể gây ra RAW
.Thay đổi trật tự các lệnh trong chương trình và chèn các lệnh đọc lập vào giữa các lệnh có thể gây ra RAW
. Sử dụng phần cứng để nhận dạng RAW và dự đoán trước giá trị dữ liệu phụ thuộc
Giải pháp:
chèn các lệnh độc lập:(hình vẽ3)
*)Các lệnh rec nhánh trong pipeline:
_ Tỉ lệ các lệnh rẽ nhánh trong chương trình khoảng 10-30%
Lệnh rẽ nhánh gây ra: _Ngắt quãng quá trình thực hiện bình thường của chương trình.
_Làm cho pipeline trống rỗng:nếu ko có biện pháp ngăn chặn
_Với các Vi xử lí có pipeline dài(P4 là 31 stages) và có nhiều pipeline chạy song song , vấn đề lệnh rẽ nhánh càng trở nên phức tạp.
Phải đẩy toàn bộ các lệnh đang thực hiện ở các ống khi gặp lệnh rẽ nhánh
Nạp mới các lệnh từ địa chỉ rẽ nhánh vào pipeline, tốn nhiều thời gian cho việc lập đầy pipeline
*)Các giải pháp:
1)Branch targets
+Khi một lệnh rẽ nhánh được thực thi, lệnh tiếp theo được nạp là lệnh ở địa chỉ đích(target) ko phải là lệnh kế tiếp lệnh nhảy
+Lệnh rẽ nhánh được thực hienj ở giai đoạn ID, vậy có thể biết trước chúng bằng cách giải mã sớm
+Sử dụng Branch target buffer để lưu vết của các lệnh rẽ nhánh đều được thực thi:
_Các địa chỉ đích của lệnh rẽ nhánh.
_Lệnh đích của các lệnh rẽ nhánh.
Giảm được trễ do không phải tính lại địa chỉ và nạp lại lệnh đích từ bộ nhớ.Việc này thực hiện được do địa chỉ đích rẽ nhánh thường ko thay đổi.
+Với trường hợp các lệnh trở về từ chương trình can
_Địa chỉ đích thường thay đổi do chương trình con được gọi từ nhiều vị trí # nhau
_Các giá trị lưu trog Branch target buffer trở nên sai
Cách giải quyết:
_Quan sát giá trị từ Branch target buffer được nạp vào pipeline để phát hiện lỗi
_Do các lệnh call return được thực hiện theo trật tự ngược với các lệnh call, có thể sử dụng một bộ đệm kiểu ngăn xếp để lưu các địa chỉ trở về.
*)Rẽ nhánh có điều kiện:
+Việc quản lí rẽ nhánh có điều kiện phức tạp hơn.
_Có hai lệnh rẽ nhánh đích phải lựa chọn.
_Ko thể xác định chính xác lệnh đích rẽ nhánh cho đến khi lệnh rẽ nhánh được thực hiện.
_Branch target buffer cũng ko hạn chế được trễ do ta vẫn phải chờ cho đến khi biết được đích của lệnh rẽ nhánh.
Delayed branching
Multiple conditioncode
Branch predition
Branch history
a)Delayed branching:
_Lệnh rẽ nhánh sẽ ko gây ra sự rẽ nhánh tức thì mà được làm trễ một số chu kì, phụ thuộc vào chiều dài của pipeline.
_Đặc điểm:
+Làm việc tốt nhất trên các vi xử lí Risc có thời gian thực hiện ngang nhau
+Pipeline ngắn
+Lệnh ngay sau rẽ nhánh luôn được thực hiện, ko phụ thuộc vào kết quả của lệnh rẽ nhánh
_Thực hiện:
+Sử dụng complier để chèn thêm các lệnh NO-OP vào sau các lệnh rẽ nhánh
+Chuyển 1 lệnh từ phía trước ra ngay sau lệnh rẽ nhánh.
VD:
_Cho dãy lệnh
ADD R2 R3 R4
CMP R1,0
JNE some where
_Thêm lệnh NO-OP vào lệnh rẽ nhánh
ADD R2,R3,R4
CMP R1,0
JNE some where
NO-OP
_Chuyển các lệnh độc lập phía trước ra ngay sau lệnh rẽ nhánh
CMP R1,0
JNE some where
ADD R2,R3,R4
(hình vẽ 3)
*)Multiple condition codes
_Các lệnh rẽ nhánh thường phụ thuộc vào một conditioncode chưa được tính toán, ta có thể xử lý lệnh rẽ nhánh tốt hơn nếu tính trước được giá trị của conditioncode
_Giá trị này được tính bởi
+Bản thân lện rẽ nhánh
+Các lệnh trước lệnh rẽ nhánh
+Áp dụng cho trường hợp 2, lệnh tính giá trị điều kiện thường nằm trước lệnh rẽ nhánh
VD
Cho dãy lệnh
Sub R1 R1 4
ADD R3, memval, 5
CMp R2,0
Jne somewhere
Có thể chuyển thành
CMp R2 0
Sub R1 R1 4
ADD R3, memval, 5
Jne somewhere
*)Ưu điểm:
Lệnh tính toán điều kiện rẽ nhánh lên phía trước, nhờ vậy ta tính được giá trị điều kiện, giúp xử lí tốt lệnh rẽ nhánh.
*)Hạn chế:
Ko phải lúc nào cũng thực hiện được cơ chế trên, do ko đủ lệnh độc lập để chèn vào giữa lệnh tính toán điều kiện và lệnh rẽ nhánh đặc biệt với pipeline dài
_Cơ chế sử dụng các thanh ghi để lưu giá trị tính trước của các conditioncode phục vụ xử lý lệnh nhảy.
*Branch Predition
a)Ý hướng: Dự đoná lệnh đích của lệnh rẽ nhánh có điều kiện
Đoán đúng: giúp tăng hiệu năng
Đoán sai: Đẩy các lệnh đã nap phía sau lệnh rẽ nhánh, nạp lệnh đích rẽ nhánh
b)Các cơ sở dự đoán:
_Các lệnh nhảy ngược:
Thường là 1 phần của vòng lặp
Các vòng lặp thường được thực hiện nhiều lần
Lần lặp cuối có thể sai
_Các lệnh nhày xuôi có thể dự đoán hơn:
Có thể là lệnh kết thúc vòng lặp.
Có thể lệnh nhày dựa trên 1 điều kiện
*Branch history:
_Lưu các thông tin về các lệnh rẽ nhánh đã thực hiện trong 1 bảng làm cơ sở cho dự đoán.
_Bảng có thể lưu khoảng vài trăm mục tin về các lệnh rẽ nhánh gần nhất.
_Thực nghiệm cho thấy tỉ lệ dự đoná đúng lên đến 82-99%
_Tăng số mục tin lưu trữ của bảng không giúp, tăng đáng kể tỉ lệ dự đoán đúng
Bạn đang đọc truyện trên: Truyen4U.Com