Có bao nhiêu chu kỳ đồng hồ để một lệnh RISC / CISC thực hiện?


13

Theo Thiết kế kỹ thuật số và Kiến trúc máy tính của Harris và Harris, có một số cách để thực hiện bộ xử lý MIPS, bao gồm:

Các vi kiến trúc đơn chu kỳ thực hiện toàn bộ một lệnh trong một chu kỳ. (...)

Các multicycle vi kiến trúc hướng dẫn thực thi trong một loạt các chu kỳ ngắn hơn. (...)

Các vi kiến trúc pipelined gây hiệu ứng pipelining với vi kiến trúc chu trình đơn.

Kiến trúc thường được phân loại là RISC hoặc CISC. Từ RISC so với CISC :

Bộ xử lý RISC chỉ sử dụng các hướng dẫn đơn giản có thể được thực thi trong một chu kỳ đồng hồ.

Vì MIPS là kiến ​​trúc RISC, tôi là một người bị nhầm lẫn bởi các định nghĩa ở trên và tự hỏi liệu không có mâu thuẫn nào giữa chúng. Cụ thể hơn:

  1. Nếu một lệnh RISC có thể được chia thành các chu kỳ ngắn hơn (Tìm nạp, Giải mã, ...), làm thế nào chúng ta có thể nói rằng nó chỉ mất một chu kỳ đồng hồ để thực hiện toàn bộ lệnh? Có phải mất một chu kỳ đồng hồ để thực hiện từng bước không?
  2. thực sự mất một chu kỳ đồng hồ để thực hiện một lệnh RISC không? Điều gì xảy ra, ví dụ, nếu xảy ra lỗi bộ nhớ cache và bộ xử lý phải chờ DRAM chậm? Điều này có nên kéo dài thời gian thực hiện lệnh không?
  3. Chính xác thì một chu kỳ hướng dẫn là gì? Đây có phải là thời gian cần thiết để một hướng dẫn kết thúc (tức là một / nhiều chu kỳ đồng hồ)?
  4. Mất bao lâu một lệnh CISC trong chu kỳ đồng hồ / lệnh?

2
Thường không ít hơn một :-).
Russell McMahon

Câu trả lời:


22

Các định nghĩa thực tế của RISC và CISC rất lầy lội và mờ đi bây giờ chúng gần như vô nghĩa. Bây giờ, tốt nhất bạn nên nghĩ về chúng nhiều hơn về "triết lý", theo nghĩa là một kiến ​​trúc CISC có một tập lệnh phong phú hơn với các hướng dẫn riêng lẻ mạnh mẽ hơn (ví dụ DIV và tương tự) trong khi tập lệnh RISC là xương trần và nhanh, và để nó cho trình biên dịch để thực hiện các hoạt động phức tạp. Ngay cả các bộ hướng dẫn CISC có chủ ý (như x86) cũng được dịch thành các hướng dẫn nội bộ trong cả chip Intel và AMD và được triển khai giống như bộ xử lý RISC. Để trả lời câu hỏi của bạn:

  1. Các bộ xử lý RISC hàn lâm ban đầu (và tôi nghĩ có lẽ các phiên bản thương mại đầu tiên) đã thực sự thực hiện một lệnh trong mỗi chu kỳ, bao gồm tìm nạp và giải mã. Điều này là có thể bởi vì các datapath là siêu sạch vì các hoạt động của từng giai đoạn rất đơn giản và được xác định rõ. (sự đánh đổi ở đây chỉ là những hướng dẫn rất đơn giản có thể được thực hiện theo cách này). Một khi nó chạm vào thế giới thực, mọi thứ trở nên mờ nhạt. Những thứ như kiến ​​trúc pipelining và superscalar làm cho việc phân đôi RISC / CISC đơn giản là không thể.

  2. Các chip RISC ban đầu đã cố thực hiện một lệnh trong mỗi chu kỳ và chúng có thể nếu dữ liệu có sẵn trong tệp đăng ký. Tất nhiên, nếu bộ xử lý phải vào DRAM thì sẽ mất nhiều thời gian hơn. RISC là về "cố gắng" để thực hiện một lệnh trong mỗi chu kỳ.

  3. Một chu kỳ hướng dẫn là thời gian giữa các lần tìm nạp.

  4. Trong phụ thuộc rất lớn vào hướng dẫn và kiến ​​trúc tập lệnh. Ngay cả trong kiến ​​trúc CISC, một số hướng dẫn có thể thực thi rất nhanh (ví dụ như dịch chuyển sang trái hoặc phải). Một số thực hiện rất chậm (10 giây chu kỳ trở lên). Kiến trúc VAX (có lẽ là đỉnh cao của triết lý CISC) có các hướng dẫn thực sự phức tạp. Ngẫu nhiên, kiến ​​trúc CISC thường dễ lập trình lắp ráp hơn kiến ​​trúc RISC vì nó gần giống như một ngôn ngữ cấp cao!


5

Câu trả lời ngắn

  1. 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.

  2. 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.

  3. 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ốngKiế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.

  4. 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ó.


3

Đó là một sự đơn giản hóa cho sinh viên.

Mỗi bộ xử lý không tầm thường được pipelined. Có một hướng dẫn quét đơn vị tìm nạp trước ở một đầu, một số đơn vị thực thi ở giữa đang thực hiện công việc thực tế và một đơn vị phát hành chịu trách nhiệm khai báo các hướng dẫn đã hoàn thành sau khi ghi vào sổ đăng ký hoặc bộ nhớ đã kết thúc. Nếu có nhiều đơn vị thực thi (giả sử ALU nguyên, ALU dấu phẩy động và đơn vị vectơ), có thể phát hành (đôi khi được gọi là "nghỉ hưu") cho nhiều hướng dẫn trong mỗi chu kỳ đồng hồ. Làm thế nào một CPU có thể cung cấp nhiều hơn một lệnh trong mỗi chu kỳ? đi sâu vào chi tiết hơn về điều này.

Như bạn nói, nếu có một sự chậm trễ nhớ cache thì sao? Intel Hyperthreading là một giải pháp mới cho vấn đề này: hai rất nhiều thanh ghi trạng thái CPU, một lô logic điều khiển và các đơn vị phát hành. Ngay khi một quầy CPU ảo, trao đổi sang trạng thái khác. (đây là một sự đơn giản hóa quá mức)

Kết quả của việc này là các hướng dẫn sử dụng CPU hiện đại cung cấp nhiều thời gian hướng dẫn của vaguer và việc viết mã thời gian chính xác theo chu kỳ khó hơn nhiều, ví dụ như bạn đang cố gắng xuất video theo thời gian thực từ phần cứng không có khả năng .

(Câu trả lời cụ thể cho "Một lệnh CISC mất bao lâu trong chu kỳ đồng hồ / hướng dẫn?" Là "xem hướng dẫn tham khảo của nhà sản xuất và nó sẽ có thời gian cho mỗi lệnh")


0

Những người khác đã viết rất nhiều tài liệu hay, vì vậy tôi sẽ rút ngắn câu trả lời của mình: Ngày xưa, (những năm 1980 ở đây), bộ xử lý 8 bit trong ngày (6800, 6502, Z80, 6809 và những người khác) đã được xem xét CISC. Một số hướng dẫn có thể thực thi theo 2 kiểu đồng hồ nhưng đây là những cách đơn giản như cài đặt / xóa bit cờ trong thanh ghi trạng thái bộ xử lý. Các hướng dẫn khác có thể mất từ ​​2-6 và thậm chí lên đến 9 chu kỳ đồng hồ để thực thi. Các bộ xử lý này có một số hướng dẫn khá mạnh mẽ, Z80 có một số hướng dẫn xóa khối bộ nhớ sẽ ghi cùng một giá trị vào một chuỗi byte trong bộ nhớ, xóa một khối lớn trong một lệnh, chỉ cần thiết lập một vài thanh ghi và thực thi Hướng dẫn LDIR (tải, tăng và lặp lại).

Bộ xử lý 6502 (từ bộ nhớ) có 56 lệnh nhưng 13 chế độ địa chỉ tạo ra một tập lệnh mạnh mẽ.

RISC đã xuất hiện từ lâu và áp dụng một cách tiếp cận khác, có một số hướng dẫn nhỏ mà tất cả đều thực hiện trong một chu kỳ đồng hồ duy nhất. Các chương trình có xu hướng dài hơn và chiếm nhiều bộ nhớ hơn vì các hướng dẫn rất đơn giản trong các thao tác chúng thực hiện nên bạn cần nhiều hơn chúng.

Nếu tôi nhớ lại chính xác lần thử đầu tiên trong kiến ​​trúc RISC là bộ xử lý transputer hoặc Acorn Risc?


Có thể cho rằng kiến ​​trúc kiểu RISC đầu tiên là CDC 6600 được thiết kế bởi Seymour Cray. Đó là một vài thập kỷ trước khi thuật ngữ RISC được sử dụng rộng rãi. MIPS, ARM và một vài thiết kế bộ vi xử lý RISC khác quay trở lại thời kỳ 1980-1985 với phần cứng thương mại đầu tiên sử dụng các chip này xuất hiện vào khoảng giữa những năm 1980.
Mối quan

Các chip transputer riêng lẻ khá nhanh, nhưng không phải là kiểu kiến ​​trúc giống như người ta thường kết hợp với chip RISC. vi.wikipedia.org/wiki/Transputer#Arch architecture
ConcernedOfTunbridgeWells

Tôi đã có một vài bộ chuyển đổi trong trường hợp chống tĩnh điện, chỉ là một phần của bộ sưu tập vi xử lý lịch sử. Không bao giờ sử dụng chúng, sẽ có rất nhiều niềm vui trong những ngày đó để thử nghiệm với chúng.
Trưởng khoa

@ConcernedOfTunbridgeWells Tôi vừa xem bộ hướng dẫn CDC 6600. Trong khi thiết kế dường như thể hiện (và dự đoán) một số nguyên tắc của RISC, hướng dẫn phân chia điểm trôi nổi mất 29 chu kỳ để thực hiện! Và việc đưa vào một hướng dẫn phân chia là trái với các nguyên tắc RISC điển hình, nhưng cảm ơn vì nhận xét rất thú vị!
crgrace

Các thuộc tính chính của RISC là cơ chế tìm nạp / giải mã / thực thi lệnh pipelined và kiến ​​trúc lưu trữ tải (nghĩa là không có chế độ địa chỉ nào có bộ nhớ ngầm truy cập để tính địa chỉ). Trên thực tế, một số bộ hướng dẫn RISC (ví dụ IBM POWER) thực sự khá lớn nhưng vẫn sử dụng phương pháp tải / lưu trữ để đảm bảo thời gian thực hiện nhất quán.
Mối quan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.