处理器基础-要点与实例
0. 引言
本文著力解決如下問(wèn)題:
- 講體系結(jié)構(gòu)的教材[1],著重于體系結(jié)構(gòu)的理論,沒(méi)有實(shí)例參考;講實(shí)現(xiàn)的教材[2],只有實(shí)現(xiàn)細(xì)節(jié),沒(méi)有背后思想。
- 兩種教材都沒(méi)有從應(yīng)用來(lái),再到應(yīng)用中去。
- 多數(shù)讀者需要的是理清楚理念,基于此掌控已有IP,或者進(jìn)行設(shè)計(jì)實(shí)踐和創(chuàng)新,并指導(dǎo)應(yīng)用。
- 計(jì)算機(jī)體系結(jié)構(gòu)有著豐富的內(nèi)容,并且涉及到諸多因素,但是理清楚脈絡(luò)則綱舉目張。
- 理清楚基本結(jié)構(gòu)有助于拓展理解工具鏈、應(yīng)用,有助于開(kāi)發(fā)當(dāng)下針對(duì)AI的流處理器。
?
本文脈絡(luò):
- 先給出應(yīng)用和處理器的基本結(jié)構(gòu)。
- 接下來(lái)分析應(yīng)用需求,明確體系結(jié)構(gòu)需要處理的相關(guān)問(wèn)題,并以此探討體系結(jié)構(gòu)和指令集的思想。
- 以MIPS和ARM為例,實(shí)現(xiàn)基本指令集,并初步探討擴(kuò)展問(wèn)題。
- 回歸到應(yīng)用,探討體系結(jié)構(gòu)如何解決應(yīng)用問(wèn)題,以及對(duì)于軟件編程的啟示。
1. 基本應(yīng)用和處理器結(jié)構(gòu)
1.1 基本處理器結(jié)構(gòu)模型:
注解:
- 典型的處理器由存儲(chǔ)、數(shù)據(jù)路徑、控制路徑三部分組成
- 存儲(chǔ)部分可以進(jìn)一步擴(kuò)展為SRAM/Cache/加速器/IO等,代表系統(tǒng)的輸入輸出
- 處理和運(yùn)算部分可以擴(kuò)展處理器功能如特權(quán)模式,也可以擴(kuò)展處理能力如SIMD/VLIW/MIMD/SP
- 系統(tǒng)按照馮諾依曼存儲(chǔ)程序計(jì)算機(jī)理念運(yùn)行,一般經(jīng)過(guò)取指、譯碼、執(zhí)行、寫回幾個(gè)階段,實(shí)際設(shè)計(jì)和應(yīng)用會(huì)略有不同
1.2 基本應(yīng)用程序的例子
int * i_mem, i_buf, o_mem, o_buf;
int log2(int i)
{}
interrput 2 exception_handler()
{
}
main()
{
??? sys_init();
??????? while(1)??
??????? {?? // --- init
???????????????? int sum = 0;????????????????
???????????????? // --- input
???????????????? if(i_rdy)
???????????????????????? i_mem = i_buf;
???????????????? // --- processing
???????????????? for(i=0; i<len; i++)? {
???????????????? ??? sum = sum + i_mem;???????????????????????
???????????????? }
???????????????? o_mem = log2(sum)????????????????
???????????????? // --- output
???????????????? if(o_rdy)
???????????????????????? o_buf = o_mem;? }
}
注解:
- 程序包含系統(tǒng)初始化、主業(yè)務(wù)流、異常處理三部分
- 主業(yè)務(wù)流按照輸入-處理-輸出的流程運(yùn)轉(zhuǎn)
- 處理部分針對(duì)一定數(shù)據(jù)類型(不同長(zhǎng)度、有無(wú)符號(hào)、精度,可以在指令及操作碼中體現(xiàn),也可以加硬件標(biāo)記?)進(jìn)行處理(算數(shù)、邏輯、移位),對(duì)應(yīng)處理器結(jié)構(gòu)模型的ALU部分。實(shí)際的應(yīng)用任務(wù)經(jīng)過(guò)便一起處理形成指令,處理不能直接支持的指令如大數(shù)運(yùn)算也會(huì)由編譯器組合使用指令實(shí)現(xiàn)。具體應(yīng)用很可能擴(kuò)展如浮點(diǎn)、十進(jìn)制、字符串、圖形操作、超越函數(shù)、ARM CLZ/test指令。
- 馮諾依曼計(jì)算機(jī)按指令逐條進(jìn)行,同時(shí)有循環(huán)、分支(循環(huán)中也有分支判斷),分支會(huì)產(chǎn)生指令地址跳轉(zhuǎn)。結(jié)構(gòu)化程序的函數(shù)調(diào)用是一種特殊的跳轉(zhuǎn)(。中斷是另一種特殊的跳轉(zhuǎn)(保存中斷前下一條指令地址和相關(guān)寄存器狀態(tài),以便中斷返回)。相關(guān)的指令運(yùn)行由處理器結(jié)構(gòu)模型的控制路徑根據(jù)數(shù)據(jù)處理路徑的狀態(tài)實(shí)現(xiàn)。具體應(yīng)用可能會(huì)擴(kuò)展系統(tǒng)調(diào)用、自陷等指令。
- 數(shù)據(jù)與ALU之間的傳輸通過(guò)寄存器實(shí)現(xiàn),寄存器也用于保存計(jì)算和處理器運(yùn)轉(zhuǎn)的狀態(tài)。一個(gè)特殊情況是立即數(shù),其作為指令的一部分傳遞到數(shù)據(jù)處理路徑,但是受限于指令的長(zhǎng)度需要附加額外處理。具體應(yīng)用可能會(huì)擴(kuò)展虛擬存儲(chǔ)管理等指令。
2. 指令集和架構(gòu)設(shè)計(jì)的基本問(wèn)題和處理方法
應(yīng)用明確之后可以開(kāi)展指令集和架構(gòu)設(shè)計(jì),基本問(wèn)題和處理方法可參考文獻(xiàn)[2]。
主要問(wèn)題有兩個(gè):存儲(chǔ)和尋址,指令集編碼
2.1 存儲(chǔ)和尋址
按照存儲(chǔ)方式,CPU大約可以分成堆棧型(Java虛擬機(jī)ByteCode)、累加器型(英特爾處理器和51單片機(jī))、寄存器型(當(dāng)下多數(shù)處理器屬于此類)。前者指令長(zhǎng)度短,后者代碼高效(寄存器比存儲(chǔ)器快,而且尋址所需位數(shù)較少)。
寄存器型存儲(chǔ)方式又分為寄存器-寄存器型、存儲(chǔ)器-寄存器型、存儲(chǔ)器-存儲(chǔ)器型,前者較為普遍,一般都有專門的指令用于數(shù)據(jù)加載和存儲(chǔ)。一般有運(yùn)算、參數(shù)傳遞、系統(tǒng)專用等幾類寄存器。
相應(yīng)的,尋址方式有立即數(shù)、寄存器、直接地址、寄存器間接尋址、偏移尋址(多用于if跳轉(zhuǎn),跳轉(zhuǎn)目標(biāo)地址編譯器計(jì)算并寫進(jìn)機(jī)器程序)。其中立即數(shù)尋址和偏移尋址使用頻率最高,注意立即數(shù)大小和偏移量大小都會(huì)影響指令;特殊一點(diǎn)的還有寄存尋址的變種如索引尋址、自增自減尋址、縮放尋址。尋址方式越復(fù)雜指令效率越高但是志玲越復(fù)雜(RIXC VS CISC)。
2.2 指令集設(shè)計(jì)與編碼
一般有CISC和RISC兩大類。
前者針對(duì)具體應(yīng)用或者高級(jí)語(yǔ)言特性增強(qiáng)指令,指令功能強(qiáng)大、邏輯設(shè)計(jì)復(fù)雜。早期英特爾處理器屬于此種體制,但后來(lái)的宏觀是CISC微觀還是編譯成多條RISC。
RISC基于80%時(shí)間運(yùn)行的常見(jiàn)指令,設(shè)計(jì)規(guī)整,但是編譯難度大。
指令集設(shè)計(jì)考慮的因素:
- 尋址方式,以及支持的尋址空間和寄存器個(gè)數(shù)。
- 指令長(zhǎng)度
- 容易處理
- 留有冗余,以便后續(xù)升級(jí)保持部分前向兼容,即許多指令集宣稱的多元未飽和。
3. 典型指令集
3.1 MIPS基本指令集[2]
MIPS整數(shù)運(yùn)算為三操作數(shù),對(duì)應(yīng)三類寄存器rsrc/rtmp/rdst。通用寄存器32個(gè),每個(gè)操作數(shù)都可以用段可以使用5bit選擇。實(shí)際32個(gè)寄存器使用的時(shí)候有所分工:
?
指令集編碼:
?
注解:
- 一般來(lái)看,31:26為操作碼,25:0為操作數(shù)。長(zhǎng)操作數(shù)指令如立即數(shù)運(yùn)算、帶偏移的加載和跳轉(zhuǎn)用15:0;不同的操作其操作碼在31:26體現(xiàn)。非長(zhǎng)操作數(shù)指令,31:26為0,具體操作碼利用了5:0。
- 特別地,lui對(duì)立即數(shù)左移16位賦值給rtmp;幾何ori可以對(duì)任意寄存器賦值,實(shí)現(xiàn)立即數(shù)
微架構(gòu):
?
注解:
3.2 ARM v4指令集
寄存器組織:
?
?
注解:
- 16個(gè)編號(hào),不同模式下訪問(wèn)互有備份以加速切換,共37個(gè)
- 通用寄存器使用遵循ATPCS規(guī)則:r0~r4用于函數(shù)調(diào)用傳遞參數(shù)(內(nèi)嵌匯編編程要遵守,超過(guò)的要使用堆棧故指針編程更有效),r4~r7用于保留中間變量。
- CPSR由數(shù)據(jù)通路到控制通路,控制運(yùn)轉(zhuǎn)
指令編碼表?
3.3 RISC-V指令集
?
中國(guó)指令集?
方法:
統(tǒng)計(jì)、時(shí)序和周期分析
例子:
大數(shù)加法
Printf
循環(huán)展開(kāi)
For/if順序
增加多寄存器加載指令,MAC指令
按位取反
操作系統(tǒng)對(duì)于處理器的支持?
函數(shù)參數(shù)是大的結(jié)構(gòu)體可以使用指針,
ARM和MIPS都有16/32兼容和切換?
參考
[1] 計(jì)算機(jī)體系結(jié)構(gòu),張晨曦
[2] 計(jì)算機(jī)原理與設(shè)計(jì)——Verilog HDL版,李亞民
[3] ARM體系結(jié)構(gòu)與編程,杜春雷譯
[4] risc-v 指令集手冊(cè)
總結(jié)
以上是生活随笔為你收集整理的处理器基础-要点与实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10 蓝牙耳机配对成功,但无法连接
- 下一篇: 关于CCRC信息安全服务资质认证概念