sw/vec_iree: Populate output_length in IREE exec

This CL enables populating the output_length variable in the output
header.

First we create a new output_header struct, placing it at the top of the
model_output section. The return code and epc are already populated
using crt0.

When I first added the MlOutput struct I thought we would have an
arbitrary pointer, but now the output lives right after the header.
Remove that struct and have the process_output call populate a length
instead.

Change-Id: I0b0005dcdc56ea53f124993cac81646fb8cd4561
5 files changed
tree: a817100ec6cb8e471d7ed9628409a5f35e88e4f7
  1. audio_prep/
  2. build_tools/
  3. cmake/
  4. device/
  5. model_util/
  6. native_log/
  7. risp4ml/
  8. samples/
  9. ssd_postprocess/
  10. CMakeLists.txt
  11. README.md
  12. springbok_config.h
README.md

Springbok Model Execution Repository

This project contains ML model codegen and execution libraries/examples. The artifacts built from this project is targeted for RISC-V 32-bit baremetal machine (Springbok).

Prerequisite

If you get this project from Project Shodan manifest, you are all set. If not, you need to have following projects as well to build the project successfully.

This project needs to be at <dir>/sw/vec_iree

Code structure

  • audio_prep: Audio preprocessing libarary
  • build_tools: Utility scripts for the project
  • cmake: CMake Macros for the project
  • device: Device HAL driver library
  • model_util: Runtime utility library for model execution
  • native_log: BSP support for the Linux userspace emulation
  • risp4ml: Vision preprocessing library (Reduced ISP for ML)
  • samples: Codegen and execution of ML models based on IREE
    • simple_vec_mul: Point-wise vector multiplication examples
  • ssd_postprocess: Vision postprocessing library for Single-Shot Detectors (SSD)

Build the project

If you are running from Project Shodan repo, you can build the artifacts with m iree. If you download this project alone, you need to download/build IREE's host compiler, then at the top level directory

  cmake -B <output dir> -G Ninja \
     -DCMAKE_TOOLCHAIN_FILE="$(realpath sw/vec_iree/cmake/riscv_iree.cmake)" \
     -DCMAKE_BUILD_TYPE=MinSizeRel \
     -DIREE_HOST_BINARY_ROOT="$(IREE_COMPILER_DIR)/install" \
     -DRISCV_TOOLCHAIN_ROOT=$(TOOLCHAINRV32_PATH) \
     <dir>/sw/vec_iree
  cmake --build <output dir> --target all

Run the executables

You can run QEMU or RENODE emulation with the built executables. In Shodan repo, qemu_sim_springbok for QEMU emulation, and sim_springbok for Renode simulation. Out-of-repo emulation is possible but require more steps.

Test the executables

In Shodan, this project utilizes LLVM lit and FileCheck to test the ML executable performance. The tests are defined in the *_test.run files under <output dir>. To run the test, at the Shodan top level directory

lit --path <Filecheck dir> -a <output dir>

Filecheck in Debian testing is under /usr/lib/llvm-11/bin

Add -D RUNNER=qemu to enable the qemu tests.