13fef2d26SRiver Riddle //===- TestConvertGPUKernelToCubin.cpp - Test gpu kernel cubin lowering ---===// 23fef2d26SRiver Riddle // 33fef2d26SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43fef2d26SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 53fef2d26SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63fef2d26SRiver Riddle // 73fef2d26SRiver Riddle //===----------------------------------------------------------------------===// 83fef2d26SRiver Riddle 9*d7ef488bSMogball #include "mlir/Dialect/GPU/Transforms/Passes.h" 103fef2d26SRiver Riddle #include "mlir/Pass/Pass.h" 113fef2d26SRiver Riddle #include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h" 123fef2d26SRiver Riddle #include "mlir/Target/LLVMIR/Export.h" 133fef2d26SRiver Riddle #include "llvm/Support/TargetSelect.h" 143fef2d26SRiver Riddle 153fef2d26SRiver Riddle using namespace mlir; 163fef2d26SRiver Riddle 173fef2d26SRiver Riddle #if MLIR_CUDA_CONVERSIONS_ENABLED 183fef2d26SRiver Riddle namespace { 193fef2d26SRiver Riddle class TestSerializeToCubinPass 203fef2d26SRiver Riddle : public PassWrapper<TestSerializeToCubinPass, gpu::SerializeToBlobPass> { 213fef2d26SRiver Riddle public: MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestSerializeToCubinPass)225e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestSerializeToCubinPass) 235e50dd04SRiver Riddle 24b5e22e6dSMehdi Amini StringRef getArgument() const final { return "test-gpu-to-cubin"; } getDescription() const25b5e22e6dSMehdi Amini StringRef getDescription() const final { 26b5e22e6dSMehdi Amini return "Lower GPU kernel function to CUBIN binary annotations"; 27b5e22e6dSMehdi Amini } 283fef2d26SRiver Riddle TestSerializeToCubinPass(); 293fef2d26SRiver Riddle 303fef2d26SRiver Riddle private: 313fef2d26SRiver Riddle void getDependentDialects(DialectRegistry ®istry) const override; 323fef2d26SRiver Riddle 333fef2d26SRiver Riddle // Serializes PTX to CUBIN. 343fef2d26SRiver Riddle std::unique_ptr<std::vector<char>> 353fef2d26SRiver Riddle serializeISA(const std::string &isa) override; 363fef2d26SRiver Riddle }; 373fef2d26SRiver Riddle } // namespace 383fef2d26SRiver Riddle TestSerializeToCubinPass()393fef2d26SRiver RiddleTestSerializeToCubinPass::TestSerializeToCubinPass() { 403fef2d26SRiver Riddle this->triple = "nvptx64-nvidia-cuda"; 413fef2d26SRiver Riddle this->chip = "sm_35"; 423fef2d26SRiver Riddle this->features = "+ptx60"; 433fef2d26SRiver Riddle } 443fef2d26SRiver Riddle getDependentDialects(DialectRegistry & registry) const453fef2d26SRiver Riddlevoid TestSerializeToCubinPass::getDependentDialects( 463fef2d26SRiver Riddle DialectRegistry ®istry) const { 473fef2d26SRiver Riddle registerNVVMDialectTranslation(registry); 483fef2d26SRiver Riddle gpu::SerializeToBlobPass::getDependentDialects(registry); 493fef2d26SRiver Riddle } 503fef2d26SRiver Riddle 513fef2d26SRiver Riddle std::unique_ptr<std::vector<char>> serializeISA(const std::string &)523fef2d26SRiver RiddleTestSerializeToCubinPass::serializeISA(const std::string &) { 533fef2d26SRiver Riddle std::string data = "CUBIN"; 543fef2d26SRiver Riddle return std::make_unique<std::vector<char>>(data.begin(), data.end()); 553fef2d26SRiver Riddle } 563fef2d26SRiver Riddle 573fef2d26SRiver Riddle namespace mlir { 583fef2d26SRiver Riddle namespace test { 593fef2d26SRiver Riddle // Register test pass to serialize GPU module to a CUBIN binary annotation. registerTestGpuSerializeToCubinPass()603fef2d26SRiver Riddlevoid registerTestGpuSerializeToCubinPass() { 61b5e22e6dSMehdi Amini PassRegistration<TestSerializeToCubinPass>([] { 623fef2d26SRiver Riddle // Initialize LLVM NVPTX backend. 633fef2d26SRiver Riddle LLVMInitializeNVPTXTarget(); 643fef2d26SRiver Riddle LLVMInitializeNVPTXTargetInfo(); 653fef2d26SRiver Riddle LLVMInitializeNVPTXTargetMC(); 663fef2d26SRiver Riddle LLVMInitializeNVPTXAsmPrinter(); 673fef2d26SRiver Riddle 683fef2d26SRiver Riddle return std::make_unique<TestSerializeToCubinPass>(); 693fef2d26SRiver Riddle }); 703fef2d26SRiver Riddle } 713fef2d26SRiver Riddle } // namespace test 723fef2d26SRiver Riddle } // namespace mlir 733fef2d26SRiver Riddle #endif // MLIR_CUDA_CONVERSIONS_ENABLED 74