先將 RISC 架構 CPU 獨有的特色列於下方:
- 指令集精簡。
- 指令管線步驟較多。
- 擁有大量的暫存器。
- 僅使用簡單的「Load / Store」來存取記憶體。
首先,它的指令集很小。如果拿人類的語言來說,如果把兩個語言的「字典」拿過來比厚薄,比較厚的那個語言,所使用的詞彙也比較多,我們就稱該語言的「指令集」比較大。反之,如果某個語言的「字典」,比其它語言薄,我們就說該語言的「指令集」比較小。一般的 RISC 架構 CPU,指令集大概都在 50 個指令上下。這跟 CISC 架構動輒 150 幾個指令比較起來,那可是三倍之差。拿嵌入式系統中,最被廣泛使用的 ARM 系列,也才 45 個指令而已。您可以想像,嵌入式系統那麼千變萬化的功能,居然只要交疊使用 45 個指令,就可以表達出來。想想,當初制定這 45 個指令的人,該是何等聰明睿智之士啊!
其次,它所擁有的「指令管線」步驟,比 CISC 架構要多出許多。如果您對「指令管線」的概念不是很清楚,建議參考一下筆者的這篇文章。看完後,您就了解一般 CPU 執行指令,是學習生產線的作法,把 CPU 內部切成許多很小的獨立單元,讓負責特定任務的單元,做完一個指令後,就可以緊接著做第二個指令。筆者很喜歡拿「工廠生產線」與「家庭代工」來比喻「有指令管線」與「無指令管線」的情況。假設現在要包裝一個罐頭禮盒有四個步驟:「拿盒子」、「擺罐頭」、「套熱塑套」、「加熱縮膜」。如果是家庭代工,這四個步驟可能都是一個人在做。如果是工廠生產線,可能會找四個人,一個人負責一項工作。則「家庭代工」可能要 5 分鐘才能包裝出一個罐頭禮盒,「工廠生產線」可能 30 秒就能生產一個,因為兩個禮盒間所差的時間,只有最後一位「加熱縮膜」所需要的時間而已。指令執行也是這樣。如果使用「指令管線」,完成上一個指令與下一個指令的時間差,取決於最後一個步驟所需的時間。
從上面的說明,我們就知道,指令管線的步驟越多,負責每個步驟的獨立單元就越輕鬆,完成兩個指令的時間差就越少。所以,RISC 架構的第二個特色,就是比 CISC 有更多的指令管線步驟。
RISC 架構多加許多指令管線步驟,有什麼好處呢?首先,由「上篇:何謂 RISC 」這篇文章中得知,RISC 盡量保證每個指令的執行時間都差不多,以防管線塞車。不像 CISC,由於它的指令執行時間不一定,有可能造成管線塞車,所以並無法從「指令管線」這種架構中得到多少好處。RISC 則不然!既然 RISC 不太會造成管線塞車,所以將管線步驟加多,很明顯會給 RISC 架構帶來不少好處。也因此,設計師就把管線步驟切得更細,以便從中取得更快的執行效率。
第三個 RISC 處理器有的特色,就是與 CISC 相比,它擁有大量的暫存器。所謂的暫存器,就是存在於 CPU 內的一小塊記憶體。只不過它用了特殊的材質製作(以正確術語來說,是使用了 SRAM),可以讓它的工作速度,與主記憶體相比(主記憶體大多使用 DRAM 製作),快了許多。如此一來,才跟得上 CPU 的高速度。
RISC 使用大量暫存器的原因,來自於它想掩蓋的一個缺點。由「上篇:何謂 RISC」得知,RISC 不提供所謂的「好用指令」。舉例來說,某些 RISC 晶片可能不提供「乘法」指令,而是要求程式師用連續的加法,來取代乘法。因為這類「好用指令」送入 CPU 中,通常會在瞬間引發大量的運算,造成管線塞車。但如果改成連續的加法,就會使得運算量分散在數個指令之間,不致於在短時間爆出大量運算要求。這有點像抓一把花生,一下子要塞進窄口瓶裡,可能辦不到。倘若一次兩三顆、兩三顆的放,反而能把花生順利放入瓶中是一樣的道理。不過本來只需「提取(Fetch)」一次的指令,由於 RISC 是將之寫成好幾道指令,所以 RISC 就比 CISC 多出許多要到慢速的「主記憶體」提取指令的時間。因此,RISC 在 CPU 內部準備了比 CISC 多上好幾倍的暫存器,一口氣從主記憶體提取大量的指令,來彌補它在架構上所造成的缺陷。
第四個 RISC 處理器的特色,就是「簡單的記憶體存取機制」。在 CISC 中,當資料運算完畢後,會儘快寫回主記憶體。因為 CISC 的暫存器個數沒有 RISC 多,暫存器對 CISC 而言是個珍貴資源。但 CISC 工程師也知道,寫回慢速主記憶體這件事,是會嚴重拖垮 CPU 的執行速度的。因此,CISC 工程師開發了很多複雜的「定址模式」(Addressing Mode),好讓 CPU 在最短的時間內,知道這筆資料要寫回哪裡。
說到此處,您或許對「定址模式」這件事,會有點陌生。我稍微說明一下。「定址模式」,就是 CPU 如何找到一塊記憶體在哪裡的一種方法。拿台北市的地址來說,台北市的「定址模式」就有「區、路、段、巷、弄、號、之、樓」八種。比如說:「信義區信義路五段75巷8弄16號之1七樓」。這種系統雖然可以讓我們快速找到要去的地方,比如說,我們可以靠著「段」,在長長的信義路中,找到我們想定位的那一個部分,不過要學會使用這種方法,需要比較長的時間(您覺得沒什麼是因為從小習慣了,不信你找個老外來教他如何看懂台北市地址系統試試看)。
但老外所使用的系統可簡單了。他們只有「路/街」以及「號」、「樓」三種而已。而且他們很習慣把南北向的叫「路(Road)」,東西向叫「街(Street)」。就算路再長,也不會像台北這樣分「一段、二段...」所以他們的地址會出現「百老匯路 7845 號」這麼誇張的門牌數字。他們認為「巷、弄」是一件很模稜兩可的系統。我曾經被一個老外問:如果一條巷子,左邊接信義路,屬於 56 巷,右邊接仁愛路屬於 33 巷,那這條巷子的中間,要算「信義路 56 巷」,還是「仁愛路 33 巷」?他就很驕傲的說,他們根本不用「巷、弄」,中間那條巷子,乾脆給它一個新名字,比如叫做「泰安街」。這樣就可以避免模稜兩可的狀況了。
回到 RISC 與 CISC 的定址模式。RISC 要放資料回主記憶體,只有兩個指令:「Load」負責讀資料到 CPU,「Store」負責寫資料到主記憶體。好處是機制簡單,壞處是沒把記憶體分得更細,要找到一個定點,跟 CISC 比起來沒那麼「一招中的」。這有點像國外的地址系統,想找到「7845」號在「百老匯路」的哪裡,只能從「百老匯路 1 號」為起點,依序慢慢尋找!因為 RISC 處理器內有大量的暫存器,所以資料可以先放在暫存器中,寫入主記憶體只是偶一為之。相反地,CISC 需要暫存器不多,需要常常寫回主記憶體。所以要很複雜的定址系統,好快速找到想定位的記憶體在哪裡。
下次,如果您遇到一個 CPU,它的指令不多(50 個左右)、管線步驟複雜(5 個步驟左右)、暫存器眾多(15 個以上)、定址模式簡單(只有 Load / Store),很有可能它就是一個 RISC 處理器。當然任何規則都有少數的例外,以上準則適用於大部分處理器,但不是所有符合上述條件的處理器,都是 RISC 處理器。
RISC 處理器(上):何謂「RISC」?
RISC 處理器(中):為何嵌入式系統多用 RISC 架構?
RISC 處理器(下):RISC 處理器的四大特色
喜歡這篇文章嗎?喜歡的話請幫忙按一個「讚」喔!
歡迎加入「紀老師電腦教學網」的 Facebook 粉絲團,取得更多資訊喔!
關於作者:
紀俊男,現任和群資訊總經理。曾任職於筌寶電子、趨勢科技、西基電腦、展望電腦等公司。教書經驗約 20 年。專長是程式設計、系統管理、嵌入式系統等領域。您可以在本篇留言與之聯繫、討論、或邀課。
感謝紀老師有趣的說明,RISC三篇看完,腦袋的水管都通了
回覆刪除