blob: 066e7c89c7915b92503406f7fa5734c1b304ffc2 [file] [log] [blame] [view]
# Generate and Inspect IREE Executables
In this doc, we explain the process of generating the IREE executables and
inspecting the excutables with various tools.
## Generate IREE executables
IREE's main codegen tools are
[iree-opt](https://github.com/google/iree/blob/main/iree/tools/iree-opt-main.cc)
(generate MLIR representations) and
[iree-translate](https://github.com/google/iree/blob/main/iree/tools/iree-translate-main.cc)
(generate the IREE bytecode modules). IREE codegen flow is based on LLVM and
MLIR, so it utilizes the typical LLVM flags to define the machine targets. For
example, to generate the IREE bytecode module from a vector multiply MLIR:
```bash
${OUT}/host/iree_compiler/install/bin/iree-translate \
-iree-input-type=mhlo \
-iree-mlir-to-vm-bytecode-module \
-iree-hal-target-backends=dylib-llvm-aot \
-iree-llvm-target-triple=riscv32-pc-linux-elf \
-iree-llvm-target-cpu=generic-rv32 \
-iree-llvm-target-cpu-features="+m,+f" \
-iree-llvm-target-abi=ilp32 \
-iree-llvm-embedded-linker-path=${OUT}/host/iree_compiler/install/bin/lld \
${ROOTDIR}/toolchain/iree/iree/samples/simple_embedding/simple_embedding_test.mlir \
-o /tmp/simple_mul-llvm_aot.vmfb
```
With the options of:
* iree-hal-target-backends: The HAL device (library + dispatcher) target for
the workload. In Shodan, the supported targets are:
* dylib-llvm-aot: the dynamic library for LLVM ahead-of-time (AOT) compilation.
* vmvx
* iree-llvm-target-triple: The flag is populated to LLVM target triple.
* iree-llvm-target-cpu: The flag populated to LLVM target cpu. It can be
pre-defined cpu targets or the generic ones
([link](https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Support/RISCVTargetParser.def)).
* iree-llvm-target-cpu-features: The flag is populated to LLVM target features for
extra CPU extensions. For RISC-V, it can include the typical ISA extensions,
such as multiplication/division, atomic, floating point, and compression ISA
support.
__For the vector extension, it can be enabled with "+experimental-v"__.
* iree-llvm-target-abi: The flag is polulated to LLVM target abi.
* iree-llvm-embedded-linker-path: Linker for the device executable. It is
recommanded to use the lld from the IREE compiler release.
Some extra options:
* iree-llvm-keep-linker-artifacts: Aside from the generated bytecode flatbuffer
(with [schema](https://github.com/google/iree/blob/main/iree/schemas/bytecode_module_def.fbs)),
the intermediate linker is generated at `/tmp/<module_name>_linked_<hal_target>-xxxxxx.so`.
(the exact path is printed in the stdout).
* iree-vm-emit-polyglot-zip: Instead of the previous flag, by enabling this flag
you can extract the .so from the .vmfb file with 7z
```bash
7z e -aoa -bb0 <vmfb> -y
```
* riscv-v-vector-bits-min and riscv-v-fixed-length-vector-lmul-max: If the
vector extension is enabled in `iree-llvm-target-cpu-features`, the RVV VLS
(vector length specific) code will be generated with the vector length specified
by these two options.
* iree-llvm-debug-symbols: Add the debug information in the executable. Setting
this to `false` at the production executable can reduce the workload size.
## Inspect IREE executables
To render the bytecode flatbuffer in a text file, the `iree-dump-module` tool
can print out the content based on the descriptors in the schema, including the
weights in the ML model.
```bash
${OUT}/host/iree-compiler/install/bin/iree-dump-module <vmfb file>
```
With the linker artifact enabled, The `.so` file contends the dispatch functions
of the workload, and the user can use the objdump in the RISC-V toolchain to
retrieve the assembler content. For example, to render the executable (.text)
segment
```bash
${CACHE}/toolchain_iree_rv32imf/bin/riscv32-unknown-elf-objdump -d <linker artifact>
```
Note:
* If you use llvm-objdump to retrieve the assembler content, the RVV ISAs could
be rendered as unknown.
## Inspect IREE IR lowering
Use `iree-opt` to check the IR output
```bash
${OUT}/host/iree-compiler/install/bin/iree-opt \
-print-ir-after-all \
-iree-transformation-pipeline \
-iree-hal-target-backends=dylib-llvm-aot \
-iree-llvm-target-triple=riscv32-pc-linux-elf \
-iree-llvm-target-cpu=generic-rv32 \
-iree-llvm-target-cpu-features="+m,+f" \
-iree-llvm-target-abi=ilp32 \
<MLIR input>
```