Câu trả lời ngắn
Các bước trong giải mã và thực hiện lệnh được thực hiện song song với bước tiếp theo của lệnh trước. Kỹ thuật này được gọi là đường ống. Xem trên Bộ xử lý RISC dưới đây.
Kiến trúc RISC một vấn đề thường sẽ trung bình ít hơn một lệnh trong mỗi chu kỳ do trạng thái chờ và thời gian dành cho các hoạt động tải / lưu trữ chạm vào bộ nhớ thay vì chỉ đăng ký để đăng ký. Các khe trễ cung cấp cho bạn một móc kiến trúc có thể cho phép bạn lấy lại một phần thời gian này. Xem Trên bộ xử lý RISC bên dưới.
Một chu trình lệnh là khoảng thời gian cần thiết để thực hiện một lệnh. Điều này sẽ thay đổi theo kiến trúc và (trong một số trường hợp) hướng dẫn. Ví dụ: hầu hết các hướng dẫn về một cái gì đó như MIPS R2000 / 3000 đều mất một chu kỳ. Các hướng dẫn liên quan đến truy cập bộ nhớ (tải / lưu trữ, chi nhánh) mất nhiều hơn một chu kỳ, mặc dù các khe trễ có nghĩa là bạn có thể thực hiện một cái gì đó khác (có thể chỉ là NOP) trong khe trễ. Kiến trúc không có đường ống có thể có chu kỳ chỉ dẫn của một số chu kỳ đồng hồ, thường thay đổi theo chế độ địa chỉ. Xem Trên bộ xử lý RISC, Kiến trúc CISC truyền thống và Kiến trúc Hardwired bên dưới.
Thiết kế nhiều vấn đề có thể làm mờ khái niệm này phần nào bằng cách thực hiện song song nhiều lệnh.
Bộ xử lý CISC có thể có các hướng dẫn mất nhiều thời gian khác nhau. Số lượng chính xác của chu kỳ đồng hồ phụ thuộc vào kiến trúc và hướng dẫn. Số lượng chu kỳ đồng hồ khác nhau được thực hiện trên CISC ISAs là một trong những lý do khiến chúng khó xây dựng thành các kiến trúc đường ống nặng nề. Xem kiến trúc CISC truyền thống dưới đây.
Câu trả lời dài hơn
Đối với một vấn đề duy nhất MIPS, SPARC hoặc CPU khác, tất cả các hướng dẫn (đối với xấp xỉ đầu tiên) đều phát sinh trong một chu kỳ, mặc dù chúng có thể có một thứ gọi là 'khe trễ'.
Trên bộ xử lý RISC
Trong bối cảnh này, CPU có một vấn đề duy nhất là CPU không thực hiện bất kỳ phân tích phụ thuộc nhanh chóng nào và đưa ra các hướng dẫn song song theo cách mà CPU hiện đại thực hiện, tức là chúng chỉ có một đơn vị thực thi thực hiện các hướng dẫn trong thứ tự chúng được đọc từ memoty. Thêm về điều này sau.
Hầu hết các bộ xử lý RISC cũ hơn là các thiết kế một vấn đề và các loại này vẫn được sử dụng rộng rãi trong các hệ thống nhúng. Lõi RISC số nguyên đơn 32 bit có thể được triển khai trong khoảng 25.000-30.000 cổng, do đó, lõi CPU loại này có mức tiêu thụ điện năng rất thấp và dấu chân rất nhỏ. Điều này giúp chúng dễ dàng và rẻ tiền để tích hợp vào các sản phẩm SOC (hệ thống trên chip).
Các thiết kế CPU của RISC được sắp xếp theo đường ống - việc xử lý lệnh được thực hiện trong một số giai đoạn, với mỗi lệnh được truyền xuống đường ống đến giai đoạn tiếp theo trong mỗi chu kỳ xung nhịp. Trong hầu hết các trường hợp, CPU đường ống một vấn đề sẽ thực hiện một cái gì đó gần với một lệnh trên mỗi chu kỳ xung nhịp.
Một số kiến trúc có các hướng dẫn như phân nhánh hoặc tải / lưu trữ từ bộ nhớ trong đó chu trình bổ sung được thực hiện bởi quyền truy cập bộ nhớ được hiển thị cho mã.
Ví dụ, trong thiết kế SPARC V7 / V8, lệnh tiếp theo sau khi một nhánh thực sự được thực thi trước khi chính nhánh đó diễn ra. Thông thường, bạn sẽ đặt NOP vào vị trí sau nhánh nhưng bạn có thể đặt một hướng dẫn khác vào nó nếu bạn có thể tìm thấy việc gì đó hữu ích để làm.
Kiến trúc MIPS R2000 / R3000 có khe trễ tương tự trong hướng dẫn tải / lưu trữ. Nếu bạn đã tải một giá trị từ bộ nhớ, nó sẽ không thực sự xuất hiện trong thanh ghi cho một chu kỳ khác. Bạn có thể đặt NOP vào vị trí hoặc làm một cái gì đó khác nếu bạn có thể tìm thấy thứ gì đó hữu ích để làm điều đó không phụ thuộc vào hoạt động tải mà bạn vừa ban hành.
Nếu bộ nhớ chậm hơn CPU, thường là như vậy, bạn có thể nhận thêm trạng thái chờ khi truy cập bộ nhớ. Trạng thái chờ đóng băng CPU trong một hoặc nhiều chu kỳ xung nhịp cho đến khi hoàn thành truy cập bộ nhớ. Trong thực tế, các trạng thái chờ này và thêm thời gian để truy cập bộ nhớ có nghĩa là các thiết kế CPU một vấn đề trung bình hơi ít hơn một lệnh trên mỗi chu kỳ xung nhịp. Các khe trễ cung cấp cho bạn một số cơ hội có thể để tối ưu hóa mã bằng cách thực hiện một số lệnh khác trong khi thao tác bộ nhớ diễn ra.
Bộ xử lý CISC truyền thống
Bộ xử lý CISC là các thiết kế có thể có các hướng dẫn trong các khoảng thời gian khác nhau. Thường thì họ có các hướng dẫn phức tạp hơn được triển khai trực tiếp trong phần cứng sẽ phải được thực hiện trong phần mềm trên CPU RISC.
Hầu hết các kiến trúc máy tính lớn và hầu hết tất cả các thiết kế PC cho đến M68K và intel 386 đều là CPU CISC được mã hóa truyền thống. Những thiết kế này được chứng minh là chậm hơn trên mỗi đồng hồ và sử dụng nhiều cổng hơn so với CPU RISC.
Vi mã
Một ví dụ về kiến trúc mã hóa (MOS 6502) có thể được nhìn thấy trong mô phỏng ở đây . Các microcode có thể được nhìn thấy ở trên cùng của hình ảnh.
Microcode kiểm soát các luồng dữ liệu và hành động được kích hoạt trong CPU để thực hiện các lệnh. Bằng cách lặp qua các bước trong vi mã, bạn có thể kích hoạt các bộ phận của CPU, di chuyển dữ liệu qua ALU hoặc thực hiện các bước khác. Các thành phần có thể sử dụng lại trong CPU có thể được phối hợp trong nhiều chu kỳ xung nhịp để thực hiện một lệnh. Trong trường hợp của 6502, một số hành động theo đường ống cũng có thể được thực thi bằng vi mã.
Các thiết kế được mã hóa sử dụng ít silicon hơn so với chip có dây cứng với chi phí có thể mất vài chu kỳ đồng hồ để hoàn thành một hướng dẫn. Tùy thuộc vào thiết kế, các CPU này sẽ có các khoảng thời gian khác nhau cho mỗi lệnh.
Kiến trúc cứng
Các thiết kế được thiết kế cứng (không nhất thiết phải loại trừ lẫn nhau với microcode) thực hiện một lệnh một cách đồng bộ hoặc có thể có các điều phối viên riêng để thực hiện một số thứ trong nhiều chu kỳ đồng hồ. Chúng thường nhanh hơn với chi phí cho phần cứng chuyên dụng hơn và do đó tốn kém hơn khi thực hiện so với thiết kế được mã hóa có chức năng tương đương.
Một ví dụ nổi tiếng về điều này là CPU Amdahl 470/6 ban đầu , là sự thay thế thả xuống cho CPU trên một số mô hình Hệ thống / 370 của IBM. CPU Amdahl là một thiết kế được thiết kế cứng tại thời điểm mà CPU 370 của IBM chủ yếu dựa trên vi mã. CPU Amdahl nhanh hơn khoảng 3 lần so với CPU IBM mà họ đã thay thế.
Không cần phải nói, IBM đã không thích thú và điều này dẫn đến một trận chiến ở tòa án đã kết thúc buộc IBM phải mở kiến trúc máy tính lớn của họ cho đến khi nghị định đồng ý hết hạn vài năm trước.
Thông thường, một thiết kế cứng của loại này vẫn không nhanh như đồng hồ CPU RISC vì các định thời và định dạng hướng dẫn khác nhau không cho phép nhiều phạm vi cho thiết kế RISC.
Thiết kế nhiều vấn đề
Hầu hết các CPU hiện đại là kiến trúc nhiều vấn đề có thể xử lý nhiều lệnh một lần trong một luồng. Chip có thể thực hiện phân tích phụ thuộc động trên luồng lệnh đến và đưa ra các hướng dẫn song song khi không có sự phụ thuộc vào kết quả tính toán trước đó.
Thông lượng của các chip này phụ thuộc vào mức độ song song có thể đạt được trong mã nhưng hầu hết các CPU hiện đại sẽ trung bình một số hướng dẫn trên mỗi chu kỳ trên hầu hết mã.
Intel hiện đại và các CPU ISA x86 / X64 hiện đại khác có một lớp diễn giải lệnh CISC trường học cũ thành các hướng dẫn vi mô có thể được cung cấp thông qua lõi nhiều vấn đề theo kiểu RISC. Điều này bổ sung một số chi phí không có trên CPU có ISA được thiết kế cho đường ống (tức là các kiến trúc RISC như ARM hoặc PowerPC).
Thiết kế VLIW
Các thiết kế của VLIW, trong đó Intel Itanium có lẽ là nổi tiếng nhất, chưa bao giờ được coi là kiến trúc chính thống, nhưng IIRC có một số kiến trúc DSP sử dụng kiểu thiết kế này. Thiết kế VLIW làm cho nhiều vấn đề rõ ràng với một từ lệnh chứa nhiều hơn một lệnh được phát song song.
Chúng phụ thuộc vào trình biên dịch tối ưu hóa tốt, trong đó xác định các phụ thuộc và cơ hội song song, bỏ các hướng dẫn vào nhiều vị trí có sẵn trên mỗi từ hướng dẫn.
Kiến trúc VLIW hoạt động khá tốt cho các ứng dụng số vì ops ma trận / mảng có xu hướng mang lại cơ hội cho sự song song rộng rãi. Itanium đã có một thị trường thích hợp trong các ứng dụng siêu máy tính trong một thời gian và có ít nhất một kiến trúc siêu máy tính - Multiflow TRACE - được sản xuất bằng cách sử dụng một loại ISA này.
Bộ nhớ và bộ nhớ đệm
Các CPU hiện đại nhanh hơn nhiều so với bộ nhớ, vì vậy việc đọc trực tiếp từ bộ nhớ có thể tạo ra hàng trăm trạng thái chờ để chặn CPU cho đến khi truy cập bộ nhớ hoàn tất. Bộ nhớ đệm, hiện được thực hiện trong nhiều lớp, giữ các vị trí bộ nhớ được sử dụng gần đây nhất trong bộ đệm. Vì CPU thường dành phần lớn thời gian để thực thi mã trong các vòng lặp, điều này có nghĩa là bạn có được tỷ lệ sử dụng lại tốt các vị trí bộ nhớ mà bạn đã sử dụng gần đây. Khách sạn này được gọi là 'địa phương của tài liệu tham khảo.'
Nơi bạn có được địa phương tham chiếu, CPU có thể hoạt động ở tốc độ gần tối ưu. Bộ nhớ cache bị trượt xuống cấp độ tiếp theo phát sinh một số trạng thái chờ; bộ nhớ cache bị mất xuống bộ nhớ chính có thể phải chịu hàng trăm.
Do đó, thông lượng thực tế của chip CPU có thể phụ thuộc rất nhiều vào hiệu quả của các mẫu truy cập bộ nhớ. Toàn bộ cuốn sách đã được viết về tối ưu hóa mã cho điều này, và đó là một chủ đề phức tạp theo đúng nghĩa của nó.