環境使用 Ubuntu 22.04,並安裝下列工具:
測試指令example:
$ riscv64-unknown-linux-gnu-gcc -static -o hello hello.c
$ spike --isa=RV64GC /opt/riscv/riscv64-unknown-linux-gnu/bin/pk helloμRISC-V: An Enhanced RISC-V Processor Design using Spike
讀入兩整數 a, b,透過 RISC-V 的 div 指令完成 a / b:
執行 c[i] = a[i] / b[i],使用指標與組語進行迴圈計算與遞增:
以三層巢狀迴圈實作矩陣 h[3x3] 乘向量 x[2x3],輸出為 y[3x2],僅將最內層乘加運算改為 inline assembly,並透過標籤與 beq 實現分支邏輯與條件跳轉。
完全以 inline assembly 取代三層巢狀迴圈邏輯,包括 index 變數初始化、條件判斷、記憶體位移與加總操作:
li %[i], 0
loop1:
...
bne %[i], t5, loop1學習以組語完整模擬 C 語言控制流程。
Performance Modeling for the μRISC-V Processor 透過撰寫 inline assembly 並插入計數器,統計各類指令數量並計算週期與 CPU 時間,進一步判斷程式為 CPU-bound 或 Memory-bound。
- 以 RV64I 組語實作 Gregory-Leibniz π 計算迴圈。
- 以 RV64I 組語實作逐項陣列乘法
y[i] = h[i] * x[i] + id。 - 每次迴圈處理一筆資料,為 baseline(未加速)版本。
- 記錄指令計數以分析效能瓶頸。
- 使用 RISC-V V extension(vlen=128)向量化處理。
- 同步處理多筆陣列資料以加速乘法與加法。
- 利用
vle16.v,vmul.vv,vadd.vv,vse16.v等向量指令。
- 延續 version1 實作,但使用 vlen=256 配置。
Reducing Memory Access Overhead for the μRISC-V Processor
- 修改
cachesim.h與cachesim.cc - 原本使用亂數(LFSR)替換策略
- 改為每個 set 維護一個 FIFO queue(
std::vector<std::queue<size_t>>) victimize()中總是替換最早進入的 way
RV64I ,改寫 2D 卷積計算流程 原本的
conv2d.S的 i/j 迴圈順序為 j 外、i 內(不利於 row-major 的資料排列)
- 重寫整體迴圈結構,明確以
i為外層、j為內層迴圈,更符合 cache-friendly 存取 有助於減少 cache miss。
- 一般 triple loop:x, y, z
- 每次都整個 row × col,cache reuse 效果差
- 沒有 blocking,造成 memory 重複 load
- 利用區塊操作增加資料 reuse 機會
- 減少跨 row 與 col 的 cache line reload
- Blocking 範圍依 cache 尺寸調整 (這邊定BLOCK_SIZE = 8 )