(一)概述:

本章會涉及到硬件設計兩個原則:

Design Principle 1: Simplicity favors regularity.(簡單有利於規律)

Design Principle 2: Smaller is faster.(越小越快)

原則1從更加高層次的解釋瞭為什麼計算機操作需要指令來完成,並且每個指令為什麼具備不多不少並且固定的操作數。

原則2抽象的解釋瞭為什麼寄存器操作數可以很快但是並沒有很多。

(二)計算機的操作:

計算機的一系列操作都是有指令組成的,每個指令都有固定的操作數,並且對於任何一個指令,操作數缺一不可,也不可多。正是因為指令的這種固定並且不多不少的操作數的簡單性,才成就瞭程序的復雜操作,即遵循Design Principle 1: Simplicity favors regularity(簡單有利於規律的硬件設計原則)。這也是為什麼通用處理器肯定都采用指令集架構的,因為通用對應復雜的操作,而完成復雜的操作則需要更加簡單的指令來完成。

(三)計算機的操作數:

寄存器操作常見有三種類型,分別為寄存器操作數,存儲操作數及立即操作數。寄存器作為ALU單元的入口,速度最快,但是數量有限,隻能存儲有限的變量,而對於包含大量變量的數組或結構體則隻能存儲部分變量,這個時候就需要存儲操作數,把數據先放到memroy中,等需要的時候從memory中load進來。而立即操作數則針對程序中的常量而設計,大多數程序都具備對某個常量自增或者自減,這種情況如果采用memory load的方式,則會耗費大量的帶寬在數據load上,所以立即數就是為瞭這個而存在的。

下面分別分析三種操作數:

1.寄存器操作數

算術運算操作數必須被限制在固定的register中才能計算,所以算術運算都需要把參與運算的數據放到寄存器中。

這還是馮諾依曼體系決定的,CPU上的ALU的數據來源就是寄存器,結果也是存放到regster,所以RSIC-V本質上還是基於馮諾依曼架構體系。

RSIC-V比較典型的架構采用32個64bit register(另外比較常用的有32bit 架構的register),寄存器為什麼不是越多越好,而是32個?可以從Design Principle 2: Smaller is faster.(越小越快)理解,過多的寄存器使用的時候就會帶來更大硬件設計延時。

2.存儲操作數

對於數組和結構體,包含大量數據,超出瞭寄存器的數量,這種情況需要把數據存儲在內存中。算術運算操作時,需要數據搬運指令來將當前參與運算的數據從內存搬運到寄存器。

load & store:將數據從memory搬運到register稱做load,相反從register搬運到memory稱做store

軟硬件接口層面理解寄存器操作數和存儲操作數:

程序中的變量數遠遠大於CPU寄存器數量,最終編譯器會把使用頻率最高的放在register,剩餘的存儲在memory中,使用load和store在register和memory之間搬運變量。其中把使用頻率低的變量從register搬運到memory的過程叫做

spilling register(寄存器溢出)。CPU使用寄存器數據比使用memory數據更快,因為memory有更大的延時,並且算術指令,可以直接操作寄存器裡面的兩個變量並進行運算,而memory則需要首先發分別load兩個變量,然後才能進行算術運算操作,總體上進行算術運算memory比register需要更多的訪問時間以及更低的帶寬。同時訪問register比訪問memory有更低的能量消耗。所以為瞭實現高性能以及低功耗,需要足夠的寄存器,並且編譯器能夠高效的使用寄存器。

因為memory的高延時,以及低的energe efficient,導致瞭cache的產生,來彌補memeory的延時以及energe efficient。

3.常量或立即操作數 (Constant or Immediate Operands)

常量或立即數操作是一個偉大的思想的體現:common case faster(常見的case更快)。很多程序中存在常量操作,如果把常量存儲在memory中,就會存在時間和能耗的開銷,比如下面的操作,先從memory中load數組的一個值,這個值是一個常數,取出之後再與X22寄存器的變量相加,結果存放到x22,相當於X22寄存器變量按常量4自增,匯編程序如下:

ld x9, AddrConstant4(x3) // x9 = constant 4

add x22, x22, x9 // x22 = x22 + x9 (where x9 == 4)

常量或者立即數操作就是為瞭解決常量load的,再RSIV中加法支持立即數的加法addi,不需要load常量,可以直接相加,節省時間和能耗,如下:

addi x22, x22, 4 // x22 = x22 + 4

(四)總結

市場上的CPU不管RSIC-V架構還是其它通用計算機架構,其本質還是馮諾依曼架構體系,對於指令集和操作數都是圍繞著性能和能效來發展的。所以對於新的架構,比如RSIC-V,其解決的問題是借鑒其它架構的優缺點發展起來的新型架構,有著更好的擴展性。