Tất nhiên điều kiện được kiểm tra mỗi lần. Nhưng tại thời điểm nó được kiểm tra, nó đã đi sâu vào đường ống CPU. Đồng thời, các hướng dẫn khác cũng đã được đưa vào đường ống và đang ở các giai đoạn thực hiện khác nhau.
Thông thường, một điều kiện ngay lập tức được theo sau bởi một lệnh rẽ nhánh có điều kiện, một trong hai nhánh nếu điều kiện ước lượng thành TRUE hoặc rơi vào nếu điều kiện ước lượng thành FALSE. Điều này có nghĩa là có hai luồng hướng dẫn khác nhau có thể được tải vào đường ống sau lệnh điều kiện và lệnh rẽ nhánh, tùy thuộc vào điều kiện đánh giá thành TRUE hay FALSE. Thật không may, ngay sau khi tải lệnh điều kiện và lệnh rẽ nhánh, CPU vẫn chưa biết điều kiện sẽ đánh giá là gì, nhưng nó vẫn phải tiếp tục tải công cụ vào đường ống. Vì vậy, nó chọn một trong hai bộ hướng dẫn dựa trên dự đoán về điều kiện sẽ đánh giá.
Sau này, khi hướng dẫn điều kiện đi lên đường ống, đây là lúc để đánh giá. Vào thời điểm đó, CPU tìm hiểu xem dự đoán của nó là đúng hay sai.
Nếu dự đoán là đúng, thì chi nhánh đã đi đến đúng nơi và các hướng dẫn đúng đã được tải vào đường ống. Nếu hóa ra dự đoán là sai, thì tất cả các hướng dẫn được nạp vào đường ống sau khi lệnh rẽ nhánh có điều kiện đều sai, chúng cần phải được loại bỏ và tìm nạp lại các lệnh phải bắt đầu lại từ đúng nơi.
Sửa đổi
Đáp lại bình luận của StarWeaver, để đưa ra ý tưởng về những gì CPU phải làm để thực hiện một lệnh:
Hãy xem xét một cái gì đó đơn giản như MOV AX,[SI+10]
con người chúng ta ngây thơ nghĩ là "tải AX với từ tại SI cộng 10". Roughly, CPU phải:
- phát nội dung của PC ("thanh ghi bộ đếm chương trình") đến bus địa chỉ;
- đọc opcode hướng dẫn từ bus dữ liệu;
- PC tăng;
- giải mã opcode để biết phải làm gì với nó;
- phát nội dung của PC đến bus địa chỉ;
- đọc toán hạng lệnh (trong trường hợp này là 10) từ bus dữ liệu;
- PC tăng;
- đưa toán hạng và SI vào bộ cộng;
- phát ra kết quả của bộ cộng vào bus địa chỉ;
- đọc AX từ bus dữ liệu.
Đây là một con số khổng lồ 10 bước. Một số bước này sẽ được tối ưu hóa ngay cả trong các CPU không có đường ống, ví dụ CPU sẽ luôn tăng PC song song với bước tiếp theo, đây là một điều dễ thực hiện vì PC là một thanh ghi rất, rất đặc biệt không bao giờ được sử dụng cho bất kỳ công việc nào khác, vì vậy không có khả năng tranh chấp giữa các phần khác nhau của CPU để truy cập vào thanh ghi cụ thể này. Tuy nhiên, chúng tôi vẫn còn 8 bước cho một hướng dẫn đơn giản như vậy và lưu ý rằng tôi đã giả sử một mức độ tinh vi nào đó thay cho CPU, ví dụ tôi cho rằng sẽ không cần thêm một bước nữa cho adder để thực sự bổ sung trước khi kết quả có thể được đọc từ nó,
Bây giờ, hãy xem xét rằng tồn tại các chế độ địa chỉ phức tạp hơn, như MOV AX, [DX+SI*4+10]
, và thậm chí các hướng dẫn phức tạp hơn nhiều, giống như MUL AX, operand
thực sự thực hiện các vòng lặp bên trong CPU để tính kết quả của chúng.
Vì vậy, quan điểm của tôi ở đây là phép ẩn dụ "cấp độ nguyên tử" không phù hợp với mức độ chỉ dẫn của CPU. Nó có thể phù hợp với cấp bước đường ống, nếu bạn không muốn đi quá xa đến mức cổng logic thực tế.