999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

支持RISC-V向量指令的匯編器設計與實現*

2021-01-06 08:16:10朱小龍孫海燕
計算機工程與科學 2020年12期
關鍵詞:指令

鄧 平,朱小龍,孫海燕,任 怡

(國防科技大學計算機學院,湖南 長沙 410073)

1 引言

隨著智能物聯網AIOT(Artificial Internet Of Things)應用需求的日益增長、中美國際貿易戰的影響以及企業本身對成本和技術創新的追求,RISC-V架構以其開放、簡潔、模塊化等特點得到了業界廣泛關注。國內有多家企業宣布采用RISC-V架構設計相關芯片,包括華為、芯來科技、國防科技大學、中國科學院等。在芯片體系結構相關技術中,向量指令是提高芯片運算性能的重要手段之一。RISC-V聯盟于2020年5月發布RISC-V向量擴展0.9版本[1]標準草案,給出了RISC-V體系結構的向量指令規范,為RISC-V體系結構[2]在更高性能的應用領域中的推廣提供了支持。

編譯器、匯編器等芯片編譯工具鏈對任何一個硬件架構而言,都是構筑軟件生態必不可少的組成部分,編譯環境的好壞直接決定了該架構的用戶數量和應用范圍。目前,RISC-V的配套開發環境已經很成熟,但在支持向量指令這方面還不夠完善。雖然RISC-V已包含向量指令規范,但在目前的開源工具鏈代碼中并沒有實現相關的向量指令,這在很大程度上影響了RISC-V的應用推廣。本文的主要工作是基于RISC-V 0.9版本向量規范和GNU Binutils開源平臺,討論實現支持RISC-V向量指令的匯編器關鍵技術,設計并實現RISC-V向量匯編器。

2 技術背景

2.1 向量指令集的特點

RISC-V向量指令集是基于基礎指令集的拓展,主要用于支持向量運算操作,提高硬件執行效率。在RISC-V 0.9版本中,向量指令遵循如表1所示的編碼標準。向量指令[1]主要在標量浮點加載(LOAD-FP)、標量浮點存儲(STORE-FP)和原子性存儲器操作(AMO)指令的基礎上進行拓展定義,另外新增了OP-V類的操作指令。向量的加載和存儲編碼利用了LOAD-FP和STORE-FP的12位立即數編碼字段(表1第20至31位)[3]的一部分,同時第25位保留了標準向量掩碼位(vm)作為條件域,大多數向量指令可以在條件域的掩碼控制下無條件或有條件地執行。

向量指令的源操作數一般為標量或向量,運算結果可存于對應標量或向量寄存器中。除立即數外,向量指令中的標量操作數還可以是向量寄存器的0號元素,以及通用寄存器或浮點寄存器中存儲的數據。按目前規范約定任何向量寄存器都可以用于保存標量。向量操作數或向量結果可能會占用一個或多個向量寄存器(向量寄存器組),向量寄存器組始終由組中編號最小的向量寄存器來指定。

2.2 GNU Binutils介紹

GNU[4]是一系列編譯工具[5]的集合,統稱為工具鏈GNU,其在開發應用程序和操作系統中具有重要作用。GNU包括GNU make、GCC(GNU Compiler Collection)、GDB(GNU Debugger)、GNU Binutils。對RISC-V的向量指令集擴展需要借助GNU Binutils工具來完成,同時在Binultils工具中進行一些與RISC-V平臺對應的修改。采用GNU Binutils主要是因為包含Binutils的GNU支持絕大多數當前主流的主機操作系統,其GNU的變種基本都能適用于類Unix操作系統、Linux和Windows操作系統。由于GNU提供了一套完備的工具,故無須過多考慮與其他工具的整合問題。即使需要考慮,由于GNU是開放的,它支持多種開放的目標文件格式和調試格式,存在多種形式的開源C標準庫可以使用,可以和編譯器鏈接器完美整合。

Table 1 RISC-V vector instruction formats表1 RISC-V向量指令格式

GNU Binutils是一組二進制程序處理工具[6],包含最主要的匯編器as、ld、objdump、readelf等。在Linux環境下,二進制程序主要是指*.o文件和*.elf執行文件[7]。as是Binutils的匯編器工具,負責將匯編程序轉化為目標機器指令;ld是鏈接器,可以將多個目標文件鏈接成一個可執行文件;objdump用于反匯編,將二進制文件轉換為匯編代碼;readelf用于顯示elf格式可執行文件的信息。GNU Binutils包含的匯編器as和鏈接器ld等工具都使用二進制文件描述符庫BFD(the Binary File Description library)[8]來操作目標文件和庫,如圖1所示。

Figure 1 Binary toolsets圖1 二進制工具集

3 RISC-V向量匯編器關鍵技術

向量指令的描述和向量寄存器的描述是實現RISC-V向量匯編器的關鍵。

3.1 RISC-V向量指令的描述

匯編指令與二進制指令之間是一一對應的關系,即直譯的過程。實現匯編器的重點在于定義好匯編指令集、二進制指令集,以及確定好兩者之間的映射轉換關系[9]。首要解決的問題是匯編指令對應的二進制指令的編碼問題,RISC-V架構定義的標準指令集僅使用了少量的二進制指令編碼空間,更多的編碼空間被預留給用戶作為擴展指令使用,本文將利用這些預留的編碼空間對向量指令集[10]進行編碼。

表2以指令vadc.vvm為例,描述了向量匯編指令及其對應的二進制編碼,其中vd表示目的寄存器,rs1和vs2表示操作數寄存器,各占用5 bit。將rs1、vs2和vd所在域全部置成0,其他位域保持為默認編碼后得到的二進制碼就是這條匯編指令的校驗值MATCH。當指令的rs1、vs2和vd對應位域值為0,其他位值全為1時,得到的二進制碼為該指令的MASK掩碼值。指令的MATCH和MASK用于一致性檢查,以校驗指令的正確性。表2中最后2行分別為vadc.vvm的MATCH和MASK。

3.2 向量寄存器的描述

在向量指令擴展[2]中,需將32個通用向量寄存器v0~v31添加到基本RISC-V的ISA中,每個通用向量寄存器都有一個固定狀態位v-len。如果基本標量ISA不包含浮點,則還需添加浮點狀態和控制寄存器fcsr,用來保存向量定點飽和標志寄存器vxsat和向量定點舍入模式寄存器vxrm的鏡像。向量定點舍入模式寄存器vxrm具有2位讀寫舍入模式字段,用于指示定點指令的舍入模式,如四舍五入模式、取整模式等,這一特性反映在fcsr高位字段中。向量定點飽和標志寄存器vxsat保留單個讀寫位,該位用于指示定點指令是否需要為了適應目標格式而必須使輸出值飽和,且vxsat位也反映在fcsr的高位字段中。將vxrm、vxsat等字段打包到fcsr,可以加速對上下文的保存/恢復。

對于向量類型控制狀態寄存器vtype,指定其只能被vsetvl{i}[1]指令進行更新,其中i為vsetl{i}編碼中高位字段(20~30位)表示的立即數,該寄存器可以提供默認類型用于解釋向量寄存器文件內容,還可以對多個向量寄存器進行分組。向量長度寄存器vl只能通過vsetvl{i}和vsetvl指令進行更新,該寄存器可以保存一個無符號整數,且該整數用于指定可以被向量指令更新的元素個數。若執行向量指令時,索引值大于或等于vl寄存器中的值,將清零其目標向量寄存器組中的元素。當vstart寄存器中的值大于或等于vl寄存器中的值時,不會更新目標向量寄存器組中的任何元素。矢量啟動索引控制狀態寄存器vstart指定向量指令執行時首個被執行元素的索引。通常vstart僅由硬件在向量指令的陷阱上寫入,其值表示執行陷阱的元素位置,以及在處理了可恢復陷阱之后應恢復執行的位置。

Table 2 Calculation method of MATCH and MASK of vector instruction表2 向量指令的MATCH、MASK的計算方法

4 RISC-V向量匯編器的實現與測試

4.1 RISC-V向量匯編器的實現

匯編器[11]的工作主要分為3部分:第1是計算各標號(lables)的內存地址,因為匯編器在進行指令轉換時需要知道各個符號名(symbols)與地址的聯系。第2是針對每條匯編語句解析出操作數、寄存器號和立即數數值等信息,然后轉換為對應的二進制編碼,再按照當前匯編指令模版拼裝成對應機器碼。最后匯編器將匯編結果輸出到一個包含二進制機器指令、數據和一些薄記信息的目標文件中。RISC-V之前的匯編器已經完成了第1項工作,本文只需要針對向量擴展完成后2項工作即可。也就是說,在RISC-V向量擴展中,首先對一條指令進行拆分,將指令名稱與寄存器/操作數分開;然后通過指令描述進行一致性檢查校驗,當未出現校驗錯誤時,通過查找hash表識別指令并將其轉換成二進制字符串,并根據對指令的描述檢查寄存器/操作數是否符合操作規范,完成對該條指令的處理,且依照制定的法則將其轉換成二進制格式;最后采用字符串拼接的方式打印出處理結果,其流程如圖2所示。RISC-V的向量指令的添加也將依據上述步驟完成。

Figure 2 Flow chart of assembly instruction圖2 匯編指令流程

4.1.1 向量寄存器描述

RISC-V聯盟發表的關于向量擴展的0.9標準,新增了32個通用向量寄存器和5個控制和狀態寄存器CSR。所有的通用向量寄存器定義在文件riscv-opc.c的結構體數組riscv_vpr_names_numeric[NVPR]中,并且將這些向量寄存器添加到hash表中,故該數組成員可在解析器初始化的過程中根據寄存器名字被索引到hash表中,從而便于程序查找、匹配和調用。向量寄存器的描述代碼如下所示:

const char * const riscv_vpr_names_numeric[NVPR]=

{

"v0","v1","v2","v3","v4","v5","v6","v7","v8","v9","v10","v11","v12","v13","v14","v15","v16","v17","v18","v19","v20","v21","v22","v23","v24","v25","v26","v27","v28","v29","v30","v31"

};

控制和狀態寄存器CSR類寄存器則定義在riscv-opc.h文件中。

4.1.2 向量指令描述

RISC-V現有指令集的所有指令和架構都聲明在riscv-opc.h文件中,故向量指令集指令和架構也聲明在該文件中,因此只需在riscv-opc.h文件中添加向量指令的MATCH、MASK和DECLARE_INSN便可完成聲明。在添加向量指令和架構時可引用向量擴展0.9標準的向量指令,也可根據實際需求編寫向量指令,3.1節已給出關于向量指令的MATCH和MASK的計算方法。

riscv-opc.c文件中定義了riscv_opcodes[ ],RISC-V指令集的所有指令都可在這個結構體數組中找到。需要將向量指令的相關信息按name,xlen,isa,operands,match,mask,match_func,pinfo的順序在數組riscv_opcodes[ ]中聲明,才能實現編譯。向量指令的描述代碼如下所示:

const struct riscv_opcode riscv_opcodes[]=

{

/*name,xlen,isa,operands,match,mask,match_func,pinfo.*/

{"vfmul.vf",0,{"V",0},"VD,VS,VT",

MATCH_VFMUL_VF|MASK_RM,MATCH_VFMUL_VF|MASK_RM,match_opcode,0},

{"vadd.vv",0,{"V",0},"VD,VS,VT",

MATCH_VADD_VV,MASK_VADD_VV,

match_opcode,0},

{"vadc.vvm",0{"V",0}"VD,VS,VT",

MATCH_VADC_VVM,MASK_VADC_VVM,

match_opcode,0},

{0,0,{0},0,0,0,0,0}

};

4.1.3 相關配置信息描述

match_opcode、match_never、match_rd_nonzero等match_*類函數,是RISC-V向量擴展中的關鍵函數,此類函數主要根據riscv_opcodes[ ]數組中對向量指令match_func部分的描述進行匹配。這些函數根據指令的MATCH、MASK及設定的一些需求規則來對*.s文件中的指令進行一致性檢查,檢查是否符合相關指令描述及約束規則,并根據match_*類函數返回的值判斷一致性檢查是否正確,若返回值錯誤則匯編器報錯,并終止后續操作。

一致性檢查結束后,riscv_ip函數會根據*.s文件中該指令的操作數、寄存器等信息判斷是否符合指令的描述。比如:判斷指令的源操作數是否為常數/寄存器,判斷寄存器的區間是否符合要求,判斷指令的其中一個操作數是否是地址表達式等。若滿足條件,匯編器會將指令轉換成二進制格式,并用INSERT_OPERAND函數將字符串拼接起來,形成最終的二進制機器指令。

4.2 測試結果

測試用例1選擇了通用的向量加法指令,用于測試向量匯編到目標代碼的正確性。測試用例2采用包含分支、循環及可向量化特性的for循環進行測試,用來對比標量與向量匯編輸出。RISC-V指令集采用功能模塊化的思想實現,故在測試時需通過-march選項來指定RISC-V所支持的目標模塊化指令集的組合,本文主要完成了基于RISC-V的向量指令的實現,除使用-march選項實現基本整數指令子集“i”的強制添加,還需添加待實現的向量指令子集“v”。

測試用例1向量匯編指令測試。

.text

vadc.vvm v3,v5,v7

vadc.vvm v15,v1,v3

vadc.vvm v2,v6,v8

測試結果1(匯編與反匯編)如圖3所示。

Figure 3 Test result of test case 1圖3 測試用例1的測試結果

測試用例2for循環加法測試。

main()

{

inta[64];

intb[64];

intc[64];

for(inti=0;i<64;i++)

a[i]=b[i]+c[i];

printf("%d",a[31]);

}

標量匯編輸出結果如下:

main:

?

lw a5,-20(s0)

slli a5,a5,2

addi a4,s0,-16

add a5,a4,a5

lw a4,-516(a5)

lw a5,-20(s0)

slli a5,a5,2

addi a3,s0,-16

add a5,a3,a5

lw a5,-772(a5)

add a4,a4,a5

lw a5,-20(s0)

slli a5,a5,2

addi a3,s0,-16

add a5,a3,a5

sw a4,-260(a5)

lw a5,-20(s0)

addi a5,a5,1

sw a5,-20(s0)

?

向量匯編輸出結果如下:

main:

?

vlxw.v v12,(s0),v18

vsll.vi v12,v12,2

vadd.vx v13,v19,s0

vadd.vv v12,v13,v12

vlxw.v v13,(s0),v12

vlxw.v v12,(s0),v18

vsll.vi v12,v12,2

vadd.vx v14,v20,s0

vadd.vv v12,v14,v12

vlxw.v v14,(s0),v12

vadd.vv v13,v13,v14

vlxw.v v12,(s0),v18

vsll.vi v12,v12,2

vadd.vx v14,v21,s0

vadd.vv v12,v14,v12

vsxw.v v13,(s0),v12

vlxw.v v12,(s0),v18

vadd.vi v12,v12,1

vsxw.v v12,(s0),v12

?

從圖3可以看出,測試用例1的反匯編結果與測試用例1描述的向量指令一致,故向量指令的目標代碼生成正確。測試用例2采用標量運算時,需要進行64*3次數據訪存和64次加法運算;如果采用向量運算,則僅需8*3次數據訪存和8次向量加法運算。由此可見,增加向量運算可以提高編譯器的加速比,故添加支持向量指令的匯編器生成能充分利用硬件資源的目標機器代碼,從而實現性能提升。

綜合以上結果分析,向量運算可以提升編譯器性能,匯編器能支持向量指令對應于目標平臺的目標代碼生成,從而能夠在目標平臺上正確執行。

5 結束語

本文通過分析RISC-V向量指令、向量寄存器的特點及相關配置信息,基于GNU的Binutils匯編器設計并實現了支持RISC-V向量指令的匯編器,該匯編器可完成向量指令匯編和反匯編工作,其實現可為其他指令模塊的擴展提供參考。由于向量運算可以有效地提高計算機的運算效率,減少不必要的硬件開銷,故在RISC-V架構上實現向量指令集的擴展及支持向量指令的匯編器是一項極具意義的工作。

猜你喜歡
指令
聽我指令:大催眠術
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
殺毒軟件中指令虛擬機的脆弱性分析
電信科學(2016年10期)2016-11-23 05:11:56
巧用G10指令實現橢圓輪廓零件倒圓角
時代農機(2015年3期)2015-11-14 01:14:29
中斷與跳轉操作對指令串的影響
科技傳播(2015年20期)2015-03-25 08:20:30
基于匯編指令分布的惡意代碼檢測算法研究
一種基于滑窗的余度指令判別算法
歐盟修訂電氣及電子設備等產品安全規定
家電科技(2014年5期)2014-04-16 03:11:28
MAC指令推動制冷劑行業發展
汽車零部件(2014年2期)2014-03-11 17:46:27
主站蜘蛛池模板: 欧美成人午夜视频免看| 亚洲二三区| 在线a网站| 国产成+人+综合+亚洲欧美| 在线精品自拍| 亚洲综合狠狠| 欧美成人午夜视频| 欧美日韩一区二区在线播放| 久久综合结合久久狠狠狠97色| 欧美日韩免费| 国产精品无码在线看| 免费中文字幕一级毛片| 免费在线视频a| 国产人前露出系列视频| 米奇精品一区二区三区| 香蕉视频国产精品人| 午夜日b视频| 亚洲精品人成网线在线| 亚洲无码高清一区| 欧美国产日韩在线| 素人激情视频福利| 精品国产电影久久九九| 精品国产自在在线在线观看| 91福利国产成人精品导航| 国产亚洲精品无码专| 伊伊人成亚洲综合人网7777| 免费国产高清精品一区在线| 日韩欧美网址| 久久美女精品国产精品亚洲| 成年A级毛片| 四虎影视无码永久免费观看| av尤物免费在线观看| 国产欧美日韩va另类在线播放 | 中文字幕第1页在线播| 亚洲AV无码乱码在线观看代蜜桃| 久久香蕉国产线看精品| 成人欧美日韩| 91青青视频| 欧洲日本亚洲中文字幕| 97se综合| 毛片网站观看| 国产欧美日本在线观看| 18黑白丝水手服自慰喷水网站| 亚洲第一福利视频导航| 国产v精品成人免费视频71pao| 日韩精品无码免费一区二区三区 | 少妇人妻无码首页| 91精品伊人久久大香线蕉| 国产精品蜜芽在线观看| 久久综合丝袜日本网| 中文字幕欧美日韩| 久久香蕉欧美精品| 国产SUV精品一区二区| 丁香六月激情婷婷| 国产精品福利导航| 99人妻碰碰碰久久久久禁片| 亚洲欧美h| 欧美啪啪网| 亚洲AⅤ无码国产精品| 国产精品九九视频| 三上悠亚在线精品二区| 国产传媒一区二区三区四区五区| 国产自视频| 亚洲成人免费在线| 国产成人精品三级| 国产成人亚洲综合A∨在线播放| 国产亚洲欧美在线专区| 亚洲国产中文综合专区在| 亚洲一区二区日韩欧美gif| 日韩精品高清自在线| 国产成人a在线观看视频| 国产亚洲欧美日韩在线一区二区三区| 欧美性久久久久| 欧美啪啪视频免码| 国产精品区网红主播在线观看| 免费a在线观看播放| 日韩欧美国产中文| 久久人妻xunleige无码| 久久人人妻人人爽人人卡片av| 最新亚洲人成无码网站欣赏网| 98精品全国免费观看视频| vvvv98国产成人综合青青|