為什麼RISC指令集架構的編譯器必須“更聰明”

為什麼RISC指令集架構的編譯器必須“更聰明”

精簡指令集架構(RISC)旨在減少指令數量,進而提高效能。這種方法的唯一缺點是編譯器必須「更聰明」。

當我的講師說「編譯器必須更聰明」時,她的意思是什麼?

答案1

老實說,RISC 代表「降低指令集複雜性」——指令數量不一定減少,但就執行它所需的機器週期和閘數量而言,每條指令都更簡單(或微碼儲存)致力於實現它。

該理論(至少部分實現)是,透過減少控制邏輯的數量,可以為暫存器和資料路徑提供更多的晶片空間。因此,RISC 機器的暫存器數量通常是 CISC 機器的 2-4 倍。

這使得編譯器能夠完成省略的控制邏輯的工作,包括“調度”操作(對它們進行排序),這樣,您就不會連續執行兩次添加,而是先執行添加,然後執行移位(然後再執行)不同的暫存器),因此加法器和移位器都得到了最佳利用。編譯器還必須管理暫存器集,以優化暫存器的進出操作,最大限度地減少儲存存取。另外,編譯器必須知道如何最好地利用奇怪的指令(例如“左移一位和帶有文字的掩碼”),因為這些指令通常有一些(也許是奇怪的)場景,它們相對強大。

因此,良好的 RISC 編譯器產生的指令實際上不可能被破解。即使您很了解指令集,找出半小時前的某個值仍然在暫存器 12 中也是很困難的,即使不是一直在發生複雜的移位和遮罩操作。

(對於那些顯然不相信我知道我在說什麼的人來說,我第一次涉足 RISC 是在 70 年代初,當時是 IBM 801,當時我與 George Radin 和 Marty Hopkins 很熟絡。 .)

答案2

由於 RISC CPU 中的指令較少,因此單一高階語句很好地轉換為單一機器語言操作碼的機會較小。

RISC CPU 的同義詞是「載入-儲存架構」。基本上,這意味著實際工作的 RISC 指令通常僅在寄存器上工作。如果您想要處理儲存在 RAM 中的值,則必須發出明確 LOAD 指令,而 CISC CPU(例如 x86)具有自動執行此操作的指令。 RISC CPU 歷來擁有比 x86 更多的寄存器 - 良好的程式碼將很好地管理可用寄存器以避免不必要的記憶體訪問,這意味著編譯器需要考慮到這一點。

另一件事是,RISC CPU 通常只提供連結所需的最低「基礎設施」。

例如,x86 CPU 有一個「堆疊」的概念,您可以在其中壓入值,然後將它們「彈出」(有PUSH指令POP)。還有一條CALL指令 - 它將當前指令指標壓入堆疊,然後跳到目標位址 - 通常是子程式或函數。然後可以稍後發出指令RET以彈出已儲存的指令指標並從原始函數恢復。嵌套子程序很方便,可以方便地使用PUSHPOP為子程序添加參數。

例如,在 MIPS 上,您所擁有的只是jal「跳轉和連結」- 它將當前指令指標放入暫存器中,然後跳到該位址。如果您想要執行堆疊或 x86CALL指令之類的操作,則必須手動執行。這需要編譯器提供更多智慧。

答案3

CISC(複雜指令集運算)處理器比 RISC(精簡指令集運算)處理器具有更大範圍的可用指令。

CISC 中的乘法範例為:MUL 1:3, 4:2(乘以 1:3 和 2:4)。此指令會將位置 1:3 的值載入到其暫存器中,載入位置 4:2 的值,將它們相乘並將其儲存回 1:3

RISC CPU 可能必須:

  • 負載 A,1:3
  • 負載 B,4:2
  • 產品A、B
  • 商店 1:3,A

...4 個 RISC 運算到 1 個 CISC 運算。

因為 RISC 需要更多的運算,即使是最簡單的乘法計算 - 想像一下視訊渲染或遊戲等事情需要多少工作?

考慮到這一點 - 根據程式設計師輸入的程式碼建立軟體的編譯器需要“更聰明”,以便它們知道如何簡化 RISC 架構的複雜程式碼和複雜命令。

希望這是有道理的 為了進一步閱讀,可能值得一看: http://www.engineersgarage.com/articles/risc-and-cisc-architecture?page=5

相關內容