IREE biulding configs
Export variables
export WORKSPACE_DIR=${PWD}
# --- SELECT SOURCE ---
# Option A: Forked IREE
export IREE_SRC=${WORKSPACE_DIR}/third_party/iree_bar
# Option B: Standard IREE (Plugin)
# export IREE_SRC=${WORKSPACE_DIR}/third_party/iree
# ---------------------
# Host Paths
export BUILD_HOST_DIR=${WORKSPACE_DIR}/build-host
export INSTALL_HOST_DIR=${BUILD_HOST_DIR}/install
# RISC-V Paths
export RISCV_TOOLCHAIN_ROOT=${WORKSPACE_DIR}/riscv-tools-iree
export BUILD_RISCV_DIR=${WORKSPACE_DIR}/build-riscv
Host Build Options
A. Standard Release
Best for: Fast iteration, standard logs, deployment testing.
- Speed: High
- Tracing: OFF
- Checks: Minimal (assertions ON)
cmake \
-G Ninja \
-B "${BUILD_HOST_DIR}" \
-S "${IREE_SRC}" \
-DCMAKE_INSTALL_PREFIX="${INSTALL_HOST_DIR}" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DIREE_ENABLE_LLD=ON \
-DPython3_EXECUTABLE="$(which python3)" \
-DCMAKE_CXX_FLAGS="-Wno-error=cpp" \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF \
-DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF \
-DIREE_HAL_DRIVER_LOCAL_SYNC=ON \
-DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_BUILD_PYTHON_BINDINGS=ON \
-DIREE_ENABLE_ASSERTIONS=ON \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DIREE_BUILD_TESTS=ON \
-DIREE_BUILD_SAMPLES=ON
cmake --build "${BUILD_HOST_DIR}" --target install
B. Release + Profiling (Tracy)
Best for: Profiling compilation time and host runtime performance.
- Speed: High (Optimized)
- Tracing: ON (Tracy)
- Checks: Standard
cmake \
-G Ninja \
-B "${BUILD_HOST_DIR}-deb-tracy" \
-S "${IREE_SRC}" \
-DCMAKE_INSTALL_PREFIX="${INSTALL_HOST_DIR}-deb-tracy" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_CXX_FLAGS="-Wno-error=cpp -fno-omit-frame-pointer" \
-DCMAKE_C_FLAGS="-fno-omit-frame-pointer" \
-DIREE_ENABLE_LLD=ON \
-DPython3_EXECUTABLE="$(which python3)" \
-DIREE_ENABLE_RUNTIME_TRACING=ON \
-DIREE_ENABLE_COMPILER_TRACING=ON \
-DIREE_TRACING_MODE=4 \
-DIREE_LINK_COMPILER_SHARED_LIBRARY=OFF \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF \
-DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF \
-DIREE_HAL_DRIVER_LOCAL_SYNC=ON \
-DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_BUILD_PYTHON_BINDINGS=ON \
-DIREE_ENABLE_ASSERTIONS=ON \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
cmake --build "${BUILD_HOST_DIR}-deb-tracy" --target install
C. Debug + Sanitizers (ASan/UBSan)
Best for: Catching memory leaks, out-of-bounds access, and undefined behavior.
- Speed: Slow (~2x slowdown)
- Tracing: OFF
- Checks Max (Address Sanitizer + Undefined Behaviour Sanitizer)
cmake \
-G Ninja \
-B "${BUILD_HOST_DIR}-debug-profile" \
-S "${IREE_SRC}" \
-DCMAKE_INSTALL_PREFIX="${INSTALL_HOST_DIR}" \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="-Wno-error=cpp -fno-omit-frame-pointer" \
-DCMAKE_C_FLAGS="-fno-omit-frame-pointer" \
-DIREE_ENABLE_LLD=ON \
-DPython3_EXECUTABLE="$(which python3)" \
-DIREE_ENABLE_RUNTIME_TRACING=ON \
-DIREE_ENABLE_COMPILER_TRACING=ON \
-DIREE_LINK_COMPILER_SHARED_LIBRARY=OFF \
-DIREE_TRACING_MODE=4 \
-DIREE_TARGET_BACKEND_DEFAULTS=OFF \
-DIREE_TARGET_BACKEND_LLVM_CPU=ON \
-DIREE_HAL_DRIVER_DEFAULTS=OFF \
-DIREE_HAL_DRIVER_LOCAL_SYNC=ON \
-DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_BUILD_PYTHON_BINDINGS=ON \
-DIREE_ENABLE_ASSERTIONS=ON \
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DIREE_ENABLE_ASAN=ON \
-DIREE_ENABLE_UBSAN=ON
cmake --build "${BUILD_HOST_DIR}-debug-profile" --target install
Cross- Compilations RISC-V
One-time Bootstrap
A. Performance
Best for: Final benchmarking on Chipyard/FireSim.
unset CFLAGS CXXFLAGS
cmake \
-G Ninja \
-B "${BUILD_RISCV_DIR}" \
-S "${IREE_SRC}" \
-DCMAKE_TOOLCHAIN_FILE="${IREE_SRC}/build_tools/cmake/riscv.toolchain.cmake" \
-DIREE_HOST_BIN_DIR="${INSTALL_HOST_DIR}/bin" \
-DRISCV_CPU=linux-riscv_64 \
-DIREE_BUILD_COMPILER=OFF \
-DRISCV_TOOLCHAIN_ROOT="${RISCV_TOOLCHAIN_ROOT}/toolchain/clang/linux/RISCV" \
-DCMAKE_BUILD_TYPE=Release \
-DIREE_ENABLE_RUNTIME_TRACING=OFF \
-DIREE_ENABLE_CPUINFO=OFF \
-DIREE_HAL_DRIVER_DEFAULTS=OFF \
-DIREE_HAL_DRIVER_LOCAL_SYNC=ON \
-DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_BUILD_TESTS=OFF \
-DIREE_BUILD_SAMPLES=OFF
cmake --build "${BUILD_RISCV_DIR}"
B. Profiling and Debug
Best for: Deep debugging and generating traces on RISC-V.
unset CFLAGS CXXFLAGS
cmake \
-G Ninja \
-B "${BUILD_RISCV_DIR}" \
-S "${IREE_SRC}" \
-DCMAKE_TOOLCHAIN_FILE="${IREE_SRC}/build_tools/cmake/riscv.toolchain.cmake" \
-DIREE_HOST_BIN_DIR="${INSTALL_HOST_DIR}/bin" \
-DRISCV_CPU=linux-riscv_64 \
-DIREE_BUILD_COMPILER=OFF \
-DRISCV_TOOLCHAIN_ROOT="${RISCV_TOOLCHAIN_ROOT}/toolchain/clang/linux/RISCV" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DIREE_ENABLE_RUNTIME_TRACING=ON \
-DIREE_ENABLE_ASSERTIONS=ON \
-DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer" \
-DIREE_ENABLE_CPUINFO=OFF \
-DIREE_HAL_DRIVER_DEFAULTS=OFF \
-DIREE_HAL_DRIVER_LOCAL_SYNC=ON \
-DIREE_HAL_DRIVER_LOCAL_TASK=ON \
-DIREE_BUILD_TESTS=OFF \
-DIREE_BUILD_SAMPLES=OFF
cmake --build "${BUILD_RISCV_DIR}"
Executing models with different configs
A. Standard Compilation
${INSTALL_HOST_DIR}/bin/iree-compile \
--iree-hal-target-backends=llvm-cpu \
--iree-llvmcpu-target-triple=riscv64 \
--iree-llvmcpu-target-cpu-features="+m,+a,+f,+d" \
${IREE_SRC}/samples/models/simple_abs.mlir \
-o ${WORKSPACE_DIR}/chipyard-workload/overlay/simple_abs.vmfb
B. Trace Ready compilation
Required if using Tracy (Host Option B or RISC-V Option B).
${INSTALL_HOST_DIR}/bin/iree-compile \
--iree-hal-target-backends=llvm-cpu \
--iree-llvmcpu-target-triple=riscv64 \
--iree-hal-executable-debug-level=3 \
--iree-llvmcpu-link-embedded=false \
--iree-llvmcpu-debug-symbols=true \
--iree-llvmcpu-target-cpu-features="+m,+a,+f,+d" \
${IREE_SRC}/samples/RoboIR/onnx_models/static_trace.mlir \
-o ${WORKSPACE_DIR}/chipyard-workload/overlay/static_trace.vmfb
C. Using Sanitizers
Required if using Sanitizers (Host Option C). Adds instrumentation to the JIT/compiled model code itself.
${INSTALL_HOST_DIR}/bin/iree-compile \
--iree-hal-target-backends=llvm-cpu \
--iree-llvmcpu-target-triple=x86_64 \
--iree-llvmcpu-sanitize=address \
--iree-llvmcpu-link-embedded=false \
${IREE_SRC}/samples/models/simple_abs.mlir \
-o simple_abs_asan.vmfb
Executing those models with their respective build
A. Standard
${INSTALL_HOST_DIR}/bin/iree-run-module \
--device=local-task \
--module=simple_abs.vmfb \
--function=abs \
--input="f32=-10"
B. Profiled Run (Tracy)
TRACY_NO_EXIT=1 sudo ${INSTALL_HOST_DIR}/bin/iree-run-module \
--device=local-task \
--module=static_trace.vmfb \
--function=main \
--input="1xf32=10"
C. Sanitizer Run (ASan)
ASAN_OPTIONS=detect_leaks=0 \
ASAN_SYMBOLIZER_PATH=$(which llvm-symbolizer) \
${INSTALL_HOST_DIR}/bin/iree-run-module \
--device=local-task \
--module=simple_abs_asan.vmfb \
--function=abs \
--input="f32=-10"
Using Tracy Offline / No SSH connection
Use if you built RISC-V Option B. This runs the capture tool on the device and saves the file locally.
1. Copy tools for overlay or target
cp ${BUILD_RISCV_DIR}/tools/iree-run-module ${WORKSPACE_DIR}/chipyard-workload/overlay/
cp ${BUILD_RISCV_DIR}/tracy-capture ${WORKSPACE_DIR}/chipyard-workload/overlay/
2. Run Script
#!/bin/bash
echo "--- Starting IREE Offline Capture ---"
# 1. Start IREE in background.
# TRACY_NO_EXIT=1 makes it wait for a connection before running.
TRACY_NO_EXIT=1 /iree-run-module \
--device=local-task \
--module=/static_trace.vmfb \
--function=main \
--input="1xf32=10" &
# 2. Start Tracy Capture (Client connects to localhost:8086)
# It will record until iree-run-module finishes.
# -f overwrites existing file. -o specifies output.
/tracy-capture -o /trace.tracy -f -a 127.0.0.1
echo "--- Capture Finished ---"
poweroff
3. Extract Trace
Add /trace.tracy to the outputs list in your iree-workload.json so FireMarshal copies it back to the host.
/scratch2/agustin/merlin/build-iree-host-deb-tracy/tools/iree-compile --iree-hal-target-backends=llvm-cpu --iree-llvmcpu-target-triple=riscv6 --iree-hal-executable-debug-level=3 --iree-llvmcpu-link-embedded=false --iree-llvmcpu-debug-symbols=true --iree-llvmcpu-target-abi=lp64d --iree-llvmcpu-target-triple=riscv64-unknown-linux-gnu --iree-llvmcpu-target-cpu-features="+m,+a,+f,+d,+c,+v,+zvl256b,+zba,+zbb,+zbc,+zbs,+zicbom,+zicboz,+zicbop,+zihintpause" --iree-llvmcpu-enable-ukernels="all" --iree-vm-bytecode-module-strip-source-map=false --iree-opt-level=O3 model_quantized_ort.mlir -o model_quantized_ort.vmfb