IREE编译流程解析
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