tl; dr
Đường ống ngắn hơn có nghĩa là tốc độ xung nhịp nhanh hơn, nhưng có thể làm giảm thông lượng. Ngoài ra, hãy xem câu trả lời số 2 và 3 ở phía dưới (chúng ngắn, tôi hứa).
Phiên bản dài hơn:
Có một vài điều cần xem xét ở đây:
- Không phải tất cả các hướng dẫn mất cùng một lúc
- Không phải tất cả các hướng dẫn đều phụ thuộc vào những gì đã được thực hiện ngay lập tức (hoặc thậm chí mười hoặc hai mươi) hướng dẫn
Một đường ống rất đơn giản (những gì xảy ra trong các chip Intel hiện đại vượt quá phức tạp) có một số giai đoạn:
Tìm nạp -> Giải mã -> Truy cập bộ nhớ -> Thực thi -> Ghi lại -> Cập nhật bộ đếm chương trình
Tại mỗi -> có một chi phí thời gian phát sinh. Ngoài ra, mỗi tích tắc (chu kỳ đồng hồ), mọi thứ đều chuyển từ giai đoạn này sang giai đoạn tiếp theo, vì vậy giai đoạn chậm nhất của bạn trở thành tốc độ cho TẤT CẢ các giai đoạn (nó thực sự trả tiền cho chúng để có độ dài tương tự nhất có thể).
Giả sử bạn có 5 hướng dẫn và bạn muốn thực hiện chúng (ảnh chụp từ wikipedia, ở đây bản cập nhật PC không được thực hiện). Nó sẽ trông như thế này:
Mặc dù mỗi lệnh chỉ mất 5 chu kỳ đồng hồ để hoàn thành, một lệnh hoàn thành sẽ ra khỏi đường ống mỗi chu kỳ. Nếu thời gian cho mỗi giai đoạn là 40 ns và 15 ns cho các bit trung gian (sử dụng đường ống sáu giai đoạn của tôi ở trên), sẽ mất 40 * 6 + 5 * 15 = 315 ns để có được lệnh đầu tiên.
Ngược lại, nếu tôi loại bỏ hoàn toàn đường ống (nhưng giữ mọi thứ khác như cũ), sẽ chỉ mất 240 ns để có được hướng dẫn đầu tiên. (Sự khác biệt về tốc độ này để đưa ra lệnh "đầu tiên" được gọi là độ trễ. Nó thường không quan trọng bằng thông lượng, đó là số lượng lệnh trong một giây).
Mặc dù vậy, sự khác biệt thực sự là trong ví dụ về đường ống dẫn, tôi nhận được một phép xử lý mới (sau lần đầu tiên) cứ sau 60 ns. Trong trường hợp không có đường ống, phải mất 240 lần. Điều này cho thấy các đường ống rất tốt trong việc cải thiện thông lượng.
Tiến lên một bước nữa, dường như trong giai đoạn truy cập bộ nhớ, tôi sẽ cần một đơn vị bổ sung (để thực hiện tính toán địa chỉ). Điều đó có nghĩa là nếu có một hướng dẫn không sử dụng giai đoạn mem theo chu kỳ đó, thì tôi có thể thực hiện một bổ sung khác. Do đó, tôi có thể thực hiện hai giai đoạn thực thi (với một trong giai đoạn truy cập bộ nhớ) trên một bộ xử lý trong một tích tắc (lập lịch là một cơn ác mộng, nhưng chúng ta đừng đến đó. Ngoài ra, giai đoạn cập nhật PC cũng sẽ cần một đơn vị bổ sung trong trường hợp nhảy, vì vậy tôi có thể thực hiện ba trạng thái thực thi bổ sung trong một tích tắc). Bằng cách có một đường ống dẫn, nó có thể được thiết kế sao cho hai (hoặc nhiều) hướng dẫn có thể sử dụng các giai đoạn khác nhau (hoặc các bước nhảy vọt, v.v.), tiết kiệm thời gian quý báu.
Lưu ý rằng để thực hiện điều này, các bộ xử lý thực hiện rất nhiều "phép thuật" ( thực hiện theo thứ tự , dự đoán nhánh và nhiều hơn nữa), nhưng điều này cho phép nhiều hướng dẫn đi ra nhanh hơn mà không cần đường ống (lưu ý rằng các đường ống quá lâu rất khó quản lý và phải chịu chi phí cao hơn chỉ bằng cách chờ đợi giữa các giai đoạn). Mặt trái là nếu bạn thực hiện đường ống quá dài, bạn có thể nhận được tốc độ đồng hồ điên rồ, nhưng mất đi nhiều lợi ích ban đầu (có cùng loại logic có thể tồn tại ở nhiều nơi và được sử dụng cùng một lúc ).
Câu trả lời số 2:
Bộ xử lý SIMD (nhiều lệnh dữ liệu) (giống như hầu hết các GPU) thực hiện rất nhiều công việc trên nhiều bit thông tin, nhưng phải mất nhiều thời gian hơn để thực hiện. Đọc trong tất cả các giá trị mất nhiều thời gian hơn (có nghĩa là đồng hồ chậm hơn, mặc dù bù này bằng cách có một bus rộng hơn ở một mức độ nào đó) nhưng bạn có thể nhận được nhiều hướng dẫn hơn được thực hiện cùng một lúc (hướng dẫn hiệu quả hơn cho mỗi chu kỳ).
Câu trả lời số 3:
Bởi vì bạn có thể "gian lận" một cách kéo dài số lượng chu kỳ một cách giả tạo để bạn có thể thực hiện hai hướng dẫn mỗi chu kỳ (chỉ giảm một nửa tốc độ đồng hồ). Cũng có thể chỉ làm một cái gì đó cứ sau hai tích tắc trái ngược với một (cho tốc độ xung nhịp gấp 2 lần, nhưng không thay đổi hướng dẫn trong một giây).