客製化指令
定義/邏輯驗證精準又簡單 客製化指令加速特定領域應用
隨著從邊緣設備到雲端服務的應用需要處理越來越多的數據,現今對於SoC運算能力的要求也越來越高。此外,系統也必須在非常短的時間內對這些數據(聲音、影像、動態影片、光學雷達、紅外線雷達以及聲納等)進行分析、處理並在一定時間內採取相對的回應。儘管這些應用對硬體常要求大量的運算能力,但它們卻也同樣受到功耗和成本的限制,而一般標準的CPU通常很難滿足這些要求。如果想在特殊的應用或演算法上加快運算的速度,SoC需要一種更好的方法來達到這些目標。
客製化指令加速運算
在運算加速的方法和演進中,主要可以歸納成三種方式。一種是透過外部的硬體加速器,最好的例子之一是加密引擎;第二種是指令集架構(ISA)的標準擴充集,例如RISC-V ISA中的M、P和V擴充集;最後一種是用戶自定義的客製化指令,如RISC-V ISA開放給設計工程師添加他們自己的客製化指令。
表1比較了這三種類型的運算加速。可以看到自定義的客製化指令沒有啟動延遲(Start-up Latency),同時擁有指令專有的優勢,並能夠共用較多的硬體資源來節省大小。在過去將新的指令整合到現有的標準CPU IP較麻煩的是設計流程。這種整合除了要求設計工程師要了解CPU的架構和其工具鏈,以便有效地定義所需的指令之外,工程師更要了解如何將新設計的邏輯電路整合到現有的SoC、仿真和驗證的流程中。廠商如晶心科技提供的Andes Custom Extension(ACE)和客製優化指令開發工具(COPILOT)之EDA等級的客製化指令開發工具來幫忙客戶解決這些問題,使設計工程師可以快速依照他們的需求定義客製化指令,而ACE和COPILOT支援晶心RISC-V V5全系列的核心。
如果將數據密集型運算的加速加以分析,可以將其分為兩部分:數據I/O和運算加速。針對第一部分,設計工程師可以用適當的DMA引擎加上Double Buffers,以減少將數據傳送到加速單元或從加速單元傳送出的等待時間。第二部份運算加速則可以用ACE開發自定義的客製化指令來增強效能,例如定義一個指令來完成矩陣卷積或兩個64×8向量的內積。另外,ACE還可以從CPU生成客製化接口,來控制現有的硬體引擎進行快速的資料交換,例如,在一個週期內向外部硬體引擎發送90位元的訊號。
在這邊也列舉了三種典型的演算法來展示客製化指令所帶來在效能及功耗上的改善。表2列舉了有限脈衝響應(FIR)過濾器、32位循環冗餘校驗(CRC32)和三重數據加密標準(3DES)這些演算法。他們透過ACE添加客製化指令後,得到從20倍到300倍不等的效能提升及功耗降低。
ACE流程設計指令簡易
在ACE的流程設計指令,工程師只需要提供少許的資訊,例如指令名稱、屬性、客製化的硬體資源、運算本身的C語義以及ACE其他和客製化指令相關的參數。ACE自動整合開發工程師所提供的Concise Verilog,該Verilog只需提供客製化指令本身的邏輯而不必擔心與CPU Pipeline相關的接口訊號和控制邏輯。像晶心EDA等級的COPILOT工具會依照這些資訊自動生成擴展的RTL、高精確的模擬器以及工具(編譯器、彙編器/反彙編器和調試器);這些擴展元件和基礎元件結合後,就產生一個新的CPU及其所有相關工具。此外,COPILOT可以產生測試環境來交叉檢查擴展的Instruction Set Simulator(ISS)和RTL,以幫助工程師驗證其設計的客製化指令邏輯是否正確。
COPILOT因為與晶心Eclipse-based的Integrated Development Environment(AndeSight IDE)高度整合,開發工程師可以容易地利用AndeSight中的現有提供給標準RISC-V的功能,這些包括高精確的模擬器、程式的編譯、除錯和軟體效能Profiling工具,來在新產生的RISC-V核心上更快進行應用軟體的開發和驗證。
ACE提供的多種功能可以讓工程師設計適合其特定需求的客製化指令,例如ACE支援單週期或多週期的純量(Scalar)指令、For循環或Do-while循環的向量(Vector)指令、以及可立即Retire並在後台持續執行客製化指令的Background選項。此外,ACE支援多種Operands類型:(1)一般CPU都有的標準Operand,像是Immediate、通用暫存器(GPR)和從CPU存取的Baseline Memory;(2)具有任意寬度和數量的客製化暫存器(ACR)、客製化記憶體(ACM)和客製化端口(ACP),以及(3)隱含Mnemonic在指令中的Operand,進而減少客製化指令所需要的編碼空間。另外,根據設計工程師在ACE Script中定義的資訊,ACE會自動決定分配Opcode,然後生成新的工具和SystemC的模擬器。ACE也提供可以優化硬體資源的邏輯共享選項,並自動產生用於模擬時的波形控制文件。而COPILOT自動生成並整合Concise Verilog的邏輯包括指令解碼、Operand Mapping、Dependence檢查、輸入參數的對接和輸出參數的更新等。
ACE開發流程如圖1所示。如果開發工程師己經確定應用軟體中需要加速的代碼,就可以直接定義ACE指令來替換此段代碼。接下來,設計工程師再用Profiling評估新客製化指令增加的效能,以確定其是否已達到所需的週期預估值。如果目標尚未達到,則重複進行此步驟,直到帶有客製化指令的應用程式達到預定的目標為止。一旦應用程式已經達到預期的效能,設計工程師就可以進到下一步去實現ACE客製化指令邏輯的RTL,並進行評估以確保最終的功耗、效能和面積滿足整體系統的要求。如果沒有,則可以透過再次分析應用程式並以添加或修改客製化指令來重複之前的步驟,直到滿足所有的條件為止。
圖1 ACE開發流程
透過設計客製化指令來減少執行週期,除了可以提高性能外,還可以進一步降低功耗。因為多條指令需要多次重複執行獲取、解碼和退出的運算過程,而客製化指令僅需執行一次獲取、解碼和退出週期即可。此外,透過設計專用的邏輯電路來執行客製化指令也能更加優化功耗。
設計ACE指令相當簡單。如圖2所示,ACE定義文件madd32.ace Script提供設計一道客製化指令所需的資訊:「insn」、「Operand」、「csim」和「Latency」。在這個例子中,ACE Script包含客製化指令的名稱「madd32」外,它也列出客製化指令中Operand的名稱和其屬性:輸入、輸出、輸出入、通用暫存器或immediate等;另外它還包括客製化指令在執行過程中所需週期的估計值,而此文件還用C語言來描述客製化指令集在模擬器csim會需要的指令語義。ACE也會自動生成如圖2中的Intrinsic Function「acc_madd32()」。此外,ACE設計者只需要在Concise Verilog的//ACE_BEGIN和//ACE_END之間提供客製化指令本身的邏輯,即可不必提供流水線控制、ACE和CPU接口等細部的電路邏輯,這些都會由COPILOT自動處理。在原來的應用程序代碼(如圖3代碼所示)中,本來用於執行演算法的C代碼中的For循環可以用新的函數「ace_madd32()」以及Operand來替換。
圖2 ACE...