| # IREE "Static Library" sample |
| |
| This sample shows how to: |
| 1. Produce a static library and bytecode module with IREE's compiler |
| 2. Compile the static library into a program using the `static_library_loader` |
| 3. Run the demo with the module using functions exported by the static library |
| |
| The model compiled into the static library exports a single function |
| `simple_mul` that returns the multiplication of two tensors: |
| |
| ```mlir |
| func.func @simple_mul(%arg0: tensor<4xf32>, %arg1: tensor<4xf32>) -> tensor<4xf32> { |
| %0 = "arith.mulf"(%arg0, %arg1) : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32> |
| return %0 : tensor<4xf32> |
| } |
| ``` |
| |
| ## Background |
| |
| IREE's `static_library_loader` allows applications to inject a set of static |
| libraries that can be resolved at runtime by name. This can be particularly |
| useful on "bare metal" or embedded systems running IREE that lack operating |
| systems or the ability to load shared libraries in binaries. |
| |
| When static library output is enabled, `iree-compile` produces a separate |
| static library to compile into the target program. At runtime bytecode module |
| instructs the VM which static libraries to load exported functions from the |
| model. |
| |
| ## Instructions |
| _Note: run the following commands from IREE's github repo root._ |
| |
| 1. Configure CMake for building the static library then demo. You'll need to set |
| the flags building samples, the compiler, the `llvm-cpu` |
| compiler target backend, and the `local-sync` runtime HAL driver (see |
| [the getting started guide](https://iree.dev/building-from-source/getting-started/) |
| for general instructions on building using CMake): |
| |
| ```shell |
| cmake -B ../iree-build/ -G Ninja \ |
| -DCMAKE_BUILD_TYPE=RelWithDebInfo . |
| -DIREE_BUILD_SAMPLES=ON \ |
| -DIREE_TARGET_BACKEND_DEFAULTS=OFF \ |
| -DIREE_TARGET_BACKEND_LLVM_CPU=ON \ |
| -DIREE_HAL_DRIVER_DEFAULTS=OFF \ |
| -DIREE_HAL_DRIVER_LOCAL_SYNC=ON \ |
| -DIREE_HAL_EXECUTABLE_LOADER_DEFAULTS=OFF \ |
| -DIREE_HAL_EXECUTABLE_PLUGIN_DEFAULTS=OFF \ |
| -DIREE_BUILD_COMPILER=ON \ |
| ``` |
| |
| 2. Build the `static_library_demo` CMake target to create the static demo. This |
| target has several dependencies that will compile `simple_mul.mlir` into a |
| static library (`simple_mul.h` & `simple_mul.c`) as well as a bytecode module |
| (`simple_mul.vmfb`) which are finally built into the demo binary: |
| |
| ```shell |
| cmake --build ../iree-build/ --target iree_samples_static_library_static_library_demo |
| ``` |
| |
| 3. Run the sample binary: |
| |
| ```shell |
| ../iree-build/samples/static_library/static_library_demo |
| |
| # Output: static_library_run_bytecode passed |
| ``` |
| |
| ### Changing compilation options |
| |
| The steps above build both the compiler for the host (machine doing the |
| compiling) and the demo for the target using same options as the host machine. |
| If you wish to target a different platform other than the host, you'll need to |
| compile the library and demo with different options. |
| |
| For example, see |
| [this documentation](https://iree.dev/building-from-source/android/) |
| on cross compiling on Android. |
| |
| Note: separating the target from the host will require modifying dependencies in |
| the demos `CMakeLists.txt`. See included comments for more info. |