From fa60a0083ff06df63a8985eb20ac00aaf49ac643 Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 27 Sep 2019 18:00:49 -0400 Subject: [PATCH] P4 to Git Change 2005774 by kjayapra@3_HIPWS_P2P_ROCM2 on 2019/09/27 17:54:03 SWDEV-144570 - Adding extern var support for dynamically loaded modules for Texture reference. Affected files ... ... //depot/stg/opencl/drivers/opencl/api/hip/hip_internal.hpp#43 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_module.cpp#42 edit ... //depot/stg/opencl/drivers/opencl/api/hip/hip_platform.cpp#43 edit --- hipamd/api/hip/hip_internal.hpp | 3 ++ hipamd/api/hip/hip_module.cpp | 50 ++++++++++++++++++++++++++------- hipamd/api/hip/hip_platform.cpp | 23 ++++++++++++++- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/hipamd/api/hip/hip_internal.hpp b/hipamd/api/hip/hip_internal.hpp index fcd40c0ace..4d34bcbaf5 100644 --- a/hipamd/api/hip/hip_internal.hpp +++ b/hipamd/api/hip/hip_internal.hpp @@ -149,6 +149,7 @@ public: size_t size; std::vector< std::pair< hipModule_t, bool > >* modules; std::vector rvars; + bool dyn_undef; }; private: std::unordered_map functions_; @@ -172,6 +173,8 @@ public: bool getFuncAttr(const void* hostFunction, hipFuncAttributes* func_attr); bool getGlobalVar(const void* hostVar, int deviceId, hipDeviceptr_t* dev_ptr, size_t* size_ptr); + bool getTexRef(const char* hostVar, textureReference** texRef); + bool getShadowVarInfo(std::string var_name, void** var_addr, size_t* var_size); void setupArgument(const void *arg, size_t size, size_t offset); void configureCall(dim3 gridDim, dim3 blockDim, size_t sharedMem, hipStream_t stream); diff --git a/hipamd/api/hip/hip_module.cpp b/hipamd/api/hip/hip_module.cpp index 0cd590886c..5f0fe540a9 100644 --- a/hipamd/api/hip/hip_module.cpp +++ b/hipamd/api/hip/hip_module.cpp @@ -109,6 +109,34 @@ extern bool __hipExtractCodeObjectFromFatBinary(const void* data, const std::vector& devices, std::vector>& code_objs); +bool ihipModuleRegisterUndefined(amd::Program* program, hipModule_t* module) { + + std::vector undef_vars; + device::Program* dev_program + = program->getDeviceProgram(*hip::getCurrentContext()->devices()[0]); + + if (!dev_program->getUndefinedVarFromCodeObj(&undef_vars)) { + return false; + } + + for (auto it = undef_vars.begin(); it != undef_vars.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); + } + + texture* tex_hptr + = new texture(); + memset(tex_hptr, 0x00, sizeof(texture)); + + PlatformState::DeviceVar dvar{ reinterpret_cast(tex_hptr), it->c_str(), sizeof(*tex_hptr), modules, + std::vector{ g_devices.size()}, true }; + PlatformState::instance().registerVar(it->c_str(), dvar); + } + + return true; +} + bool ihipModuleRegisterGlobal(amd::Program* program, hipModule_t* module) { size_t var_size = 0; @@ -125,11 +153,11 @@ 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()}; for (size_t dev = 0; dev < g_devices.size(); ++dev) { - modules->at(dev) = std::make_pair(*module, false); + modules->at(dev) = std::make_pair(*module, true); } PlatformState::DeviceVar dvar{nullptr, it->c_str(), 0, modules, - std::vector{ g_devices.size()} }; + std::vector{ g_devices.size()}, false }; PlatformState::instance().registerVar(it->c_str(), dvar); } @@ -149,8 +177,7 @@ hipError_t ihipModuleLoadData(hipModule_t *module, const void *image) program->setVarInfoCallBack(&getSvarInfo); - if (CL_SUCCESS != program->addDeviceProgram(*hip::getCurrentContext()->devices()[0], image, ElfSize(image)) || - CL_SUCCESS != program->build(hip::getCurrentContext()->devices(), nullptr, nullptr, nullptr)) { + if (CL_SUCCESS != program->addDeviceProgram(*hip::getCurrentContext()->devices()[0], image, ElfSize(image))) { return hipErrorUnknown; } @@ -160,6 +187,14 @@ hipError_t ihipModuleLoadData(hipModule_t *module, const void *image) return hipErrorUnknown; } + if (!ihipModuleRegisterUndefined(program, module)) { + return hipErrorUnknown; + } + + if(CL_SUCCESS != program->build(hip::getCurrentContext()->devices(), nullptr, nullptr, nullptr)) { + return hipErrorUnknown; + } + return hipSuccess; } @@ -446,21 +481,16 @@ hipError_t hipExtLaunchMultiKernelMultiDevice(hipLaunchParams* launchParamsList, hipError_t hipModuleGetTexRef(textureReference** texRef, hipModule_t hmod, const char* name) { HIP_INIT_API(texRef, hmod, name); - hipDeviceptr_t dptr = nullptr; - size_t bytes = 0; - /* input args check */ if ((texRef == nullptr) || (name == nullptr)) { HIP_RETURN(hipErrorInvalidValue); } /* Get address and size for the global symbol */ - if (!PlatformState::instance().getGlobalVar(name, ihipGetDevice(), &dptr, - &bytes)) { + if (!PlatformState::instance().getTexRef(name, texRef)) { HIP_RETURN(hipErrorUnknown); } - *texRef = reinterpret_cast(dptr); HIP_RETURN(hipSuccess); } diff --git a/hipamd/api/hip/hip_platform.cpp b/hipamd/api/hip/hip_platform.cpp index 6826f20b08..940bed4d5d 100644 --- a/hipamd/api/hip/hip_platform.cpp +++ b/hipamd/api/hip/hip_platform.cpp @@ -173,6 +173,11 @@ std::vector< std::pair >* PlatformState::unregisterVar(hipMod DeviceVar& dvar = it->second; if ((*dvar.modules)[0].first == hmod) { rmodules = dvar.modules; + if (dvar.dyn_undef) { + texture* tex_hptr + = reinterpret_cast *>(dvar.shadowVptr); + delete tex_hptr; + } vars_.erase(it++); } else { ++it; @@ -287,6 +292,22 @@ bool PlatformState::getFuncAttr(const void* hostFunction, return true; } +bool PlatformState::getTexRef(const char* hostVar, textureReference** texRef) { + amd::ScopedLock lock(lock_); + const auto it = vars_.find(std::string(reinterpret_cast(hostVar))); + if (it == vars_.cend()) { + return false; + } + + DeviceVar& dvar = it->second; + if (!dvar.dyn_undef) { + return false; + } + + *texRef = reinterpret_cast(dvar.shadowVptr); + return true; +} + bool PlatformState::getGlobalVar(const void* hostVar, int deviceId, hipDeviceptr_t* dev_ptr, size_t* size_ptr) { amd::ScopedLock lock(lock_); @@ -380,7 +401,7 @@ extern "C" void __hipRegisterVar( HIP_INIT(); PlatformState::DeviceVar dvar{var, std::string{ hostVar }, static_cast(size), modules, - std::vector{ g_devices.size() } }; + std::vector{ g_devices.size() }, false }; PlatformState::instance().registerVar(hostVar, dvar); }