[Lldb-commits] [compiler-rt] [lld] [libcxx] [clang-tools-extra] [clang] [llvm] [libc] [lldb] [mlir] [flang] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
@@ -61,6 +63,7 @@ registerAllGPUToLLVMIRTranslations(DialectRegistry ®istry) { registerLLVMDialectTranslation(registry); registerNVVMDialectTranslation(registry); registerROCDLDialectTranslation(registry); + registerSPIRVDialectTranslation(registry); fabianmcg wrote: @silee2 can you add a test [here](https://github.com/llvm/llvm-project/blob/main/mlir/test/Target/LLVMIR/gpu.mlir#L46-L49) using the GPU SPIR-V target attribute? https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [flang] [libcxx] [lldb] [clang] [compiler-rt] [lld] [mlir] [libc] [clang-tools-extra] [openmp] [llvm] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
https://github.com/fabianmcg approved this pull request. LGTM! I'll squash and merge as soon it passes all pre check tests. https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [clang] [libc] [compiler-rt] [libcxx] [lld] [mlir] [clang-tools-extra] [llvm] [flang] [openmp] [lldb] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
https://github.com/fabianmcg closed https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [libcxx] [mlir] [clang-tools-extra] [lld] [libc] [openmp] [flang] [compiler-rt] [llvm] [clang] [lldb] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
@@ -0,0 +1,31 @@ +//===- SPIRVToLLVMIRTranslation.cpp - Translate SPIRV to LLVM IR --===// +// +// 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 file implements a translation between the MLIR SPIRV dialect and +// LLVM IR. +// +//===--===// + +#include "mlir/Target/LLVMIR/Dialect/SPIRV/SPIRVToLLVMIRTranslation.h" +#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" +#include "mlir/IR/BuiltinAttributes.h" +#include "mlir/IR/Operation.h" +#include "mlir/Target/LLVMIR/ModuleTranslation.h" + +using namespace mlir; +using namespace mlir::LLVM; + +void mlir::registerSPIRVDialectTranslation(DialectRegistry ®istry) { + registry.insert(); fabianmcg wrote: I'm sorry I missed these. I had the same concern, the alternative was adding an inline registration call. However, I then realized that adding `#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h"` to `mlir/Target/LLVMIR/Dialect/All.h` was needed , which seemed even more undesirable thus I changed my mind and agreed on the current scheme. One way to clean it, is removing inline function from `mlir/Target/LLVMIR/Dialect/All.h` and creating a `MLIRToLLVMIR` library. https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [MLIR] Enabling Intel GPU Integration. (PR #65539)
@@ -0,0 +1,70 @@ +//===- SerializeToSPIRV.cpp - Convert GPU kernel to SPIRV blob -===// +// +// 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 +// +//===--===// +/// +/// \file +/// This pass iterates all the SPIR-V modules in the top module and serializes +/// each SPIR-V module to SPIR-V binary and then attachs the binary blob as a +/// string attribute to the corresponding gpu module. +/// +//===--===// + +#include "mlir/Dialect/GPU/Transforms/Passes.h" + +#include "mlir/Dialect/GPU/IR/GPUDialect.h" +#include "mlir/Dialect/GPU/Transforms/Passes.h" +#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" +#include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" +#include "mlir/Target/SPIRV/Serialization.h" + +namespace mlir { +#define GEN_PASS_DEF_GPUSERIALIZETOSPIRVPASS +#include "mlir/Dialect/GPU/Transforms/Passes.h.inc" +} // namespace mlir + +using namespace mlir; + +struct GpuSerializeToSPIRVPass : public mlir::impl::GpuSerializeToSPIRVPassBase { +public: + void runOnOperation() override { +auto mod = getOperation(); +llvm::SmallVector spvBinary; +for (mlir::gpu::GPUModuleOp gpuMod : mod.getOps()) { + auto name = gpuMod.getName(); + // check that the spv module has the same name with gpu module except the + // prefix "__spv__" + auto isSameMod = [&](spirv::ModuleOp spvMod) -> bool { +auto spvModName = spvMod.getName(); +return spvModName->consume_front("__spv__") && spvModName == name; + }; + auto spvMods = mod.getOps(); + auto it = llvm::find_if(spvMods, isSameMod); + if (it == spvMods.end()) { +gpuMod.emitError() << "Unable to find corresponding SPIR-V module"; +signalPassFailure(); +return; + } + auto spvMod = *it; + + spvBinary.clear(); + // serialize the spv module to spv binary + if (mlir::failed(spirv::serialize(spvMod, spvBinary))) { +spvMod.emitError() << "Failed to serialize SPIR-V module"; +signalPassFailure(); +return; + } + + // attach the spv binary to the gpu module + auto spvData = + llvm::StringRef(reinterpret_cast(spvBinary.data()), + spvBinary.size() * sizeof(uint32_t)); + auto spvAttr = mlir::StringAttr::get(&getContext(), spvData); + gpuMod->setAttr(gpu::getDefaultGpuBinaryAnnotation(), spvAttr); + spvMod->erase(); +} + } +}; fabianmcg wrote: @silee2 here are the steps: 1. Implement a target attribute, see for example: [NVVMTargetAttr](https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td#L1679-L1741). The idea of this attribute is to hold properties intrinsic to the target, like triple, chip, flags, etc. 2. Add a pass to attach the target to a module, see: [GpuNVVMAttachTarget](https://github.com/llvm/llvm-project/blob/main/mlir/include/mlir/Dialect/GPU/Transforms/Passes.td#L85-L128) and [Dialect/GPU/Transforms/NVVMAttachTarget.cpp](https://github.com/llvm/llvm-project/blob/main/mlir/lib/Dialect/GPU/Transforms/NVVMAttachTarget.cpp). The idea of this pass is to attach the SPIRV target to GPU modules, so it must know how to create them. 3. We're currently implementing `TargetAttrs` as external models to keep libraries separated, see [NVVM/Target.cpp](https://github.com/llvm/llvm-project/blob/main/mlir/lib/Target/LLVM/NVVM/Target.cpp#L44-L50), so `GpuSerializeToSPIRVPass::run` would be there. 4. Modify `getModuleLoadFn` & `createKernelLaunch` appropriately in [SelectObjectAttr.cpp#L125-L15](https://github.com/llvm/llvm-project/blob/main/mlir/lib/Target/LLVMIR/Dialect/GPU/SelectObjectAttr.cpp#L125-L152) instead of adding the changes in `GPUToLLVMCommon`. 5. Then the compilation workflow should look something similar to this: [GPU: Compilation Overview](https://mlir.llvm.org/docs/Dialects/GPU/#compilation-overview) I'll take care of adding a pointer to the top module symbol table so it can be used be the `SPIRVTarget`. If you have any questions just ping me in discord or discourse `@fabianmc`. https://github.com/llvm/llvm-project/pull/65539 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lld] [mlir] [llvm] [clang-tools-extra] [flang] [compiler-rt] [libc] [libcxx] [lldb] [clang] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
@@ -61,6 +63,7 @@ registerAllGPUToLLVMIRTranslations(DialectRegistry ®istry) { registerLLVMDialectTranslation(registry); registerNVVMDialectTranslation(registry); registerROCDLDialectTranslation(registry); + registerSPIRVDialectTranslation(registry); fabianmcg wrote: The call to `registry.insert();` is needed so that `mlir-translate` can parse the code containing the SPIR-V target attribute, nothing more; there's no translation happening from SPIR-V to LLVM. If the call is not added, then `mlir-translate` throws an error because `SPIR-V` never gets registered. The question is, should an empty translation to LLVM should be added to mirror all other * to LLVM translation code structure, or is inlining the call ok? I definitely prefer the second option -one less target. https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [libc] [clang-tools-extra] [mlir] [lldb] [libcxx] [llvm] [compiler-rt] [flang] [clang] [lld] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
https://github.com/fabianmcg edited https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [flang] [mlir] [clang-tools-extra] [lld] [compiler-rt] [lldb] [llvm] [libc] [libcxx] [clang] [MLIR] Enable GPU Dialect to SYCL runtime integration (PR #71430)
https://github.com/fabianmcg edited https://github.com/llvm/llvm-project/pull/71430 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits