Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/iml130/mlir-emitc
Conversions to MLIR EmitC
https://github.com/iml130/mlir-emitc
code-generation mlir
Last synced: about 1 month ago
JSON representation
Conversions to MLIR EmitC
- Host: GitHub
- URL: https://github.com/iml130/mlir-emitc
- Owner: iml130
- License: apache-2.0
- Created: 2020-05-28T13:02:23.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2024-08-22T07:05:59.000Z (4 months ago)
- Last Synced: 2024-08-22T08:25:48.594Z (4 months ago)
- Topics: code-generation, mlir
- Language: C++
- Homepage:
- Size: 1.5 MB
- Stars: 118
- Watchers: 5
- Forks: 24
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# MLIR-EmitC
![Build and test](https://github.com/iml130/mlir-emitc/workflows/Build%20and%20test/badge.svg)
MLIR-EmitC provides a way to translate ML models into C++ code. The repository
contains scripts and tools to translate Keras and TensorFlow models into the
[TOSA](https://mlir.llvm.org/docs/Dialects/TOSA/) and
[StableHLO](https://github.com/openxla/stablehlo/) dialect and to convert those to
[EmitC](https://mlir.llvm.org/docs/Dialects/EmitC/).
The latter is used to generate calls to a reference implementation.**The [EmitC](https://mlir.llvm.org/docs/Dialects/EmitC/) dialect itself, as well as the C++ emitter, are part of MLIR core and are no longer provided via this repository.**
The initial EmitC dialect and C++ emitter checked into this repository were forked from https://reviews.llvm.org/D76571.
**DISCLAIMER:** This is a research project and not intended for everyday use. The code is made available without any support. However, we welcome any kind of feedback via the issue tracker.
## Getting Started
### Clone```shell
git clone https://github.com/iml130/mlir-emitc.git
cd mlir-emitc
git submodule update --init
```### Build and Run
There are two variants to build EmitC: As part of an LLVM/MLIR build (via the LLVM external projects mechanism) and against a pre-built LLVM/MLIR.
#### Building with pre-built LLVM/MLIR
The setup assumes that you have built LLVM and MLIR in `$BUILD_DIR` and installed them to `$PREFIX`. You can use the [`build_tools/build_mlir.sh`](https://github.com/iml130/mlir-emitc/blob/main/build_tools/build_mlir.sh) shell script to configure, build and install LLVM and MLIR.
**Note**: The hash of the latest tested LLVM version is given in [`build_tools/llvm_version.txt`](https://github.com/iml130/mlir-emitc/blob/main/build_tools/llvm_version.txt). Since MLIR evolves fast, it is possible that EmitC fails to build with a newer LLVM.
To build and launch the tests, run
```shell
mkdir build && cd build
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. -DMLIR_DIR=$PREFIX/lib/cmake/mlir -DLLVM_EXTERNAL_LIT=$BUILD_DIR/bin/llvm-lit
cmake --build . --target check-emitc
```**Note**: If you don't use `build_tools/build_mlir.sh`, make sure to pass `-DLLVM_INSTALL_UTILS=ON` when building LLVM with CMake in order to install `FileCheck` to the chosen installation prefix.
To additionally build and execute the unittests, run
```shell
cmake --build . --target MLIREmitCTests
./reference-implementation/unittests/MLIREmitCTests
```#### Bulding as part of an LLVM/MLIR build
MLIR-EmitC can also be built as part of an LLVM/MLIR build, using the `LLVM_EXTERNAL_PROJECTS` mechanism (see https://llvm.org/docs/CMake.html).
To build and launch the tests, run
```shell
mkdir build && cd build
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DEMITC_ENABLE_HLO=OFF -DLLVM_ENABLE_PROJECTS=mlir -DLLVM_EXTERNAL_PROJECTS="mlir-emitc" -DLLVM_EXTERNAL_MLIR_EMITC_SOURCE_DIR=`realpath ../` -DLLVM_TARGETS_TO_BUILD=host ${ROOT_PATH_TO_llvm-project}/llvm
cmake --build . --target check-emitc
```## Supported Conversions and Translations
Conversions are supported for [StableHLO](https://github.com/openxla/stablehlo/) ops and some ops of the arith and Tensor dialect.
In addition, support for converting Tensor Operator Set Architecture [(TOSA)](https://mlir.llvm.org/docs/Dialects/TOSA/) dialect to EmitC is emerging.
The `emitc-opt` tool supports the following options:| option | |
| :----------------------------------------- |:------------------------------------------------------------------------ |
| `--convert-func-to-emitc` | Convert Func dialect to EmitC dialect |
| `--convert-scf-to-emitc` | Convert SCF dialect to EmitC dialect, maintaining structured control flow|
| `--convert-stablehlo-region-ops-to-emitc ` | Convert StableHLO operations containing regions to EmitC dialect. |
| `--convert-stablehlo-to-emitc ` | Convert from StableHLO dialect to EmitC dialect. |
| `--convert-arith-to-emitc-ext ` | Convert arith dialect to EmitC dialect (extended). |
| `--convert-tensor-to-emitc ` | Convert tensor dialect to EmitC dialect. |
| `--convert-tosa-to-emitc ` | Convert TOSA dialect to EmitC dialect. |
| `--insert-emitc-stablehlo-include` | Insert an EmitC include for the StableHLO dialect. |
| `--insert-emitc-arith-include` | Insert an EmitC include for the arith dialect. |
| `--insert-emitc-tensor-include` | Insert an EmitC include for the tensor dialect. |
| `--insert-emitc-tosa-include` | Insert an EmitC include for the TOSA dialect. |
| `--stablehlo-to-emitc-pipeline` | Run the StableHLO to EmitC pipeline. |
| `--arith-to-emitc-pipeline` | Run the Arithmetic to EmitC pipeline. |
| `--tensor-to-emitc-pipeline` | Run the Tensor to EmitC pipeline. |
| `--tosa-to-emitc-pipeline` | Run the TOSA to EmitC pipeline. |The currently supported StableHLO ops are listed in the [docs/stablehlo-op-coverage.md](docs/stablehlo-op-coverage.md) document.
Supported TOSA ops are listed in the [docs/tosa-op-coverage.md](docs/tosa-op-coverage.md) document.After converting to EmitC dialect, C++ code can be emitted using `emitc-translate --mlir-to-cpp`.
Furthermore, `emitc-translate` has specific support to emit code with variables declared at top using `--mlir-to-cpp --declare-variables-at-top`.