RISC-V详细介绍
文章目錄
- RISC-V指令集介紹
- 什么是RISC-V
- RISC-V誕生的背景
- ISA霸權
- 摩爾定律的窮途末路
- 窮困潦倒的學者
- 不斷增長的指令數量
- RISC-V架構設計思想
- 如何設計一個好的ISA
- RISC-V之RV32I
- 四個典型特點
- RISC-V之乘除法指令
- 指令格式
- 用乘法代替常數除法
- RISC-V之RV64
- RISC-V的特權架構
- 機器模式
- 監管者模式
- 擴展指令集
- AI中涉及的運算操作
- 機器學習
- 深度學習
- 現有的AI指令集或其他底層解決方案
- TPU解決方案
- X86
- 現有AI芯片
- 現有AI軟件與芯片設計關系詳解
- 參考資料
RISC-V指令集介紹
什么是RISC-V
RISC-V(發音為“risk-five”)是一個基于精簡指令集(RISC)原則的開源指令集架構(ISA)。
與大多數指令集相比,RISC-V指令集可以自由地用于任何目的,允許任何人設計、制造和銷售RISC-V芯片和軟件。雖然這不是第一個開源指令集,但它具有重要意義,因為其設計使其適用于現代計算設備(如倉庫規模云計算機、高端移動電話和微小嵌入式系統)。設計者考慮到了這些用途中的性能與功率效率。該指令集還具有眾多支持的軟件,這解決了新指令集通常的弱點。
該項目2010年始于加州大學伯克利分校,但許多貢獻者是該大學以外的志愿者和行業工作者。
RISC-V指令集的設計考慮了小型、快速、低功耗的現實情況來實做,但并沒有對特定的微架構做過度的設計。
簡而言之,RISC-V是一個ISA
RISC-V誕生的背景
ISA霸權
微處理器的開放指令集有望重塑計算,并引入新的、更強大的功能。
現代計算機依靠許多元件來提供高速和高性能,但是很少有比一臺精簡的指令集計算機(通常稱為RISC)發揮更大作用的了。盡管指令集體系結構(ISA)具有不同的形狀和形式-并且它支持多種系統和設備-但存在一個共同點,與復合指令集計算機(CISC)相比,RISC允許微處理器以更少的每指令周期(CPI)運行。
當然,ISA是計算的核心。加州大學伯克利分校計算機科學教授、ACM A.M.圖靈獎獲得者戴夫·帕特森(Dave Patterson)說:“這是允許硬件和軟件進行通信的基本詞匯,他差不多算是創造了這個術語,并開發了早期的RISC計算模型。在過去的幾十年里,英特爾和ARM這兩大實體基本上控制了ISA。他們的專利微處理器可以從筆記本電腦到云服務器,從智能手機到物聯網(IoT)設備的所有設備運行。如今,很難找到沒有英特爾或ARM處理器的計算設備。
摩爾定律的窮途末路
RISC-V的推出與半導體行業的其他重大變化不謀而合。CMOS晶體管的縮放速度正在放緩,這已不是秘密。即使最近在設計上取得了突破,將密度和性能提升到了新的水平,戈登·摩爾(Gordon Moore)關于每兩年將晶體管倍增的長期預測——“摩爾定律”(Moore’s Law)也不再成立。隨著半導體進展緩慢,而性能需求持續增長,設計更先進的計算設備和燃料創新的能力受到威脅。Patterson解釋說:“向前看,邏輯路徑是為應用領域的微處理器上的基本指令集添加擴展。”。
RISC-V的吸引力是不可否認的。一個通用的ISA意味著ISA的不同實現和用例可以利用相同的核心軟件堆棧,從而最小化移植到編譯器、操作系統和其他軟件的工作。RISC- v的主要優點不是它是RISC的一個新的變種或迭代,而是它是一個開放的ISA。因此,人們期望該模型將產生將RISC-V置于商業地圖上所需的軟件堆棧。然而,與此同時,也有一種擔憂,即給用戶改變ISA的能力將導致RISC-V軟件生態系統的分裂。
窮困潦倒的學者
Asanovi?c和Patterson于2010年開始在伯克利的并行計算實驗室(Par Lab)研究第五代RISC指令集。該項目的誕生源于對專有ISA缺乏靈活性的失望。Patterson回憶說:“我們無法做一些我們想做的重新搜索。兩人瞄準了一個長期存在的行業問題:無法為特定目的定制芯片。這項倡議是基于他們自己的需要。“由于我們無法獲得英特爾或ARM使用或修改其專有指令集的許可,我們決定為自己的研究開發自己的指令集,并幫助其他學者的研究。”
不斷增長的指令數量
RISC-V架構設計思想
如何設計一個好的ISA
在介紹 RISC-V 這個 ISA 之前,了解計算機架構師在設計 ISA 時的基本原則和必須做 出的權衡是有用的。如下的列表列出了七種衡量標準。頁邊放置了對應的七個圖標,以突 出顯示 RISC-V 在隨后章節中應對它們的實例。(印刷版的封底有所有圖標的圖例。)
? 成本(美元硬幣)
? 簡潔性(輪子)
? 性能(速度計)
? 架構和具體實現的分離(分開的兩個半圓)
? 提升空間(手風琴)
? 程序大小(相對的壓迫著一條線的兩個箭頭)
? 易于編程/編譯/鏈接(兒童積木“像 ABC 一樣簡單”)
RISC-V的不同尋常之處,除了在于它是最近誕生的和開源的以外,還在于:和幾乎所 有以往的ISA不同,它是模塊化的。它的核心是一個名為RV32I的基礎ISA,運行一個完整 的軟件棧。RV32I是固定的,永遠不會改變。這為編譯器編寫者,操作系統開發人員和匯 編語言程序員提供了穩定的目標。模塊化來源于可選的標準擴展,根據應用程序的需要, 硬件可以包含或不包含這些擴展。這種模塊化特性使得RISC-V具有了袖珍化、低能耗的特 點,而這對于嵌入式應用可能至關重要。RISC-V編譯器得知當前硬件包含哪些擴展后,便 可以生成當前硬件條件下的最佳代碼。慣例是把代表擴展的字母附加到指令集名稱之后作 為指示。例如,RV32IMFD將乘法(RV32M),單精度浮點(RV32F)和雙精度浮點 (RV32D)的擴展添加到了基礎指令集(RV32I)中。
RISC-V之RV32I
RV32I 基礎指令集的一頁圖形表示。對于每幅圖,將有下劃線的字母從左到 右連接起來,即可組成完整的 RV32I 指令集。對于每一個圖,集合標志{}內列舉了指令的 所有變體,變體用加下劃線的字母或下劃線字符_表示。特別的,下劃線字符_表示對于此 指令變體不需用字符表示。例如,下圖表示了這四個 RV32I 指令:slt,slti,sltu,sltiu:
四個典型特點
首先,指令只有六種格式,并且所有的指令都是 32 位長,這簡化了指令解碼。ARM-32, 還有更典型的 x86-32 都有許多不同的指令格式,使得解碼部件在低端實現中偏昂貴,在中 高端處理器設計中容易帶來性能挑戰。
第二,RISC-V 指令提供三個寄存器操作數,而不是 像 x86-32 一樣,讓源操作數和目的操作數共享一個字段。當一個操作天然就需要有三個不 同的操作數,但是 ISA 只提供了兩個操作數時,編譯器或者匯編程序程序員就需要多使用 一條 move(搬運)指令,來保存目的寄存器的值。
第三,在 RISC-V 中對于所有指令,要 讀寫的寄存器的標識符總是在同一位置,意味著在解碼指令之前,就可以先開始訪問寄存 器。在許多其他的 ISA 中,某些指令字段在部分指令中被重用作為源目的地,在其他指令 中又被作為目的操作數(例如,ARM-32 和 MIPS-32)。因此,為了取出正確的指令字 段,我們需要時序本就可能緊張的解碼路徑上添加額外的解碼邏輯,使得解碼路徑的時序 更為緊張。
第四,這些格式的立即數字段總是符號擴展,符號位總是在指令中最高位。這 意味著可能成為關鍵路徑的立即數符號擴展,可以在指令解碼之前進行。
下圖顯示了六種基本指令格式,分別是:用于寄存器-寄存器操作的 R 類型指令,用 于短立即數和訪存 load 操作的 I 型指令,用于訪存 store 操作的 S 型指令,用于條件跳轉操 作的 B 類型指令,用于長立即數的 U 型指令和用于無條件跳轉的 J 型指令。
解釋說明:四種基礎指令格式 R/I/S/U
RISC-V之乘除法指令
指令格式
RV32M 具有有符號和無符號整數的除法指令:divide(div)和 divide unsigned(divu),它們將 商放入目標寄存器。在少數情況下,程序員需要余數而不是商,因此 RV32M 提供 remainder(rem)和 remainder unsigned(remu),它們在目標寄存器寫入余數,而不是商。
為了正確地得到一個有符號或無符號的 64 位積,RISC-V 中帶有四個乘 法指令。要得到整數 32 位乘積(64 位中的低 32 位)就用 mul 指令。要得到高 32 位,如果 操作數都是有符號數,就用 mulh 指令;如果操作數都是無符號數,就用 mulhu 指令;如 果一個有符號一個無符號,可以用 mulhsu 指令。在一條指令中完成把 64 位積寫入兩個 32 位寄存器的操作會使硬件設計變得復雜,所以 RV32M 需要兩條乘法指令才能得到一個完整 的 64 位積。
用乘法代替常數除法
對許多微處理器來說,整數除法是相對較慢的操作。如前述,除數為 2 的冪次的無符號 除法可以用右移來代替。事實證明,通過乘以近似倒數再修正積的高 32 位的方法,可以優 化除數為其它數的除法。例如,圖 4.3 顯示了 3 為除數的無符號除法的代碼。
也就是說從數值上來講,可以通過乘法代替常數除法
RISC-V之RV64
盡管 RV64I 有 64 位地址且默認數據大小為 64 位,32 位字仍然是程序中的有效數據類 型。因此,RV64I 需要支持字,就像 RV32I 需要支持字節和半字一樣。更具體地說,由于寄 存器現在是 64 位寬,RV64I 添加字版本的加法和減法指令:addw,addiw,subw。這些指 令將計算結果截斷為 32 位,結果符號擴展后再寫入目標寄存器。 RV64I 也包括字版本的移 位指令(sllw,slliw,srlw,srliw,sraw,sraiw),以獲得 32 位移位結果而不是 64 位移 位結果。要進行 64 位數據傳輸,RV64 提供了加載和存儲雙字指令:ld,sd。最后,就像 RV32I 中有無符號版本的加載單字節和加載半字的指令,RV64I 也有一個無符號版本的加載 字:lwu。 出于類似的原因,RV64 需要添加字版本的乘法,除法和取余指令:mulw,divw,divuw, remw,remuw。為了支持對單字及雙字的同步操作,RV64A 為其所有的 11 條指令都添加 了雙字版本。
由于版本眾多,這里只選擇有代表性的來了解
RV64F 和 RV64D 添加了整數雙字轉換指令,并稱它們為長整數,以避免與雙精度浮點 數據混淆:fcvt.l.s,fcvt.l.d,fcvt.lu.s,fcvt.lu.d,fcvt.s.l,fcvt.s.lu,fcvt.d.l,fcvt.d.lu. 由于整數 x 寄存器現在是 64 位寬,它們現在可以保存雙精度浮點數據,因此 RV64D 增加了 兩個浮點指令:fmv.x.w 和 fmv.w.x.
這里暫時不講解壓縮指令
RISC-V的特權架構
到目前為止,本書主要關注 RISC-V 對通用計算的支持:我們引入的所有指令都在用 戶模式(應用程序的代碼在此模式下運行)下可用。本章介紹兩種新的權限模式:運行最 可信的代碼的機器模式(machine mode),以及為 Linux,FreeBSD 和 Windows 等操作系統 提供支持的監管者模式(supervisor mode)。這兩種新模式都比用和模式有著更高的權限, 這也是本章標題的來源。有更多權限的模式通常可以使用權限較低的模式的所用功能,并 且它們還有一些低權限模式下不可用的額外功能,例如處理中斷和執行 I/O 的功能。處理 器通常大部分時間都運行在權限最低的模式下,處理中斷和異常時會將控制權移交到更高 權限的模式。 嵌入式系統運行時(runtime)和操作系統用這些新模式的功能來響應外部事件,如網 絡數據包的到達;支持多任務處理和任務間保護;抽象和虛擬化硬件功能等。鑒于這些主 題的廣度,為此而編撰的全面的程序員指南會是另外一本完整的書。但我們的這一章節旨 在強調 RISC-V 這部分功能的亮點。
機器模式
機器模式(縮寫為 M 模式,M-mode)是 RISC-V 中 hart(hardware thread,硬件線 程)可以執行的最高權限模式。在 M 模式下運行的 hart 對內存,I/O 和一些對于啟動和配 置系統來說必要的底層功能有著完全的使用權。因此它是唯一所有標準 RISC-V 處理器都 必須實現的權限模式。實際上簡單的 RISC-V 微控制器僅支持 M 模式。這類系統是本節的 重點。
機器模式最重要的特性是攔截和處理異常(不尋常的運行時事件)的能力。RISC-V 將 異常分為兩類。
一類是同步異常,這類異常在指令執行期間產生,如訪問了無效的存儲器 地址或執行了具有無效操作碼的指令時。
另一類是中斷,它是與指令流異步的外部事件, 比如鼠標的單擊。RISC-V 中實現精確例外:保證異常之前的所有指令都完整地執行了,而 后續的指令都沒有開始執行(或等同于沒有執行)。
圖 10.3 列出了觸發標準例外的原因。
在 M 模式運行期間可能發生的同步例外有五種:
? 訪問錯誤異常 當物理內存的地址不支持訪問類型時發生(例如嘗試寫入 ROM)。
? 斷點異常 在執行 ebreak 指令,或者地址或數據與調試觸發器匹配時發生。 ? 環境調用異常 在執行 ecall 指令時發生。
? 非法指令異常 在譯碼階段發現無效操作碼時發生。
? 非對齊地址異常 在有效地址不能被訪問大小整除時發生,例如地址為 0x12 的 amoadd.w
有三種標準的中斷源:軟件、時鐘和外部來源。軟件中斷通過向內存映射寄存器中存 數來觸發,并通常用于由一個 hart 中斷另一個 hart(在其他架構中稱為處理器間中斷機 制)。當實時計數器 mtime 大于 hart 的時間比較器(一個名為 mtimecmp 的內存映射寄存 器)時,會觸發時鐘中斷。外部中斷由平臺級中斷控制器(大多數外部設備連接到這個中 斷控制器)引發。
監管者模式
更復雜的 RISC-V 處理器用和幾乎所有通用架構相同的方式處理這些問題:使用基于 頁面的虛擬內存。這個功能構成了監管者模式(S 模式)的核心,這是一種可選的權限模 式,旨在支持現代類 Unix 操作系統,如 Linux,FreeBSD 和 Windows。S 模式比 U 模式權 限更高,但比 M 模式低。與 U 模式一樣,S 模式下運行的軟件不能使用 M 模式的 CSR 和 指令,并且受到 PMP 的限制。本屆介紹 S 模式的中斷和異常,下一節將詳細介紹 S 模式 下的虛擬內存系統。 默認情況下,發生所有異常(不論在什么權限模式下)的時候,控制權都會被移交到 M 模式的異常處理程序。但是 Unix 系統中的大多數例外都應該進行 S 模式下的系統調 用。M 模式的異常處理程序可以將異常重新導向 S 模式,但這些額外的操作會減慢大多數 異常的處理速度。因此,RISC-V 提供了一種異常委托機制。通過該機制可以選擇性地將中 斷和同步異常交給 S 模式處理,而完全繞過 M 模式。
S 模式提供了一種傳統的虛擬內存系統,它將內存劃分為固定大小的頁來進行地址轉 換和對內存內容的保護。啟用分頁的時候,大多數地址(包括 load 和 store 的有效地址和 PC 中的地址)都是虛擬地址。要訪問物理內存,它們必須被轉換為真正的物理地址,這通 過遍歷一種稱為頁表的高基數樹實現。頁表中的葉節點指示虛地址是否已經被映射到了真 正的物理頁面,如果是,則指示了哪些權限模式和通過哪種類型的訪問可以操作這個頁。
擴展指令集
目前官方提供的risc-v擴展指令集有如下幾個(確定將會實現的)
11.1 “B”標準擴展:位操作 …
11.2 “E”標準擴展:嵌入式 …
11.3 “H”特權態架構擴展:支持管理程序(Hypervisor) …
11.4 “J”標準擴展:動態翻譯語言 …
11.5 “L”標準擴展:十進制浮點 …
11.6 “N”標準擴展:用戶態中斷 …
11.7 “P”標準擴展:封裝的單指令多數據(Packed-SIMD)指令 …
11.8 “Q”標準擴展:四精度浮點 …
目前根據已經開源的設計方案,大多專注于B/J/Q/L指令的相關擴展
阿里平頭哥文檔
AI中涉及的運算操作
機器學習
深度學習
現有的AI指令集或其他底層解決方案
TPU解決方案
在TPU中,它使用若干條指令來完成矩陣的乘法運算,其中使用Read_Host_Memory來從主存中讀取數據至通用緩存(Unified Buffer)中;使用Read_Weights來將權重讀取至矩陣單元中。在進行矩陣運算時,使用MatrixMultiply或Convolve來進行矩陣乘法。最后使用Write_Host_Memory來將數據寫回主存中。但是在TPU中,它的矩陣乘法對操作數的尺寸存在限制,在MatrixMultiply或Convolve中,其限制操作數為B256 與256256,若矩陣尺寸大與此值,則不太方便直接使用TPU進行運算;若矩陣尺寸小于此值,則需要先對多余部分填充0后再進行計算。
X86
在X86_64中,其在AVX、AVX2等指令集中提供了VMULPS、VMULPD、VADDPS、VADDPD等一系列SIMD指令,這些指令可以使用一條指令來完成多組數據的運算。在矩陣乘法等應用中,數據之間沒有相互依賴性,因此可以使用SIMD指令來提高運算效率。
VMULPS指令示意圖
與TPU相比,AVX至運算數據的尺寸上沒有太多的限制,即使數據的規模較大,也可以拆分為多交指令執行。但這也造成AVX指令集的并行化程度一般不高,通常一條指令只能處理4-8條數據,效率遠不如TPU等專門雙擊的架構,在人工智能的應用上仍然難以滿足需要。
現有AI芯片
現有的AI芯片,比如寒武紀的產品為了AI的運算也做了大量適配,比如構建大量的乘法器用來在一個周期內并行處理多個乘法操作,相應地指令集也會向著這個方向進行優化,如華為Ascend 系列AI芯片,內置的都是運算密集型CISC指令集來為AI運算做優化。但是這種設計模式的功耗以及設計的繁瑣程度都很高,所以集成AI優化的RISC-V應該在保持靈活小巧的基礎上對矩陣運算等AI領域常見的基本數學運算做優化,對機器學習和深度學習有一個泛化支持,雖然速度可能沒CISC那么高,但是可以保持其精簡以及自由拓展的特點。
現有AI軟件與芯片設計關系詳解
本例以 Hanguang AI為例子,主要內容來自官方文檔
HanGuang Al是阿里巴巴-迖摩院旗下平頭哥半導體有限公司開發的入工智能芯片軟件開發包J 巨前主要服務于業界領先的含光800人工智能推理芯片。 使用HanGuang Al在含光800芯片上開發深度學習應用可以獲得言吞吐量和低延遲的高性能體驗。
HanGuang Al軟件架構如下所示
可以看到,當前AI軟件的主要工作還是分為了3個大部分,其中和AI芯片設計打交道的主要是量化、編譯過程。
所以在設計是重點關注算子的底層編譯實現,也就是說通過算子的提取計算代替傳統的分析方法是一種高效運用在工業界的方法。
參考資料
In-Datacenter Performance Analysis of a Tensor Processing Unit
https://arxiv.org/ftp/arxiv/papers/1704/1704.04760.pdf
含光800軟件介紹.pdf
總結
以上是生活随笔為你收集整理的RISC-V详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino 语法参考
- 下一篇: Shell - mkdir