首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RISCV-向量clang导致尖峰中的非法指令

RISCV-向量clang导致尖峰中的非法指令
EN

Stack Overflow用户
提问于 2022-02-04 10:29:51
回答 3查看 408关注 0票数 0

我希望你能帮我解决我的RISC-V问题。

我目前正在试验RISC-V的向量(RVV)指令的工具链支持。根据我在互联网上的发现,规范目前冻结在1.0版本。GCC有一个支持RVV,但它已不再积极维护。另一方面,LLVM支持RVV。

因此,我使用以下工具设置了一个Docker容器:RISC工具(basic处的存储库)、spike (最新提交)和LLVM (最新提交)。

接下来,我使用以下命令编译了一个sgemm实例clang -march=rv32gcv --target=riscv32 --sysroot=/usr/local/riscv32-unknown-elf --gcc-toolchain=/usr/local -O2 sgemm.c -o sgemm.elf。命令成功运行,我得到一个精灵文件,使用objdump看上去很好:它使用向量指令。

现在是我的问题:之后,我想用指令集模拟器尖峰验证二进制文件。因此,我运行了:spike /usr/local/riscv32-unknown-elf/bin/pk sgemm.elf,它最终执行了一条非法指令(有关完整错误消息,请参见下面)。下面的操作失败:0xb2905457。我用echo "DASM(0xb2905457)" | spike-dasm -> vfmacc.vf v8, v9, ft0解码了指令,这在我看来很好。

我已经看过了斯派克的密码,以及为什么会失败,但我迷路了。

也许你知道这里出了什么问题?我有一种感觉,我的向量单元配置错误(setvl指令)。我希望你们能在这方面给我一些支持!

非常感谢提前!时间

来自斯派克的错误消息:

代码语言:javascript
复制
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!
EN

回答 3

Stack Overflow用户

发布于 2022-04-26 00:53:02

你应该试试

代码语言:javascript
复制
spike --isa=rv64gcv --varch=vlen:128,elen:64 /usr/local/riscv32-unknown-elf/bin/pk sgemm.elf

--isa=rv64gcv --varch=vlen:128,elen:64运行命令中添加spike

票数 1
EN

Stack Overflow用户

发布于 2022-04-27 08:08:11

GCC现在支持RVV的本质和自动矢量化.您可以签出riscv-gcc -rvv-next的分支,以及riscv-binutils目录中的"riscv-binutils-2.38“分支。然后建立整个工具链。

票数 1
EN

Stack Overflow用户

发布于 2022-04-26 12:40:14

所以我想,随着时间的推移,我找到了解决办法。然而,直到现在,我忘了把它寄出去。事实上,在构建Docker容器时以及在构建过程中都出现了一些问题。这个错误起源于早期在斯派克执行精灵时的一个点。

我只能告诉每个人检查spike -d $PK $ELF 2> debug.txt,看看哪里出了问题。

无论如何,我为任何人附加了Dockerfile和Makefile,这些文件可能会遇到相同的问题。

Dockerfile:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

希望这对你有帮助!

谢谢蒂姆

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70984863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档