hide:
Running on a platform like RISC-V involves cross-compiling from a host platform (e.g. Linux) to a target platform (a specific RISC-V CPU architecture and operating system):
You should already be able to build IREE from source on your host platform. Please make sure you have followed the getting started steps.
You'll need a RISC-V LLVM compilation toolchain and a RISC-V enabled QEMU emulator.
See instructions in the following links
!!! note The RISCV_TOOLCHAIN_ROOT
environment variable needs to be set to the root directory of the installed GNU toolchain when building the RISC-V compiler target and the runtime library.
Execute the following script to download the prebuilt RISC-V toolchain and QEMU from the IREE root directory:
./build_tools/riscv/riscv_bootstrap.sh
!!! note The prebuilt toolchain is built with AlmaLinux release 8.8 docker It requires glibc >= 2.28 for your host machine.
For RISC-V vector extensions support, see additional instructions
Build and install on your host machine:
cmake -GNinja -B ../iree-build/ \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_INSTALL_PREFIX=../iree-build/install \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ . cmake --build ../iree-build/ --target install
The following instruction shows how to build for a RISC-V 64-bit Linux machine. For other RISC-V targets, please refer to riscv.toolchain.cmake as a reference of how to set up the cmake configuration.
cmake -GNinja -B ../iree-build-riscv/ \ -DCMAKE_TOOLCHAIN_FILE="./build_tools/cmake/riscv.toolchain.cmake" \ -DIREE_HOST_BIN_DIR=$(realpath ../iree-build/install/bin) \ -DRISCV_CPU=linux-riscv_64 \ -DIREE_BUILD_COMPILER=OFF \ -DRISCV_TOOLCHAIN_ROOT=${RISCV_TOOLCHAIN_ROOT} \ -DIREE_ENABLE_CPUINFO=OFF \ . cmake --build ../iree-build-riscv/
!!! note The following instructions are meant for the RISC-V 64-bit Linux target. For the bare-metal target, please refer to simple_embedding to see how to build a ML workload for a bare-metal machine.
Set the path to qemu-riscv64 Linux emulator binary in the QEMU_BIN
environment variable. If it is installed with riscv_bootstrap.sh
, the path is default at ${HOME}/riscv/qemu/linux/RISCV/bin/qemu-riscv64.
export QEMU_BIN=<path to qemu-riscv64 binary>
Invoke the host compiler tools to produce a bytecode module FlatBuffer:
../iree-build/install/bin/iree-compile \ --iree-hal-target-backends=vmvx \ samples/models/simple_abs.mlir \ -o /tmp/simple_abs_vmvx.vmfb
Run the RISC-V emulation:
${QEMU_BIN} \ -cpu rv64 \ -L ${RISCV_TOOLCHAIN_ROOT}/sysroot/ \ ../iree-build-riscv/tools/iree-run-module \ --device=local-task \ --module=/tmp/simple_abs_vmvx.vmfb \ --function=abs \ --input=f32=-5
RISC-V Vector extensions allows SIMD code to run more efficiently. To enable the vector extension for the compiler toolchain and the emulator, build the tools from the following sources:
git://sourceware.org/git/binutils-gdb.git
(master branch) manually.The SIMD code can be generated following the IREE CPU flow with the additional command-line flags
tools/iree-compile \ --iree-hal-target-backends=llvm-cpu \ --iree-llvmcpu-target-triple=riscv64 \ --iree-llvmcpu-target-cpu=generic-rv64 \ --iree-llvmcpu-target-abi=lp64d \ --iree-llvmcpu-target-cpu-features="+m,+a,+f,+d,+zvl512b,+v" \ --riscv-v-fixed-length-vector-lmul-max=8 \ iree_input.mlir -o mobilenet_cpu.vmfb
Then run on the RISC-V QEMU:
${QEMU_BIN} \ -cpu rv64,x-v=true,x-k=true,vlen=512,elen=64,vext_spec=v1.0 \ -L ${RISCV_TOOLCHAIN_ROOT}/sysroot/ \ ../iree-build-riscv/tools/iree-run-module \ --device=local-task \ --module=mobilenet_cpu.vmfb \ --function=predict \ --input="1x224x224x3xf32=0"