| //===- mlir-vulkan-runner.cpp - MLIR Vulkan Execution Driver --------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This is a command line utility that executes an MLIR file on the Vulkan by |
| // translating MLIR GPU module to SPIR-V and host part to LLVM IR before |
| // JIT-compiling and executing the latter. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Conversion/GPUToSPIRV/ConvertGPUToSPIRVPass.h" |
| #include "mlir/Conversion/GPUToVulkan/ConvertGPUToVulkanPass.h" |
| #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" |
| #include "mlir/Conversion/StandardToSPIRV/ConvertStandardToSPIRVPass.h" |
| #include "mlir/Dialect/GPU/Passes.h" |
| #include "mlir/Dialect/SPIRV/Passes.h" |
| #include "mlir/Dialect/SPIRV/SPIRVOps.h" |
| #include "mlir/ExecutionEngine/JitRunner.h" |
| #include "mlir/ExecutionEngine/OptUtils.h" |
| #include "mlir/InitAllDialects.h" |
| #include "mlir/Pass/Pass.h" |
| #include "mlir/Pass/PassManager.h" |
| #include "llvm/Support/InitLLVM.h" |
| #include "llvm/Support/TargetSelect.h" |
| |
| using namespace mlir; |
| |
| static LogicalResult runMLIRPasses(ModuleOp module) { |
| PassManager passManager(module.getContext()); |
| applyPassManagerCLOptions(passManager); |
| |
| passManager.addPass(createGpuKernelOutliningPass()); |
| passManager.addPass(createLegalizeStdOpsForSPIRVLoweringPass()); |
| passManager.addPass(createConvertGPUToSPIRVPass()); |
| OpPassManager &modulePM = passManager.nest<spirv::ModuleOp>(); |
| modulePM.addPass(spirv::createLowerABIAttributesPass()); |
| modulePM.addPass(spirv::createUpdateVersionCapabilityExtensionPass()); |
| passManager.addPass(createConvertGpuLaunchFuncToVulkanLaunchFuncPass()); |
| LowerToLLVMOptions llvmOptions = { |
| /*useBarePtrCallConv =*/false, |
| /*emitCWrappers = */ true, |
| /*indexBitwidth =*/kDeriveIndexBitwidthFromDataLayout}; |
| passManager.addPass(createLowerToLLVMPass(llvmOptions)); |
| passManager.addPass(createConvertVulkanLaunchFuncToVulkanCallsPass()); |
| return passManager.run(module); |
| } |
| |
| int main(int argc, char **argv) { |
| llvm::llvm_shutdown_obj x; |
| registerPassManagerCLOptions(); |
| |
| mlir::registerAllDialects(); |
| llvm::InitLLVM y(argc, argv); |
| llvm::InitializeNativeTarget(); |
| llvm::InitializeNativeTargetAsmPrinter(); |
| mlir::initializeLLVMPasses(); |
| |
| return mlir::JitRunnerMain(argc, argv, &runMLIRPasses); |
| } |