llvm-project/mlir
Alex Zinenko 8b790434e5 Example Linalg3: support Load/Store conversion from Linalg to LLVM IR dialect
Load and Store Linalg operations are converter to their LLVM IR counterparts
    preceded by a sequence of operations that recover the effective address of the
    accessed element.  The address is computed given the subscripts and the view
    descriptor as

        base_pointer + base_offset + SUM_i subscript_i * stride_i.

    Manual testing shows that the resulting LLVM IR for the matrix multiplication
    example can be compiled and executed, producing correct results.

--

PiperOrigin-RevId: 241889003
2019-04-05 07:40:21 -07:00
..
bindings/python Python bindings: drop MLIREmitter and related functionality 2019-04-03 08:30:24 -07:00
examples Example Linalg3: support Load/Store conversion from Linalg to LLVM IR dialect 2019-04-05 07:40:21 -07:00
g3doc Chapter 3 for Toy tutorial: introduction of a dialect 2019-04-03 19:22:32 -07:00
include Chapter 3 for Toy tutorial: introduction of a dialect 2019-04-03 19:22:32 -07:00
lib Add CMakeLists.txt for Quantization and FxpMathOps dialects (and misc fixes to build with OSS setup). 2019-04-03 19:22:05 -07:00
test Fix Toy Ch3 testing with CMake 2019-04-03 19:22:42 -07:00
tools Add CMakeLists.txt for Quantization and FxpMathOps dialects (and misc fixes to build with OSS setup). 2019-04-03 19:22:05 -07:00
unittests Initial release of the Quantization dialect 2019-04-03 19:20:12 -07:00
utils Update header notices. 2019-03-29 17:43:20 -07:00
.clang-format [mlir] add .clang-format 2019-03-29 12:41:43 -07:00
CMakeLists.txt Initial version for chapter 1 of the Toy tutorial 2019-04-02 13:40:06 -07:00
CONTRIBUTING.md Add contributing file. 2019-03-29 17:27:11 -07:00
LICENSE.TXT Continue sketching out basic infrastructure, including an input and output 2019-03-29 12:23:51 -07:00
README.md [README] Fix links, minor edits. 2019-04-03 19:22:23 -07:00

README.md

Multi-Level Intermediate Representation Overview

The MLIR project aims to define a common intermediate representation (IR) that will unify the infrastructure required to execute high performance machine learning models in TensorFlow and similar ML frameworks. This project will include the application of HPC techniques, along with integration of search algorithms like reinforcement learning. This project aims to reduce the cost to bring up new hardware, and improve usability for existing TensorFlow users.

Note that this repository contains the core of the MLIR framework. The TensorFlow compilers we are building on top of MLIR will be part of the main TensorFlow repository soon.

More resources

For more information on MLIR, please see:

Join the MLIR mailing list to hear about announcements and discussions. Please be mindful of the TensorFlow Code of Conduct, which pledges to foster an open and welcoming environment.

What is MLIR for?

MLIR is intended to be a hybrid IR which can support multiple different requirements in a unified infrastructure. For example, this includes:

  • The ability to represent all TensorFlow graphs, including dynamic shapes, the user-extensible op ecosystem, TensorFlow variables, etc.
  • Optimizations and transformations typically done on a TensorFlow graph, e.g. in Grappler.
  • Quantization and other graph transformations done on a TensorFlow graph or the TF Lite representation.
  • Representation of kernels for ML operations in a form suitable for optimization.
  • Ability to host high-performance-computing-style loop optimizations across kernels (fusion, loop interchange, tiling, etc) and to transform memory layouts of data.
  • Code generation "lowering" transformations such as DMA insertion, explicit cache management, memory tiling, and vectorization for 1D and 2D register architectures.
  • Ability to represent target-specific operations, e.g. the MXU on TPUs.

MLIR is a common IR that also supports hardware specific operations. Thus, any investment into the infrastructure surrounding MLIR (e.g. the compiler passes that work on it) should yield good returns; many targets can use that infrastructure and will benefit from it.

MLIR is a powerful representation, but it also has non-goals. We do not try to support low level machine code generation algorithms (like register allocation and instruction scheduling). They are a better fit for lower level optimizers (such as LLVM). Also, we do not intend MLIR to be a source language that end-users would themselves write kernels in (analogous to CUDA C++). While we would love to see a kernel language happen someday, that will be an independent project that compiles down to MLIR.

Compiler infrastructure

We benefitted from experience gained from building other IRs (HLO, LLVM and SIL) when building MLIR. We will directly adopt existing best practices, e.g. writing and maintaining an IR spec, building an IR verifier, providing the ability to dump and parse MLIR files to text, writing extensive unit tests with the FileCheck tool, and building the infrastructure as a set of modular libraries that can be combined in new ways. We plan to use the infrastructure developed by the XLA team for performance analysis and benchmarking.

Other lessons have been incorporated and integrated into the design in subtle ways. For example, LLVM has non-obvious design mistakes that prevent a multithreaded compiler from working on multiple functions in an LLVM module at the same time. MLIR solves these problems by having per-function constant pools and by making references explicit with function_ref.

Getting started with MLIR

MLIR has been tested on Linux and macOS, with recent versions of clang and with gcc 7.

git clone https://github.com/llvm/llvm-project.git
cd llvm-project/llvm/projects/
git clone https://github.com/tensorflow/mlir
cd ../..
mkdir build
cd build
cmake -G Ninja ../llvm -DLLVM_BUILD_EXAMPLES=ON
ninja check-mlir

As a starter, you may try the tutorial on building a compiler for a Toy language.

MLIR talks