声明:RISCV具有多元、包容、普惠、开源的特点。作者本着RISC-V的特点,同意本内容允许任意转载,转载若修改,请先联系下面邮箱,本篇文章参考了很多方法,最下面有参考内容的链接,认为有侵权的地方,请联系,随时删。发本篇文章旨在帮助更多研究RISCV向量拓展的小白,内容写的比较白话,有需要的仔细阅读,看不懂的或者发现错误,欢迎发邮件至1416024711@qq.com。
下面是针对rvv1.0工具链安装的流程,中间踩了很多坑,按下面的方法完成了RISCV “V”拓展的环境搭建(针对1.0版本),ubuntu是20.04版本。Ubuntu我分配了16G内存,100G磁盘,如果内存太小在make的时候肯定会失败。
Ubuntu首先安装依赖:
apt-get install git build-essential tcl expect flex texinfo bison libpixman-1-dev libglib2.0-dev pkg-config zlib1g-dev ninja-build autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk gperf libtool patchutils bc libexpat-dev python
第一步:因为网速的限制,又不能翻墙,所以我把本框的指令写进脚本,在华为云服务器上面跑了一遍下面的脚本,旨在下载riscv-gnu-toolchain所需要的模块(如果自己的网速不好,又没有其他服务器可用,可以联系上面邮箱,免费提供我已经下载好的,第一步就省去了),这一步消耗时间比较长。但是只要能下载下来各模块慢点也是可以的。 1首先在华为云服务器上新建目录RISCV(自己网速理想的可以直接在ubuntu里面进行,顺序都是一样的) cd RISCV //打开该目录 2 在RISCV目录里跑脚本install.sh //install.sh里面的内容就是本框的蓝色字体(如果你发现你的脚本无法执行,有可能是脚本执行权限没有修改,修改权限指令:chmod 754 install.sh,再次尝试,应该就可以了) install.sh里面的内容: #get source git clone https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain git submodule update --init cd riscv-gcc git fetch origin git checkout origin/riscv-gcc-10.1-rvv-dev cd ../riscv-binutils git fetch origin git checkout origin/rvv-1.0.x-zfh cd .. 3 脚本跑结束,会在RISCV目录里看到riscv-gnu-toolchain目录,到此处第一步就完成了 |
第二步,因为我要在ubuntu20.04里面(下面简称ubuntu)安装工具链,所以我将上一步的整个RISCV目录从华为云服务器复制进了Ubuntu里面。(因为文件太大,建议先将华为服务器中的RISCV目录压缩,等放进ubuntu中之后再解压缩) 下面的步骤都是在ubuntu中进行 # make rv64 //安装rv64的 1 cd RISCV/riscv-gnu-toolchain //进入目录 2 执行指令:./configure --prefix="$PWD/opt-riscv-rv64/" --with-arch=rv64gcv --with-abi=lp64d --with-multilib-generator="rv64gcv-lp64d--" 3执行指令:make -j $(nproc) //如果make -j $(nproc) 失败,试试执行make -j 1,如果失败一般是内存的问题,这一步需要很大的内存,我给Ubuntu分配了16G,这一步执行完就执行结束了。安装完成。打开RISCV/riscv-gnu-toolchain/opt-riscv-rv64/bin目录就可以看到我们编译需要的工具,如下图 最后设置环境变量: 4 vim ~/.bashrc 进入之后在最下面添加两行: 5 export RISCV="/home/lifei/RISCV/riscv-gnu-toolchain/opt-riscv-rv64" export PATH=$PATH:$RISCV/bin //home/lifei/RISCV/riscv-gnu-toolchain/opt-riscv-rv64是我的路径,你自己的查看一下,在opt-riscv-rv64目录下输入pwd将显示出的路径就是你的,复制进去就行了。后面应该都是一样的,就/home/life/可能不一样。 保存退出 6 source ~/.bashrc //使之生效,至此riscv-gnu-toolchain全部0k 下面的指令可以不执行,直接进入第三步。 # test rv64 //测试验证 make report-gcc-newlib -j $(nproc) //可以不执行 make report-binutils-newlib -j $(nproc) //可以不执行 安装32位的,和安装64位的一样,不再赘述,若不需要可以忽略。 # make rv32 make clean ./configure --prefix="$PWD/opt-riscv-rv32/" --with-arch=rv32gcv --with-abi=ilp32d --with-multilib-generator="rv32gcv-ilp32d--" make -j $(nproc) make report-gcc-newlib -j $(nproc) make report-binutils-newlib -j $(nproc) |
第三步:安装spike 进spike链接下载压缩包https://github.com/riscv/riscv-isa-sim.git //网速不好,下载压缩包 将下载好的压缩包放进ubuntu的RISCV目录里,进行解压缩。解压缩之后按下面进行。 cd RISCV RISCV$ cd riscv-isa-sim-master riscv-isa-sim$ mkdir build riscv-isa-sim$ cd build build$ ../configure --prefix=$RISCV/newlib #linux版为$RISCV/linux build$ make -j $(nproc) //如果失败,尝试执行 make -j 1 build$ make install //如果失败,尝试 sudo make install 上面执行完spike就安装完成了,进入目录/home/lifei/RISCV/riscv-isa-sim-master/newlib/bin就可以看到如下图一样。 设置环境变量 vim ~/.bashrc 进入之后在最下面添加两行: export SPIKE="/home/lifei/RISCV/riscv-isa-sim-master/newlib" //路径写自己的,参考上面。 export PATH=$SPIKE/bin:$PATH 保存退出 source ~/.bashrc //使之生效,至此spike全部0k |
第四步:安装pk 进pk链接https://github.com/riscv/riscv-pk.git 下载压缩包 //网速不好,下载压缩包 将下载好的压缩包放进ubuntu的RISCV目录里,进行解压缩。解压缩之后按下面进行。 cd RISCV RISCV$ cd riscv-pk-master riscv-pk$ mkdir -p build/newlib riscv-pk$ cd build/newlib newlib$ ../../configure --prefix=$RISCV/newlib --host=riscv64-unknown-elf #linux版为$RISCV/linux/bin/riscv64-unknown-linux newlib$ make -j $(nproc) //如果失败试试 make -j 1 newlib$ make install //如果失败试试sudo make install 进入RISCV/riscv-pk-master/newlib/riscv64-unknown-elf/bin里面就可以看到pk的文件 不用添加环境变量,至此pk安装ok |
第五步:测试(测试参考了下面的声明链接,只将v_test.s 里面的向量指令修改成了0.10版本对应的指令) 在桌面上新建v_test.s文件里面的内容为 #void #saxpy(size_t n, const float a, const float *x, float *y) # { # size_t i; # for (i=0; i # } # register arguments: # a0 n # fa0 a # a1 x # a2 y .global saxpy saxpy: vsetvli a4, a0, e32, m8,ta,ma vle32.v v0, (a1) sub a0, a0, a4 slli a4, a4, 2 add a1, a1, a4 vle32.v v8, (a2) vfmacc.vf v8, fa0, v0 vse32.v v8, (a2) add a2, a2, a4 bnez a0, saxpy ret 保存 在桌面目录执行指令:riscv64-unknown-elf-as -march=rv64gcv --mabi=lp64d v_test.s -o v_test.o 会在桌面上看到生成的v_test.o文件 然后新建callsaxpy.c内容为: #include #include extern void saxpy(size_t n, const float a, const float *x, float *y); int main(){ size_t size=3; const float a=1.0; const float array1[]={1.0,2.0,3.0}; float array2[]={1.0,2.0,3.0}; for(int i =0;i printf("%fn", array2[i]); } printf("----------------n"); //调用saxpy函数 saxpy(size,a,array1,array2); for(int i =0;i printf("%fn", array2[i]); } return 0; } 保存 执行指令:riscv64-unknown-elf-gcc -c callsaxpy.c -o callsaxpy.o 会在桌面上看到生成的callsaxpy.o文件 接着在桌面目录下执行:riscv64-unknown-elf-gcc -static v_test.o callsaxpy.o -o out 在桌面会看到生成的out可执行文件 最后:进入显示右边内容的目录 在此目录下执行:spike --isa=RV64GCV pk ../../../../../Desktop/out //其实就是pk桌面目录的out文件 可以看到输出: 完成,测试证明支持rvv1.0版本指令。 |
参考链接: https://github.com/sunshaoce/learning-riscv/blob/b5e2d024dde351e642ae359799853bf7119f6b96/2/2.md https://github.com/mollybuild/RISCV-Measurement/blob/master/run-riscv-gnu-toolchain-testsuite-for-BKV-extension.md https://blog.csdn.net/ALLap97/article/details/106246395?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-8.control&dist_request_id=1328641.26139.16156374009989455&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-8.control https://github.com/plctlab/riscv-ci/blob/main/gnu-toolchan-rvv-1.0.sh |