RISC

RISC (viết tắt của Reduced Instructions Set Computer - Máy tính với tập lệnh đơn giản hóa) là một phương pháp thiết kế các bộ vi xử lý (VXL) theo hướng đơn giản hóa tập lệnh, trong đó thời gian thực thi tất cả các lệnh đều như nhau. Hiện nay các bộ vi xử lý RISC phổ biến là ARM, SuperH, MIPS, SPARC, DEC Alpha, PA-RISC, PIC, và PowerPC của IBM.

Định hướng thiết kế RISC

Ý tưởng bắt đầu khi người ta nhận thấy rất nhiều tính năng trong các bộ VXL vốn được thiết kế nhằm giúp công việc lập trình trở nên dễ dàng hơn lại thường bị các phần mềm bỏ sót. Những tính năng này thông thường cần vài chu kỳ máy để thực thi. Cộng thêm sự cách biệt về hiệu suất giữa các CPU và bộ nhớ chính đã dẫn đến nhiều kỹ thuật hoặc nhằm tổ chức lại quá trình thực thi trong bộ xử lý hoặc nhằm giảm bớt số lần truy xuất bộ nhớ.
Những năm cuối của thập niên 1970, các nhà nghiên cứu của IBM (và cả một số dự án khác) đã chứng minh rằng phần lớn các phương pháp đánh địa chỉ trực giao thường bị các chương trình bỏ qua. Đây chính là kết quả không mong đợi do sử dụng các trình biên dịch cấp cao thay vì sử dụng hợp ngữ. Các trình dịch tại thời điểm đó không đủ khả năng để tận dụng hết tính năng của các bộ VXL CISC; chủ yếu là do sự khó khăn trong thiết kế trình dịch. Trình biên dịch càng trở nên phổ biến thì các tính năng này lại càng bị bỏ quên.
Một nghiên cứu khác cũng chỉ ra rằng những tính năng này ít được dùng vì thực ra chúng được thực thi chậm hơn một nhóm lệnh cùng thực hiện tác vụ đó. Đây giống như một nghịch lý của quá trình thiết kế VXL, người thiết kế không có đủ thời gian để tối ưu cho tất cả các lệnh, do đó họ chỉ chú trọng đến những lệnh thường được sử dụng nhiều nhất. Ví dụ cụ thể nhất có lẽ là lệnh INDEX của CPU máy VAX, sẽ nhanh hơn từ 45% đến 60% nếu lệnh này được thay bằng một nhóm các lệnh VAX đơn giản khác.
Cũng trong thời gian này, CPU bắt đầu hoạt động nhanh hơn bộ nhớ. Thậm chí trong thập niên 1970, người ta cho rằng điều này sẽ còn tiếp tục không dưới 1 thập niên nữa, và tới lúc đó CPU sẽ nhanh hơn bộ nhớ hàng chục tới hàng trăm lần. Có lẽ đã đến lúc CPU cần thêm nhiều thanh ghi (sau này gọi là cache) để có thể hoạt động ở tốc độ cao hơn. Những thanh ghi và bộ nhớ đệm mới sẽ cần khoảng trống trên bo mạch hoặc trên chip được tạo ra nếu giảm sự phức tạp của CPU.
Tới lúc này, một phần đóng góp cho kiến trúc RISC đến từ thực tế đo đạc những chương trình trong thế giới thực. Andrew Tanenbaum từ tổng kết rất nhiều đo đạc này đã chỉ ra rằng hầu hết những CPU lúc bấy giờ đều được thiết kế thừa quá mức. Ví dụ, ông cho rằng 98% các hằng hoàn toàn có thể biểu diễn bằng 13 bit, trong khi đó các CPU được thiết kế theo bội số của 8 thường là 8, 16 hoặc 32. Do đó nếu CPU cho phép các hằng được lưu trong những bit dư của mã lệnh sẽ làm giảm đi rất nhiều lần truy xuất bộ nhớ. Thay vì phải đọc từ bộ nhớ hay từ thanh ghi, các hằng đã ở ngay đó khi CPU cần, vì thế quá trình thực thi sẽ nhanh hơn. Tất nhiên điều lại này yêu cầu mã lệnh phải thật nhỏ để những lệnh 32 bit có thể chứa được những hằng tương đối lớn.
Những chương trình trong thực tế thường tốn phần lớn thời gian để thực hiện một số tác vụ đơn giản, do đó một số nhà nghiên cứu hướng tới việc tối ưu hóa những tác vụ này. Do xung nhịp (clock rate) của CPU bị giới hạn bởi thời gian thực hiện lệnh chậm nhất, nên nếu tối ưu lệnh này (có thể bằng cách giảm số phương pháp đánh địa chỉ mà nó hỗ trợ) sẽ khiến cho toàn bộ tập lệnh được thực thi nhanh hơn nhiều. Mục tiêu của RISC chính là đơn giản hóa các lệnh, để mỗi lệnh có thể được thực thi chỉ trong 1 chu kỳ máy. Việc tập trung đơn giản hóa các lệnh đã cho ra đời các loại "Máy tính với tập lệnh được đơn giản hóa" - RISC.
Rất tiếc cụm từ "Máy tính với tập lệnh được đơn giản hóa" thường bị hiểu sai là máy tính với tập lệnh ít hơn các máy tính khác. Thực ra RISC lại thường có tập lệnh rất lớn. Cũng từ khuynh hướng đơn giản hóa đó, một số thiết kế thú vị ra đời như MISC (Minimal Instruction Set Computer - Máy tính với tập lệnh tối thiểu) hay OISC (One Instruction Set Computer) với những máy tính như Transport Triggered Architectures, trong khi các thiết kế khác đi sâu vào vấn đề Turing tarpit.
Điểm khác biệt thực sự giữa RISC so với CISC là nguyên tắc thực hiện mọi thứ trong các thanh ghi, đọc và lưu dữ liệu vào các thanh ghi. Do đó để tránh hiểu lầm nhiều nhà nghiên cứu thích dùng thuật ngữ load-store.
Qua thời gian, các kỹ thuật thiết kế cũ được gọi là CISC (Complex Instruction Set Computer – Máy tính với tập lệnh phức tạp), dù rằng thuật ngữ này thường chỉ được dùng với mục đích so sánh.
Giờ đây để thực hiện cùng một công việc, chương trình được viết với những lệnh đơn giản thay vì với một lệnh phức tạp, tổng số các lệnh phải đọc từ bộ nhớ nhiều hơn do đó cũng mất nhiều thời gian hơn. Tại thời điểm đó người ta chưa biết khuyết điểm này có còn đảm bảo sự ưu việt hơn về hiệu suất của RISC hay không, và hầu như đó cũng đã là một cuộc chiến dai dẳng về khái niệm RISC.

Cùng lúc đó...

Trong khi những khái niệm về RISC đang dần được hoàn thiện thì những ý tưởng nhằm cải tiến hiệu suất cho các CPU cũng bắt đầu ra đời.
Những năm đầu thập niên 1980, người ta sợ rằng, về lý thuyết, công nghệ thiết kế VXL đã đạt đến giới hạn. Sự cải tiến chỉ còn có thể thực hiện với công nghệ bán dẫn, như giảm kích thước của các transistor hoặc dây nối trên chip. Dù độ phức tạp của chip không đổi nhưng với kích thước nhỏ hơn nó vẫn có thể hoạt động ở tốc độ cao hơn. Cũng có nhiều cố gắng để thiết kế các chip xử lý song song. Thay vì làm cho chip nhanh hơn người ta làm cho nhiều chip có khả năng cùng chia sẻ các tác vụ. Tuy nhiên lịch sử đã chứng minh rằng nhận định lúc đầu là sai lầm, rất nhiều ý tưởng ra đời cuối thập niên 1980 đã cải tiến một cách toàn diện hiệu suất của các VXL thời kỳ này.
Ý tưởng đầu tiên có lẽ là "kênh dẫn" (pipeline). Đây là một kỹ thuật nhằm chia nhỏ quá trình thực thi một lệnh thành nhiều bước, và các bước khác nhau của các lệnh khác nhau có thể được thực thi đồng thời. Một bộ xử lý thông thường đọc một lệnh, giải mã nó, đọc những vùng nhớ lệnh đó cần, thực thi lệnh, trả kết quả về. Với kỹ thuật "kênh dẫn", bộ xử lý có thể đọc một lệnh ngay sau khi nó đọc xong lệnh trước đó, tức là nó vừa giải mã một lệnh vừa đọc lệnh kế tiếp, tới chu kỳ tiếp theo bộ xử lý sẽ làm việc với ba lệnh cùng lúc, và cứ thế tiếp tục. Dù thực tế không có lệnh nào được thực thi nhanh hơn, nhưng do lệnh theo sau sẽ hoàn thành ngay sau khi lệnh trước hoàn tất nên đây là một giải pháp rất hiệu quả nhằm tận dụng tối đa tài nguyên của các VXL.
Một phương án khác là dùng nhiều đơn vị xử lý song song trong cùng một bộ xử lý. Thay vì thực thi một lệnh bộ xử lý sẽ tìm cách thực thi đồng thời lệnh kế tiếp trong một đơn vị xử lý khác. Tuy nhiên đây là một phương án khó vì nhiều lệnh đôi khi lại phụ thuộc vào kết quả của lệnh trước nó.
Cả hai phương pháp trên hướng tới việc cải tiến bằng cách tăng độ phức tạp của CPU. Vì không gian trên chip là có hạn do đó để thêm những tính năng mới này người ta cần bỏ đi những tính năng khác. Vì thế RISC là kẻ được hưởng lợi trước tiên do về cấu trúc nó đơn giản hơn CISC rất nhiều. Những thiết kế RISC đầu tiên nhanh chóng được thêm những tính năng mới giúp chúng vượt qua những chip CISC tương ứng. Lúc này người ta bắt đầu tính đến việc thêm những tính năng này vào những chip CISC trong khi vẫn đảm bảo kích thước của chúng, công việc này kéo dài suốt những năm cuối thập niên 1980 và đầu 1990.
Dù ở bất kỳ cấp độ nào, đơn vị logic của một chip RISC bao giờ cũng cần ít transistor hơn so với của một chip CISC. Điều này giúp người thiết kế có rất nhiều sự linh hoạt, ví dụ họ có thể:
1. Tăng số lượng thanh ghi. 2. Sử dụng các phương pháp tối ưu để tăng mức độ xử lý song song bên trong CPU (pipeline, superscalar) 3. Tăng kích thước cache 4. Thêm các tính năng như I/O, timer v.v… 5. Thêm các bộ xử lý vector. 6. Tận dụng các dây chuyền công nghệ cũ, trong khi với CISC điều này rất khó khăn do kích thước chip lớn hơn 7. Cung cấp những chip cho những ứng dụng có yêu cầu cao về thời gian sử dụng pin hoặc về kích thước chip.
Những đặc điểm thường thấy trong 1 chip RISC: 1. Định dạng chuẩn mã lệnh (ví dụ lệnh có chiều dài cố định, các bit của mã lệnh luôn nằm ở vị trí cố định trong mã lệnh) sẽ làm quá trình giải mã lệnh đơn giản hơn. 2. Các thanh ghi đồng nhất, do đó chúng có thể được sử dụng thay thế nhau trong mọi tình huống (tuy nhiên các thanh ghi dành cho số nguyên và số thực dấu chấm động vẫn phân biệt nhau). 3. Cách đánh địa chỉ đơn giản. Để có những phương pháp đánh địa chỉ phức tạp cần kết hợp với các phép toán số học. 4. Hỗ trợ rất ít kiểu dữ liệu (một số chip CISC có thể có cả các lệnh thao tác với chuỗi, xử lý số phức hoặc ma trận. Những lệnh như thế chẳng bao giờ tồn tại trong 1 chip RISC lý tưởng).
Ngày nay, một số kiến trúc RISC được xây dựng dựa kiến trúc Harvard (như dòng [SH-4] của Renesas), trong đó bus dữ liệu và bus chương trình tách rời nhau. Điều này giúp cho quá trình đọc dữ liệu và mã lệnh có thể xảy ra đồng thời do đó có khả năng nâng cao hiệu suất của VXL.
Một trong những điểm yếu của các VXL RISC thế hệ đầu tiên là hiệu ứng branch delay slot. Hiệu ứng này xảy ra khi có 1 lệnh nhảy có điều kiện, lúc đó dù có thực hiện nhảy hay không thì một hoặc một số lệnh theo sau vẫn được thực thi do các lệnh này đã được đưa vào pipeline trong lúc lệnh nhảy đang được xử lý. Điều này gây ra một khoảng thời gian trễ khi thực thi lệnh nhảy có điều kiện. branch delay slot không những xuất hiện trong những VXL RISC như MIPS, PA-RISC và SPARC mà còn cả trong các DSP như µPD77230 hoặc TMS320C3x. Tuy nhiên ngày nay trong các thiết kế RISC hiện đại người ta đã có thể loại bỏ được hiệu ứng này.

Những RISC đầu tiên

VXL RISC được biết đến đầu tiên là siêu máy tính CDC 6600 được Jim Thornton và Seymour Cray thiết kế năm 1964, nó có 74 mã lệnh (8086 có 400 mã lệnh) cộng với 12 máy tính đơn giản được gọi là "bộ xử lý ngoại vi" để xử lý I/O. CDC 6600 sử dụng kiến trúc load-store, nó hỗ trợ 2 phương pháp đánh địa chỉ, có 11 đơn vị được "kênh dẫn hóa", năm đơn vị đọc dữ liệu và 2 đơn vị để lưu dữ liệu (bộ nhớ của nó được tổ chức theo bank do đó các đơn vị đọc ghi có thể hoạt động đồng thời). Tốc độ xung đồng hồ/lệnh nhanh hơn 10 lần so với tốc độ truy xuất bộ nhớ.
Một máy tính khác được thiết kế trên với kiến trúc load-store là Data General Nova. Đây là một máy tính nhỏ 16 bit được thiết kế năm 1968 bởi 1 công ty Mỹ tên là Data General.
Tuy nhiên VXL RISC được biết nhiều nhất lai đến từ một dự án được tài trợ bởi chương trình VLSI (Very Large-Scale Integration) của DARPA (Defense Advanced Research Projects Agency). Chương trình trên đã cho ra đời rất nhiều cải tiến liên quan đến thiết kế, sản xuất chip và cả đồ họa máy tính.
Dự án RISC của Đại học Caifornia, Berkeley bắt đầu năm 1980 dưới sự hướng dẫn của David Patterson với mục đích nâng cao hiệu suất của các VXL dựa trên kỹ thuật pipeline và register windows. Một VXL thông thường có khá ít thanh ghi, các chương trình có thể tùy ý sử dụng các thanh ghi đó bất cứ lúc nào. Còn đối với các VXL sử dụng kỹ thuật register windows, có rất nhiều thanh ghi trong VXL nhưng chương trình chỉ sử dụng cùng lúc một tập hợp nhỏ các thanh ghi. Vì thông thường mỗi lần gọi 1 chương trình con, VXL cần lưu lại giá trị một số thanh ghi và sau đó hồi phục lại các thanh ghi đó khi thực hiện lệnh return. Vì vậy bằng cách chuyển từ tập thanh ghi này sang tập thanh ghi khác (chuyển cửa sổ) chương trình có thể thực hiện các lệnh gọi hàm hoặc lệnh trả về một cách nhanh chóng.
Dự án RISC cho ra đời VXL RISC-I năm 1982. VXL này chứa 44.420 transistor (so với 100.000 transistor cho 1 VXL CISC), với 32 lệnh nhưng hoàn toàn vượt xa các VXL đơn chip cùng thời. VXL RISC-II ra đời năm 1983 với 39 lệnh, chứa 40.760 transistor và nhanh gấp 3 lần RISC-I.
Cũng khoảng thời gian đó John L. Hennessy thực hiện dự án MIPS ở Đại học Stanford năm 1981. MIPS hầu như chỉ tập trung vào kỹ thuật pipeline nhằm tận dụng tối đa khả năng của các VXL. Cho dù đã được sử dụng trước đó, nhưng với MIPS, kỹ thuật này đã thực sự được cải tiến vượt bậc. Nhưng vấn đề quan trọng nhất ở đây, và có lẽ cũng phiền toái nhất, là nó đòi hỏi tất cả các lệnh bắt buộc phải được thực thi trong 1 chu kỳ máy. Nếu đáp ứng được yêu cầu này, pipeline có thể hoạt động ở tốc độ rất cao và đây hầu như là yếu tố quyết định đến tốc độ của VXL. Tuy nhiên nó cũng có mặt trái là phải bỏ đi rất nhiều lệnh có ích như nhân, chia.
Hầu hết các dự án kể trên đều nhằm mục đích cải tiến các kỹ thuật hiện có, phải chờ tới năm 1975, dự án đầu tiên nhằm cho ra đời 1 chip RISC hoàn chỉnh mới được thực hiện ở IBM. Được đặt tên theo số của ngôi nhà nơi dự án được thực hiện, dự án này đã cho ra đời họ VXL IBM 801 vốn được sử dụng rộng rãi trong các phần cứng của IBM.
Trong những năm đầu, các dự án chủ yếu chỉ được biết đến trong các trường đại học. Đến năm 1986, tất cả các dự án về RISC bắt đầu cho ra đời sản phẩm. Ngày nay hầu hết các chip RISC, đều được thiết kế dựa trên kiến trúc RISC-II của Berkeley.

Thuật ngữ thay thế

Trải qua một thời gian dài, tập lệnh của các RISC ngày càng tăng. Vì thế nhiều người bắt đầu sử dụng thuật ngữ "load-store" để mô tả RISC CPU, vì đây là mấu chốt của kiến trúc RISC. Thay vì CPU xử lý rất nhiều phương pháp đánh địa chỉ, kiến trúc load-store sử dụng những đơn vị chuyên biệt để thực hiện những dạng rất đơn giản của các quá trình load và store. CISC CPU vì thế được gọi là "register-memory" hoặc "memory-memory".