From 06167b8112ae450891de2c4ecef2f412f966fcfa Mon Sep 17 00:00:00 2001 From: foreman Date: Wed, 20 Nov 2019 07:24:20 -0500 Subject: [PATCH] P4 to Git Change 2033779 by kjayapra@0_HIPWS_LNX1_ROCM on 2019/11/20 07:17:56 SWDEV-144570 - Update function global during hipModuleLoad. Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/hip_internal.hpp#47 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_module.cpp#48 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_platform.cpp#50 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.cpp#69 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.hpp#35 edit --- hipamd/api/hip/hip_internal.hpp | 5 +++-- hipamd/api/hip/hip_module.cpp | 30 ++++++++++++++++++++++++++++-- hipamd/api/hip/hip_platform.cpp | 10 +++++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/hipamd/api/hip/hip_internal.hpp b/hipamd/api/hip/hip_internal.hpp index cfe5cca7d1..57847e4cbe 100644 --- a/hipamd/api/hip/hip_internal.hpp +++ b/hipamd/api/hip/hip_internal.hpp @@ -154,12 +154,13 @@ public: bool dyn_undef; }; private: - std::unordered_map functions_; + std::unordered_map functions_; std::unordered_multimap vars_; static PlatformState* platform_; - PlatformState() : lock_("Guards global function map") {} + // the lock_ is recursive + PlatformState() : lock_("Guards global function map", true) {} ~PlatformState() {} public: static PlatformState& instance() { diff --git a/hipamd/api/hip/hip_module.cpp b/hipamd/api/hip/hip_module.cpp index 5fa4c1f457..e7a34c896b 100644 --- a/hipamd/api/hip/hip_module.cpp +++ b/hipamd/api/hip/hip_module.cpp @@ -114,6 +114,28 @@ extern bool __hipExtractCodeObjectFromFatBinary(const void* data, const std::vector& devices, std::vector>& code_objs); +bool ihipModuleRegisterFunc(amd::Program* program, hipModule_t* module) { + std::vector func_names; + device::Program* dev_program + = program->getDeviceProgram(*hip::getCurrentContext()->devices()[0]); + + if (!dev_program->getFuncsFromCodeObj(&func_names)) { + return false; + } + + for (auto it = func_names.begin(); it != func_names.end(); ++it) { + auto modules = new std::vector>(g_devices.size()); + for (size_t dev = 0; dev < g_devices.size(); ++dev) { + modules->at(dev) = std::make_pair(*module, true); + } + + PlatformState::DeviceFunction dfunc{std::string{it->c_str()}, modules, + std::vector(g_devices.size())}; + PlatformState::instance().registerFunction(it->c_str(), dfunc); + } + + return true; +} bool ihipModuleRegisterUndefined(amd::Program* program, hipModule_t* module) { std::vector undef_vars; @@ -125,7 +147,7 @@ bool ihipModuleRegisterUndefined(amd::Program* program, hipModule_t* module) { } for (auto it = undef_vars.begin(); it != undef_vars.end(); ++it) { - auto modules = new std::vector >{g_devices.size()}; + auto modules = new std::vector >(g_devices.size()); for (size_t dev = 0; dev < g_devices.size(); ++dev) { modules->at(dev) = std::make_pair(*module, true); } @@ -156,7 +178,7 @@ bool ihipModuleRegisterGlobal(amd::Program* program, hipModule_t* module) { } for (auto it = var_names.begin(); it != var_names.end(); ++it) { - auto modules = new std::vector >{g_devices.size()}; + auto modules = new std::vector >(g_devices.size()); for (size_t dev = 0; dev < g_devices.size(); ++dev) { modules->at(dev) = std::make_pair(*module, true); } @@ -196,6 +218,10 @@ hipError_t ihipModuleLoadData(hipModule_t *module, const void *image) return hipErrorSharedObjectSymbolNotFound; } + if (!ihipModuleRegisterFunc(program, module)) { + return hipErrorSharedObjectSymbolNotFound; + } + if(CL_SUCCESS != program->build(hip::getCurrentContext()->devices(), nullptr, nullptr, nullptr)) { return hipErrorSharedObjectInitFailed; } diff --git a/hipamd/api/hip/hip_platform.cpp b/hipamd/api/hip/hip_platform.cpp index 1915576aa4..e4b4ed8a49 100644 --- a/hipamd/api/hip/hip_platform.cpp +++ b/hipamd/api/hip/hip_platform.cpp @@ -150,7 +150,7 @@ extern "C" std::vector< std::pair >* __hipRegisterFatBinary(c return nullptr; } - auto programs = new std::vector< std::pair >{g_devices.size()}; + auto programs = new std::vector< std::pair >(g_devices.size()); for (size_t dev = 0; dev < g_devices.size(); ++dev) { amd::Context* ctx = g_devices[dev]; amd::Program* program = new amd::Program(*ctx); @@ -231,7 +231,7 @@ void PlatformState::registerVar(const void* hostvar, void PlatformState::registerFunction(const void* hostFunction, const DeviceFunction& func) { amd::ScopedLock lock(lock_); - functions_.insert(std::make_pair(hostFunction, func)); + functions_.insert(std::make_pair(std::string(reinterpret_cast(hostFunction)), func)); } bool ihipGetFuncAttributes(const char* func_name, amd::Program* program, hipFuncAttributes* func_attr) { @@ -272,7 +272,7 @@ bool CL_CALLBACK getSvarInfo(cl_program program, std::string var_name, void** va hipFunction_t PlatformState::getFunc(const void* hostFunction, int deviceId) { amd::ScopedLock lock(lock_); - const auto it = functions_.find(hostFunction); + const auto it = functions_.find(std::string(reinterpret_cast(hostFunction))); if (it != functions_.cend()) { PlatformState::DeviceFunction& devFunc = it->second; if (devFunc.functions[deviceId] == 0) { @@ -302,12 +302,12 @@ hipFunction_t PlatformState::getFunc(const void* hostFunction, int deviceId) { bool PlatformState::getFuncAttr(const void* hostFunction, hipFuncAttributes* func_attr) { - + amd::ScopedLock lock(lock_); if (func_attr == nullptr) { return false; } - const auto it = functions_.find(hostFunction); + const auto it = functions_.find(std::string(reinterpret_cast(hostFunction))); if (it == functions_.cend()) { return false; }