我希望你能在RISC-V问题上帮助我。
我目前正在试验RISC-V矢量(RVV(指令的工具链支持。根据我在互联网上发现的,该规范目前冻结在v1.0版本。GCC有一个支持RVV,但它不再被积极维护。另一方面,LLVM支持RVV。
因此,我继续设置了一个Docker容器,其中包含:RISC-V工具(Repo在基本rvv中(、spike(最新提交(和LLVM(最新交付(。
接下来,我用以下命令编译了一个sgemm示例:clang -march=rv32gcv --target=riscv32 --sysroot=/usr/local/riscv32-unknown-elf --gcc-toolchain=/usr/local -O2 sgemm.c -o sgemm.elf
。该命令成功运行,我得到了一个elf文件,使用objdump看起来很好:它使用矢量指令。
现在我的问题是:之后,我想用指令集模拟器spike来验证二进制文件。因此,我运行了:spike /usr/local/riscv32-unknown-elf/bin/pk sgemm.elf
,它最终执行了一条非法指令(请参阅下面的完整错误消息(。以下OP失败:0xb2905457
。我用echo "DASM(0xb2905457)" | spike-dasm
->vfmacc.vf v8, v9, ft0
,我觉得不错。
我已经了解了spike的代码,以及为什么它可能会失败,但我迷路了。
也许你知道这里出了什么问题?我感觉我的矢量单元配置错误(setvl
指令(。我希望你们能在这方面给我一些支持!
提前非常感谢!Tim
来自尖峰的错误消息:
bbl loader
z 00000000 ra 000103cc sp 7ffffd70 gp 00020810
tp 00000000 t0 00000020 t1 bf06fb33 t2 00000000
s0 00020090 s1 00020b54 a0 00000004 a1 00020000
a2 00020010 a3 00000004 a4 00020b94 a5 0000001c
a6 bfed957a a7 00020b94 s2 00000000 s3 00000000
s4 00000000 s5 00000000 s6 00000000 s7 00000000
s8 00000000 s9 00000000 sA 00000000 sB 00000000
t3 3ea13dab t4 bf4b3713 t5 3ea6844f t6 3fdfe3d3
pc 000103ea va/inst b2905457 sr 80006620
An illegal instruction was executed!
您应该尝试
spike --isa=rv64gcv --varch=vlen:128,elen:64 /usr/local/riscv32-unknown-elf/bin/pk sgemm.elf
在spike
运行命令中添加--isa=rv64gcv --varch=vlen:128,elen:64
。
GCC现在支持RVV内部函数和自动矢量化。您可以结账"riscv gcc rvv next";在riscv-gcc目录中的分支;riscv-二进制-2.38〃;在riscv binutils目录中。然后构建整个工具链。
所以我认为随着时间的推移,我找到了一个解决方案。但是,直到现在我都忘了贴。事实上,在构建Docker容器的过程中,也可能在构建过程中出现了问题。这个错误源于之前在spike中执行精灵时的一个点。
我只能告诉大家查看spike -d $PK $ELF 2> debug.txt
,看看哪里出了问题。
无论如何,我为任何可能遇到相同问题的人附上了Dockerfile和Makefile。
Dockerfile:
FROM gcc:11.2
RUN apt update
RUN apt install -y autoconf automake autotools-dev curl python3 gawk
build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev
libexpat-dev cmake vim device-tree-compiler libmpc-dev libmpfr-dev
gdb zsh tmux libgmp-dev &&
apt clean -y &&
apt autoremove -y
#environemnt
ARG CFLAGS=-D__riscv_compressed
#install toolchain
RUN mkdir riscv-gnu-toolchain && cd riscv-gnu-toolchain &&
git clone https://github.com/riscv/riscv-gnu-toolchain . &&
git fetch &&
git checkout basic-rvv &&
git submodule update --init --recursive &&
./configure --with-arch=rv32gc --with-abi=ilp32d &&
make -j32 &&
make install &&
cd .. &&
rm riscv-gnu-toolchain -rf
#install spike
RUN mkdir -p /build/spike/build /build/spike/repo && cd /build/spike &&
git clone https://github.com/riscv/riscv-isa-sim.git repo &&
cd /build/spike/build &&
../repo/configure --with-varch=vlen:128,elen:32 --with-isa=rv32imafcv &&
make && make install &&
cd /build &&
rm /build/spike -rf
# install pk
RUN mkdir -p /build/pk/build /build/pk/repo && cd /build/pk &&
git clone https://github.com/riscv/riscv-pk.git repo &&
cd /build/pk/build &&
../repo/configure --host=riscv32-unknown-elf --with-arch=rv32gc CC=riscv32-unknown-elf-gcc --with-abi=ilp32d &&
make && make install &&
cd /build &&
rm /build/pk -rf
# install llvm
RUN mkdir -p /build/llvm && cd /build/llvm &&
git clone https://github.com/llvm/llvm-project . &&
mkdir build && cd build &&
cmake -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="RISCV"
-DLLVM_DEFAULT_TARGET_TRIPLE=riscv32-unknown-elf
-DCMAKE_BUILD_TYPE=Release -DDEFAULT_SYSROOT=/usr/local/riscv32-unknown-elf
-DLLVM_ENABLE_PROJECTS="clang;lld" ../llvm &&
make -j32 &&
make install &&
cd /build &&
rm /build/llvm -rf
WORKDIR /root
Makefile(假设唯一的文件是test_sgemm.c
(
PREFIX = riscv32-unknown-elf
AR = $(PREFIX)-ar
CC = $(PREFIX)-gcc
CLANG = clang
MARCH = rv32gcv
INCLUDES =
CFLAGS = -march=$(MARCH) --target=riscv32
--sysroot=/usr/local/riscv32-unknown-elf
--gcc-toolchain=/usr/local
-g
OBJS = $(patsubst %.c, %_$(MARCH).o, $(wildcard *.c))
all: test_sgemm.elf
%.o: %.c $(DEPS)
$(CLANG) -c -o $@ $< $(CFLAGS) $(INCLUDES)
%.elf: %.o
$(CLANG) -o $@ $< $(CFLAGS)
希望这对你有帮助!
谢谢Tim