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; }