理論上不需要註冊;所有微處理器在沒有寄存器的情況下仍然可以工作。但是,這種看似微不足道的添加幫助使微處理器更加高效。
為什麼我們沒有更多的寄存器來進一步從中受益?它們只是片上存儲器,可以想像添加起來不是很困難嗎?是什麼因素影響了寄存器的數量而不是原來的數量,比如說多了十倍?
理論上不需要註冊;所有微處理器在沒有寄存器的情況下仍然可以工作。但是,這種看似微不足道的添加幫助使微處理器更加高效。
為什麼我們沒有更多的寄存器來進一步從中受益?它們只是片上存儲器,可以想像添加起來不是很困難嗎?是什麼因素影響了寄存器的數量而不是原來的數量,比如說多了十倍?
有幾個因素:
高性能微體系結構使用寄存器重命名。也就是說,物理寄存器的數量大於體系結構可見的寄存器的數量,並且它們能夠跟踪它們的獨立用途。
將寄存器數量加倍不會使性能提高一倍。 ISTR(來自計算機體系結構,一種量化方法)從16個寄存器增加到32個寄存器帶來了大約10%的改善,前提是假定增加不會帶來不利影響(這是非常樂觀的假設)。
體系結構可見的寄存器具有成本。例如:
雖然寄存器和RAM都是內存,但是它們以不同的方式訪問,以反映訪問它們的成本(在芯片面積或隱藏時鐘週期內)。
寄存器與ALU緊密綁定,可以擔當數據源,接收器,修飾符等的許多角色。因此,它們需要大量的寬復用連接。在某些架構中,我們可以寫成R1 < = R2 + R3,而這恰好是在單個時鐘週期內發生的。每個寄存器都用操作碼直接尋址,這種尋址是非常有限的資源。
由於寄存器的實現成本很高,因此在大多數體系結構中,寄存器的數量通常限制在10/20的數量級。
RAM鬆散地綁定到CPU,通常通過單個共享連接進行引導。這使得實現大量RAM的成本大大降低。 RAM地址通常來自寄存器存儲的地址,因此不會佔用大量指令寬度。
SPARC是一種有趣的體系結構,具有72到640個64位寄存器,具有32個寄存器上下文,可以通過重疊進行移位,以通過參數傳遞進行快速子例程調用。您往往不會在需要成本的PC和服務器中找到它們,例如在99.999%的應用程序中。
必須在說明內找到寄存器。如果寄存器很多,指令會更長。如果寄存器很多,則為中斷服務保存和恢復寄存器內容需要更多時間。
大多數情況下,寄存器的數量是成本,複雜性和實用性之間的折衷。
寄存器被實現為多端口靜態RAM,這使其比其他存儲選項成本更高(芯片面積)。
然後它們與處理器的指令集耦合,增加寄存器的數量會增加指令集的複雜性。因此,如果您想與指令集保持兼容,就不能僅僅增加下一代處理器中可用寄存器的數量來提高效率,這些程序就不會使用它們。
接下來,您真正需要多少寄存器?它們的用途是有限的。考慮您編寫了一種算法,該算法在1024字節上執行一些數學運算,比方說乘以5。使用當前的寄存器計數,最終會得到類似:
load操作數1 = 5
加載地址
循環:加載操作數2 = byte1 @ address
將Register1乘以Register2
儲存結果
遞增地址
如果地址=結束goto endLoop
跳躍循環
endLoop:
現在,如果您將擁有1024個寄存器並將所有數據存儲在其中,則程序將如下所示:
將Register1與Register2相乘
將Register1乘以Register3
將Register1乘以Register4
將Register1乘以Register5
將Register1與Register6相乘
...
由於每個指令都是不同的指令,因此每個指令都必須寫出。因此,您所需的程序存儲器正在爆炸。在意識到這一點之後,您可能想要引入一些指令,例如將register1與register(2到256)乘以
。但是什麼時候停止,您會提供所有組合的說明嗎?
所以也許我們目前可用的數字是成本,複雜性和實用性之間的一個很好的權衡。
寄存器非常昂貴。非常貴。與其說寄存器本身,不如說是寄存器之間的所有連接。假設您有一條指令reg1 = reg2 + reg3。要實現這種 fast ,您需要在一個週期內從兩個寄存器讀取數據,並在第二個週期內寫入另一個寄存器。現在,如果您有一個處理器每個週期可以執行多個指令(例如3條指令),則您需要能夠每個週期從6個寄存器讀取數據,並將數據寫入3個寄存器。那是非常可怕的,非常快的連接。
當然,您可以只使用更多的晶體管。問題是:速度下降。您需要更多的硬件來從更多的寄存器中進行選擇。寄存器文件的空間變大。所有這些使事情變慢。因此,使用相同的技術,您可能能夠擁有16個寄存器並以2,600 MHz運行,或者有32個寄存器並以2,400 MHz運行。現在,額外的寄存器必須彌補時鐘速度的大幅下降。
什麼因素影響寄存器的數量
寄存器,高速緩存,RAM均使用不同的存儲技術實現。
不同技術的不同之處
一個例子:CPU中的內部寄存器是靜態隨機存取存儲器,而計算機主存儲器是動態隨機存取存儲器
使用6晶體管電路實現靜態RAM二進制單元,而使用電容器和晶體管實現動態RAM二進制單元。比較SRAM和DRAM
因此,增加快速,昂貴,密度較小的內存的數量並不是實際的事情。實際上,我們可能會使用其中的一些,編寫良好的程序會將最常用的數據存儲在這些快速寄存器中,而較不常用的數據則存儲在較慢的內存中。
寄存器中的地址包含在一條指令中,該指令根據可以表示該地址的位數來限制可訪問寄存器的數量。例如,在MIPS架構中,32位長度的指令僅保留5位來表示可訪問寄存器的地址,這將寄存器的數量限制為2 5 sup> = 32個寄存器。增加寄存器的數量將需要增加指令長度,以包括足夠的位來訪問所有寄存器。
如果您查看處理器的指令集,則有多種將它們分組的方法。例如,所有 ADD
指令可能會與所有 XOR
指令分組在一起。
在同一指令的每一組中,可能有一些版本在存儲器或寄存器上運行。正是這個子分組有效地定義了處理器擁有的寄存器數量。
作為一個8位的假設示例,假設 $ Ax
指令可能是 ADD
指令,而 $ Cx
可能是 XOR
指令。通過這種設計,只剩下四個位來定義操作數!
$ x0
可以是累加器本身) 當然,我們已經過了8位指令集。但是,這種邏輯過去仍在幫助定義寄存器集-將來它將繼續這樣做。
編輯(按要求)
說指令的高四位是: ADD
, SUB
, XOR
, MOV
, CMP
等。這裡有16種可能性。然後,對於那些有意義的寄存器間指令(例如 ADD Rx,Ry
),您需要指定 Rx
和 Ry
。假設接下來的兩位是 x
,最後兩位是 y
。因此:
ADD R1,R2 = >'ADD'+'R1'+'R2'= > $ A0 + $ 04 + $ 02
只有兩個位可以定義一個這樣的寄存器,總共只有四個寄存器!
順便說一句,您會注意到某些寄存器組合沒有意義。例如, MOV Rx,Rx
(不執行任何操作)和 SUB Rx,Rx
(始終生成 0
)。這些可能成為特殊情況的說明:
SUB Rx,Rx
可能變成 NOT Rx
-單操作數指令。 MOV Rx,Rx
可能會成為 MOV
指令,該指令將第二個字節作為立即值,解釋為 MOV Rx,#$ yy
。通過這種方式,您可以“玩”指令圖,為其他無用或無意義的指令填充空洞,從而為程序員提供更大的指令集。但最終,指令集定義了寄存器集。
如今,英特爾正在使用數千個寄存器-每個CPU內核數百個。但是,存儲在CPU上的最大數據量是在緩存中,這間接地回答了這個問題。緩存是分層組織的,其中較小的快速L1緩存和較慢的L2和L3緩存距離較遠。從某種意義上說,寄存器文件是L0,甚至比L1還要快,但還要更小。因此,您可以增加寄存器的數量,但這可能會減慢它們的速度。