Contents

IREE目前支持将MHLO或XLA、Torch Tensor和TOSA作为输入,经过一系列passes编译生成IREE定义的VM bytecode中间产物,其中硬件相关代码会编译成相应的Executable,保存在VM bytecode中供host进行调用,比如CUDA相关的计算代码会被lower成PTX代码,在IREE的runtime中再被CUDA的运行时以JIT的方式编译成可执行的cubin kernel。

IREE编译的入口是IREEVMTransformPassPipeline,IREEVMTransformPassPipeline又被分成InputConversionPassPipeline、CommonInputConversionPassPipeline、ABI::TransformPassPipeline、Flow::FlowTransformPassPipeline、Stream::StreamTransformPassPipeline(仅CUDA后端)、HAL::HALTransformPassPipeline、VM::VMTransformPassPipeline等几个阶段。

  • InputConversionPassPipeline

    IREE编译流程解析(一)

    主要作用是将不同的输入(MHLO或XLA、Torch Tensor和TOSA)统一lower成linalg dialect和builtin的arith dialect、scf dialect和tensor dialect。

  • CommonInputConversionPassPipeline

    IREE编译流程解析(二)

    主要作用是将IREE::Input dialect lower成IREE::Util、IREE::Flow和IREE::HAL dialect。

  • ABI::TransformPassPipeline

    IREE编译流程解析(三)

    主要作用是将外部导入的接口和本module导出到外部的接口参数统一成标准标量类型或hal.buffer_view类型(hal.buffer_view对应tensor)。

  • Flow::FlowTransformPassPipeline

    IREE编译流程解析(四)

    主要作用是执行一系列窥孔优化,比如1x1的conv2d转换成matmul、tiling、op fusion等,最终将workload拆分成flow.executable

  • Stream::StreamTransformPassPipeline

    IREE编译流程解析(五)

    主要作用是将program转换到stream dialect,优化变量编码方式,划分调度子图,生成异步调度策略,并实现内存规划策略。

  • HAL::HALTransformPassPipeline

    IREE编译流程解析(六)

    主要作用是进行tiling、vectorization和bufferization等操作,分配计算负载,最终生成target device的代码。比如cuda target的dispatch source code会被递降为NVVM IR。

  • VM::VMTransformPassPipeline

Contents