From 8cac880779b8dbe97972fde84d48518ea99f7852 Mon Sep 17 00:00:00 2001 From: Jason Tang Date: Thu, 20 May 2021 10:58:07 -0400 Subject: [PATCH] SWDEV-277566 - HSAIL: put back the original setKernels logic for now In HSAIL path, kernel akc info is obtained after code object loading, and kernel signature creation requires the akc info when one of the kernel argument is a reference object. Change-Id: I9cdb1dbf2c72f4620b0b6e46a88402a2473c3e97 --- rocclr/device/pal/palkernel.cpp | 49 +++++++++++---------------- rocclr/device/pal/palkernel.hpp | 3 -- rocclr/device/pal/palprogram.cpp | 57 +++++++++++++++++--------------- 3 files changed, 49 insertions(+), 60 deletions(-) diff --git a/rocclr/device/pal/palkernel.cpp b/rocclr/device/pal/palkernel.cpp index f6486dff08..bf7090a48d 100644 --- a/rocclr/device/pal/palkernel.cpp +++ b/rocclr/device/pal/palkernel.cpp @@ -85,14 +85,29 @@ bool HSAILKernel::setKernelCode(amd::hsa::loader::Symbol* sym, amd_kernel_code_t return true; } -bool HSAILKernel::aqlCreateHWInfo() { +HSAILKernel::HSAILKernel(std::string name, HSAILProgram* prog, bool internalKernel) + : device::Kernel(prog->device(), name, *prog), + index_(0), + code_(0), + codeSize_(0) { + flags_.hsa_ = true; + flags_.internalKernel_ = internalKernel; +} + +HSAILKernel::~HSAILKernel() {} + +bool HSAILKernel::postLoad() { + return true; +} + +bool HSAILKernel::init() { #if defined(WITH_COMPILER_LIB) hsa_agent_t agent = {amd::Device::toHandle(&(device()))}; - std::string openclKernelName = device::Kernel::openclMangledName(name()); - amd::hsa::loader::Symbol* sym = prog().getSymbol(openclKernelName.c_str(), &agent); + std::string openClKernelName = openclMangledName(name()); + amd::hsa::loader::Symbol* sym = prog().getSymbol(openClKernelName.c_str(), &agent); if (!sym) { LogPrintfError("Error: Getting kernel ISA code symbol %s from AMD HSA Code Object failed.\n", - openclKernelName.c_str()); + openClKernelName.c_str()); return false; } @@ -115,34 +130,8 @@ bool HSAILKernel::aqlCreateHWInfo() { workgroupGroupSegmentByteSize_ = workGroupInfo_.usedLDSSize_; kernargSegmentByteSize_ = akc->kernarg_segment_byte_size; -#endif // defined(WITH_COMPILER_LIB) - return true; -} -HSAILKernel::HSAILKernel(std::string name, HSAILProgram* prog, bool internalKernel) - : device::Kernel(prog->device(), name, *prog), - index_(0), - code_(0), - codeSize_(0) { - flags_.hsa_ = true; - flags_.internalKernel_ = internalKernel; -} - -HSAILKernel::~HSAILKernel() {} - -bool HSAILKernel::postLoad() { -#if defined(WITH_COMPILER_LIB) - if (!aqlCreateHWInfo()) { - return false; - } -#endif // defined(WITH_COMPILER_LIB) - return true; -} - -bool HSAILKernel::init() { -#if defined(WITH_COMPILER_LIB) acl_error error = ACL_SUCCESS; - std::string openClKernelName = openclMangledName(name()); // Pull out metadata from the ELF size_t sizeOfArgList; diff --git a/rocclr/device/pal/palkernel.hpp b/rocclr/device/pal/palkernel.hpp index 9fc585fd57..3c262f638f 100644 --- a/rocclr/device/pal/palkernel.hpp +++ b/rocclr/device/pal/palkernel.hpp @@ -123,9 +123,6 @@ class HSAILKernel : public device::Kernel { HSAILKernel& operator=(const HSAILKernel&); protected: - //! Creates AQL kernel HW info - bool aqlCreateHWInfo(); - //! Get the kernel code and copy the code object from the program CPU segment bool setKernelCode(amd::hsa::loader::Symbol* sym, amd_kernel_code_t* akc); diff --git a/rocclr/device/pal/palprogram.cpp b/rocclr/device/pal/palprogram.cpp index d69cefcd5f..a97b3530f6 100644 --- a/rocclr/device/pal/palprogram.cpp +++ b/rocclr/device/pal/palprogram.cpp @@ -246,6 +246,34 @@ inline static std::vector splitSpaceSeparatedString(char* str) { bool HSAILProgram::createKernels(void* binary, size_t binSize, bool useUniformWorkGroupSize, bool internalKernel) { #if defined(WITH_COMPILER_LIB) + // Stop compilation if it is an offline device - PAL runtime does not + // support ISA compiled offline + if (!device().isOnline()) { + return true; + } + + // ACL_TYPE_CG stage is not performed for offline compilation + executable_ = loader_->CreateExecutable(HSA_PROFILE_FULL, nullptr); + if (executable_ == nullptr) { + buildLog_ += "Error: Executable for AMD HSA Code Object isn't created.\n"; + return false; + } + size_t size = binSize; + hsa_code_object_t code_object; + code_object.handle = reinterpret_cast(binary); + + hsa_agent_t agent = {amd::Device::toHandle(&(device()))}; + hsa_status_t status = executable_->LoadCodeObject(agent, code_object, nullptr); + if (status != HSA_STATUS_SUCCESS) { + buildLog_ += "Error: AMD HSA Code Object loading failed.\n"; + return false; + } + status = executable_->Freeze(nullptr); + if (status != HSA_STATUS_SUCCESS) { + buildLog_ += "Error: AMD HSA Code Object freeze failed.\n"; + return false; + } + size_t kernelNamesSize = 0; acl_error errorCode = amd::Hsail::QueryInfo(palNullDevice().compiler(), binaryElf_, RT_KERNEL_NAMES, nullptr, nullptr, &kernelNamesSize); @@ -278,6 +306,8 @@ bool HSAILProgram::createKernels(void* binary, size_t binSize, bool useUniformWo aKernel->setUniformWorkGroupSize(useUniformWorkGroupSize); } } + + DestroySegmentCpuAccess(); #endif // defined(WITH_COMPILER_LIB) return true; } @@ -285,35 +315,10 @@ bool HSAILProgram::createKernels(void* binary, size_t binSize, bool useUniformWo bool HSAILProgram::setKernels(void* binary, size_t binSize, amd::Os::FileDesc fdesc, size_t foffset, std::string uri) { #if defined(WITH_COMPILER_LIB) - // Stop compilation if it is an offline device - PAL runtime does not - // support ISA compiled offline if (!device().isOnline()) { return true; } - // ACL_TYPE_CG stage is not performed for offline compilation - - executable_ = loader_->CreateExecutable(HSA_PROFILE_FULL, nullptr); - if (executable_ == nullptr) { - buildLog_ += "Error: Executable for AMD HSA Code Object isn't created.\n"; - return false; - } - size_t size = binSize; - hsa_code_object_t code_object; - code_object.handle = reinterpret_cast(binary); - - hsa_agent_t agent = {amd::Device::toHandle(&(device()))}; - hsa_status_t status = executable_->LoadCodeObject(agent, code_object, nullptr); - if (status != HSA_STATUS_SUCCESS) { - buildLog_ += "Error: AMD HSA Code Object loading failed.\n"; - return false; - } - status = executable_->Freeze(nullptr); - if (status != HSA_STATUS_SUCCESS) { - buildLog_ += "Error: AMD HSA Code Object freeze failed.\n"; - return false; - } - bool dynamicParallelism = false; for (auto& kit : kernels()) { HSAILKernel* aKernel = static_cast(kit.second); @@ -332,8 +337,6 @@ bool HSAILProgram::setKernels(void* binary, size_t binSize, if (!isNull() && dynamicParallelism && !allocKernelTable()) { return false; } - - DestroySegmentCpuAccess(); #endif // defined(WITH_COMPILER_LIB) return true; }