目录

RISC-V AME/RVV C 算子复现仓库

本仓库收集一组可独立构建、验证和运行的 RISC-V C 算子实现,当前覆盖三类路径:

  • FPGA AME:matmul_ame
  • gem5 AME / AME+RVV bare-metal:matmul_ameLMHead_ameQKVProjection_ameCrossAttention_ameSelfAttention_ameScaledDotProduct_ameProjectionEmbeddingHead_ameTranspose_ame
  • QEMU RVV:addmulsoftmaxgelurms_normropeConv2DSiLU/SwishGLU/SwiGLULayerNormPoolingConcat/SplitTokenEmbeddingPositionEmbeddingPatchEmbedding/ConvStemGather/SliceReshape/ViewTranspose

每个算子目录都自带源码、测试、Makefile 和子目录 README。当前工作区保留了已生成的 ELF/bin、QEMU 日志或 gem5 输出;这些都是生成物,后续可用对应目录的 make clean 清理后重新生成。

Operator List

目录 算子 指令路径 验证/运行方式 主要产物
matmul_ame/ AME int8 matmul AME + RVV 辅助 FPGA bin / gem5 bare-metal build/models_ame_matmul_fpga.binbuild/gem5/models_ame_matmul_gem5.elf
LMHead_ame/ W8A8 LMHead AME gem5 bare-metal build/lm_head_ame_gem5.elf
QKVProjection_ame/ fused QKV projection AME + RVV gem5 bare-metal build/qkv_projection_ame_gem5.elf
CrossAttention_ame/ CrossAttention forward AME + RVV gem5 bare-metal build/cross_attention_ame_gem5.elf
SelfAttention_ame/ SelfAttention forward AME + RVV gem5 bare-metal build/self_attention_ame_gem5.elf
ScaledDotProduct_ame/ scaled dot product attention AME + RVV gem5 bare-metal build/scaled_dot_product_ame_gem5.elf
ProjectionEmbeddingHead_ame/ Projection / EmbeddingHead forward AME + RVV gem5 bare-metal build/projection_embedding_head_ame_gem5.elf
Transpose_ame/ FP32 2D transpose AME gem5 bare-metal build/transpose_ame_gem5.elf
add_rvv/ FP32 vector add RVV QEMU RV64 + RVV build/rvv_add
mul_rvv/ FP32 vector mul RVV QEMU RV64 + RVV build/rvv_mul
softmax_rvv/ FP32 softmax RVV QEMU RV64 + RVV build/rvv_softmax
gelu_rvv/ FP32 GELU RVV QEMU RV64 + RVV build/rvv_gelu
rms_norm_rvv/ FP32 RMSNorm forward/backward RVV QEMU RV64 + RVV build/rvv_rms_norm
rope_rvv/ FP32 RoPE / rotary embedding RVV QEMU RV64 + RVV build/rvv_rope
Conv2D_rvv/ FP32 Conv2D forward RVV QEMU RV64 + RVV build/rvv_conv2d
SiLU_rvv/ FP32 SiLU / Swish RVV QEMU RV64 + RVV build/rvv_silu
GLU_rvv/ FP32 GLU / SwiGLU RVV QEMU RV64 + RVV build/rvv_glu
LayerNorm_rvv/ FP32 LayerNorm forward/backward RVV QEMU RV64 + RVV build/rvv_layernorm
pooling_rvv/ FP32 pooling RVV QEMU RV64 + RVV build/rvv_pooling
concat_split_rvv/ FP32 concat / split RVV QEMU RV64 + RVV build/rvv_concat_split
TokenEmbedding_rvv/ FP32 TokenEmbedding forward/backward RVV QEMU RV64 + RVV build/rvv_token_embedding
PositionEmbedding_rvv/ FP32 PositionEmbedding forward/backward RVV QEMU RV64 + RVV build/rvv_position_embedding
PatchEmbedding_ConvStem_rvv/ FP32 PatchEmbedding / ConvStem forward RVV QEMU RV64 + RVV build/rvv_patch_embedding_convstem
gather_slice_rvv/ FP32 Gather / Slice RVV QEMU RV64 + RVV build/rvv_gather_slice
Reshape_View_rvv/ FP32 Reshape / View RVV QEMU RV64 + RVV build/rvv_reshape_view
Transpose_rvv/ FP32 Transpose RVV QEMU RV64 + RVV build/rvv_transpose

Repository Layout

kernel_c/
├── matmul_ame/                  # FPGA AME matmul;同时支持 gem5 bare-metal
├── LMHead_ame/                  # gem5 AME LMHead
├── QKVProjection_ame/           # gem5 AME+RVV fused QKV projection
├── CrossAttention_ame/          # gem5 AME+RVV CrossAttention
├── SelfAttention_ame/           # gem5 AME+RVV SelfAttention
├── ScaledDotProduct_ame/        # gem5 AME+RVV scaled dot product attention
├── ProjectionEmbeddingHead_ame/ # gem5 AME+RVV projection head
├── Transpose_ame/               # gem5 AME FP32 transpose
├── *_rvv/                       # QEMU RVV 算子
└── README.md

典型 AME/gem5 目录结构:

<operator>_ame/
├── include/       # public API and AME intrinsic wrappers
├── src/           # operator implementation
├── tests/         # deterministic fixture, scalar reference, UART test main
├── platform/      # gem5 bare-metal crt, linker, UART, tiny libc helpers
├── original_ops/  # optional source-level semantic reference
├── build/         # ELF/map/object outputs; matmul_ame also has build/gem5/
└── Makefile

典型 RVV/QEMU 目录结构:

<operator>_rvv/
├── rvv_*.c
├── rvv_*_test.c
├── rvv_common.h
├── build/
├── README.md
└── Makefile

当前工作区使用的本机路径:

kernel_c:        /home/luoyue/project/kernel_c
RuyiAI LLVM:     /home/luoyue/opt/llvm-project-riscv
gem5 AME/RVV:    /home/luoyue/project/gem5-main
RISC-V sysroot:  /usr/riscv64-linux-gnu

已验证过的工具链组合:

Ubuntu 24.04 x86_64
riscv64-linux-gnu-gcc 13.3.0
GNU binutils 2.42
qemu-riscv64 11.0.0
gem5 24.1.0.3, custom RISC-V AME/RVV tree
RuyiAI clang 23.0.0git, commit 926a1ea856cbb7978514c7c960aa16c3a835381c

基础依赖:

sudo apt update
sudo apt install -y \
  git make cmake ninja-build build-essential \
  gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu \
  qemu-user

工具链检查:

riscv64-linux-gnu-gcc --version
riscv64-linux-gnu-readelf --version
riscv64-linux-gnu-objdump --version
qemu-riscv64 --version
test -d /usr/riscv64-linux-gnu && echo "RISC-V sysroot OK"

matmul_ame/Makefile 会优先尝试 ~/opt/llvm-project-riscv/build/bin 下的 clang/llvm-objdump;其它部分历史 AME 目录仍保留旧机器上的默认 CLANG/LLVM_OBJDUMP 路径。推荐在命令行统一覆盖:

export AME_CLANG=/home/luoyue/opt/llvm-project-riscv/build/bin/clang
export AME_OBJDUMP=/home/luoyue/opt/llvm-project-riscv/build/bin/llvm-objdump

Run RVV Operators in QEMU

RVV 算子使用发行版 riscv64-linux-gnu-gcc 静态交叉编译,并使用 qemu-riscv64 用户态运行。默认 QEMU CPU 为:

rv64,v=true,vlen=256,elen=64

通用命令:

cd /home/luoyue/project/kernel_c/<operator_dir>
make clean
make run
make verify

例如:

cd /home/luoyue/project/kernel_c/Transpose_rvv
make clean
make run
make verify

make run 会运行 QEMU 并生成 build/*_qemu.logmake verify 会检查 RISC-V ELF、关键 RVV 指令和 PASS 结果。

RVV 目录当前只保留 QEMU 用户态运行目标,不再提供 gem5 SE run_gem5 目标。

Build AME / AME+RVV gem5 ELFs

gem5 bare-metal 算子使用 RuyiAI clang 编译,入口地址为 0x80000000。通用构建命令:

cd /home/luoyue/project/kernel_c/<operator_dir>
make clean
make verify \
  CLANG="$AME_CLANG" \
  LLVM_OBJDUMP="$AME_OBJDUMP"

make verify 通常会检查:

  • ELF entry 是否为 0x80000000
  • AME 指令是否出现,如 mlae8.mmlbe8.mmqma.b.mmmsce32.m
  • AME+RVV 混合算子是否出现 RVV 指令,如 vsetvlivfred*vse32.v
  • 部分目录还会检查源码中没有手写 .word 或 inline asm

大多数 AME/gem5 目录只提供 make verify 目标,用于生成并静态检查 ELF。当前额外提供运行目标的目录是:

  • Transpose_ame: make run / make run-gem5
  • matmul_ame: make gem5 / make verify-gem5 / make run-gem5

对没有 run-gem5 目标的目录,可用同一 gem5 命令模板运行对应 ELF:

GEM5_ROOT=/home/luoyue/project/gem5-main
ELF=/home/luoyue/project/kernel_c/QKVProjection_ame/build/qkv_projection_ame_gem5.elf
OUT=/tmp/gem5-qkv-projection-run

rm -rf "$OUT"
"$GEM5_ROOT"/build/RISCV/gem5.opt \
  -d "$OUT" \
  "$GEM5_ROOT"/configs/example/riscv/fs_linux.py \
  --kernel="$ELF" \
  --cpu-type=TimingSimpleCPU \
  --bare-metal \
  --mem-size=8GB
sed -n '1,260p' "$OUT"/system.platform.terminal

多数 AME+RVV 测试成功运行时 UART 结尾为:

ALL PASS

Transpose_ame 的 UART 结尾是单行 PASSmatmul_ame 的完整回归结束后会输出 ALL PASS

Build AME Matmul FPGA Bin

matmul_ame 使用 AME 扩展指令,包括 msettile*mlae8.mmlbe8.mmsce32.mmqma.b.mm 等。Ubuntu 官方 clang 通常不支持这些扩展,需要使用 RuyiAI LLVM fork。

构建 RuyiAI clang:

mkdir -p "$HOME/opt"
git clone https://github.com/RuyiAI-Stack/llvm-project.git \
  "$HOME/opt/llvm-project-riscv"
cd "$HOME/opt/llvm-project-riscv"
git checkout 926a1ea856cbb7978514c7c960aa16c3a835381c

cmake -S llvm -B build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_PROJECTS="clang" \
  -DLLVM_TARGETS_TO_BUILD="RISCV"

ninja -C build clang
export AME_CLANG="$HOME/opt/llvm-project-riscv/build/bin/clang"
export AME_OBJDUMP="$HOME/opt/llvm-project-riscv/build/bin/llvm-objdump"
"$AME_CLANG" --version

生成 FPGA bin:

cd /home/luoyue/project/kernel_c/matmul_ame
make clean
make CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP"
make verify CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP"

主要产物:

matmul_ame/build/models_ame_matmul_fpga.bin
matmul_ame/build/models_ame_matmul_fpga.elf
matmul_ame/build/models_ame_matmul_fpga.map

FPGA bin 加载/入口地址为 0x86400000,UART MMIO 地址为 0x10000000

matmul_ame 也支持 gem5 bare-metal 目标:

cd /home/luoyue/project/kernel_c/matmul_ame
make gem5 CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP"
make verify-gem5 CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP"
make run-gem5 CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP" \
  GEM5_ROOT=/home/luoyue/project/gem5-main \
  GEM5_CPU_TYPE=AtomicSimpleCPU

gem5 主要产物和日志位置:

matmul_ame/build/gem5/models_ame_matmul_gem5.elf
matmul_ame/build/gem5/models_ame_matmul_gem5.map
matmul_ame/build/m5out_matmul_gem5/system.platform.terminal

完整 UART 回归包含 20 个用例:Decode 101-108、Prefill 201-210、Sequence batch-vs-noblk 301、GEMV compatibility alias 401

Current Verification Summary

当前工作区中保留的验证痕迹:

  • 18 个 RVV/QEMU 目录均保留 build/*_qemu.log,日志可确认 PASS
  • AME/gem5 ELF 已生成并确认入口为 0x80000000LMHead_ameQKVProjection_ameCrossAttention_ameSelfAttention_ameScaledDotProduct_ameProjectionEmbeddingHead_ameTranspose_amematmul_ame/build/gem5/models_ame_matmul_gem5.elf
  • Transpose_ame/build/m5out_transpose_ame/system.platform.terminal 保留 7/7 case 的 PASS 运行日志。
  • matmul_ame/build/models_ame_matmul_fpga.bin 已生成;当前保留的 matmul_ame/build/m5out_matmul_gem5/system.platform.terminal 是未完整结束的 gem5 输出,已显示 case 101-203 通过,文件末尾停在 case 204 开头。如需确认完整 20-case 回归,请重新运行 make run-gem5

Common Issues

clang: unknown argument or instruction requires ... XBOSCAME

当前 clang 不包含或没有正确启用 RuyiAI AME 扩展。请使用 RuyiAI LLVM fork,并确认 CLANG 指向该 clang:

make verify CLANG="$AME_CLANG" LLVM_OBJDUMP="$AME_OBJDUMP"

gem5 does not exit

gem5 bare-metal 算子的 platform/crt_uart.S 使用:

.word 0x4200007b

作为 m5_exit。请确认使用的是本仓库对应目录下的 platform/ 文件,以及 custom RISC-V AME/RVV gem5。

QEMU does not support RVV CPU properties

确认使用支持 RVV 1.0 的 qemu-riscv64。本仓库验证使用 QEMU 11.0.0:

qemu-riscv64 --version
qemu-riscv64 -cpu rv64,v=true,vlen=256,elen=64 \
  softmax_rvv/build/rvv_softmax

cannot find -lgcc or missing RISC-V headers

sudo apt install gcc-riscv64-linux-gnu
test -d /usr/riscv64-linux-gnu

Independence Notes

  • 每个 AME/gem5 目录的 Makefile 只读取本目录的 srcincludetestsplatform
  • RVV/QEMU 算子的 Makefile 只读取各自目录下的实现、测试和公共头。
  • 编译器、RISC-V sysroot、libgcc、binutils、QEMU、gem5 和 FPGA 运行环境属于外部工具链/平台依赖。
关于
7.8 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号