From ab4f7de476e989c9c8a93fa6da8f5cd6c39421cb Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 23 Jul 2019 20:09:59 -0400
Subject: [PATCH] P4 to Git Change 1972494 by kjayapra@0_HIPWS_P2P1_ROCM on
2019/07/23 20:01:13
SWDEV-144570 - Handling variable register during hipModuleLoad.
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/hip/hip_internal.hpp#31 edit
... //depot/stg/opencl/drivers/opencl/api/hip/hip_module.cpp#30 edit
... //depot/stg/opencl/drivers/opencl/api/hip/hip_platform.cpp#34 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.cpp#51 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/devprogram.hpp#30 edit
[ROCm/hip commit: c837c6e7692bc4a6a63561295bf679327bae7ec8]
---
projects/hip/api/hip/hip_internal.hpp | 4 ++-
projects/hip/api/hip/hip_module.cpp | 39 +++++++++++++++++++++++++++
projects/hip/api/hip/hip_platform.cpp | 18 ++++++++++---
3 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/projects/hip/api/hip/hip_internal.hpp b/projects/hip/api/hip/hip_internal.hpp
index 2787e2b187..eae35ecae9 100644
--- a/projects/hip/api/hip/hip_internal.hpp
+++ b/projects/hip/api/hip/hip_internal.hpp
@@ -125,7 +125,7 @@ public:
};
private:
std::unordered_map functions_;
- std::unordered_map vars_;
+ std::unordered_map vars_;
static PlatformState* platform_;
@@ -136,6 +136,8 @@ public:
return *platform_;
}
+ void unregisterVar(hipModule_t hmod);
+
void registerVar(const void* hostvar, const DeviceVar& var);
void registerFunction(const void* hostFunction, const DeviceFunction& func);
diff --git a/projects/hip/api/hip/hip_module.cpp b/projects/hip/api/hip/hip_module.cpp
index eb6aec8e08..f9c5a85137 100644
--- a/projects/hip/api/hip/hip_module.cpp
+++ b/projects/hip/api/hip/hip_module.cpp
@@ -70,6 +70,10 @@ hipError_t hipModuleLoad(hipModule_t *module, const char *fname)
HIP_RETURN(ihipModuleLoadData(module, tmp.data()));
}
+bool ihipModuleUnregisterGlobal(hipModule_t hmod) {
+ PlatformState::instance().unregisterVar(hmod);
+ return true;
+}
hipError_t hipModuleUnload(hipModule_t hmod)
{
@@ -81,6 +85,10 @@ hipError_t hipModuleUnload(hipModule_t hmod)
amd::Program* program = as_amd(reinterpret_cast(hmod));
+ if(!ihipModuleUnregisterGlobal(hmod)) {
+ HIP_RETURN(hipErrorUnknown);
+ }
+
program->release();
HIP_RETURN(hipSuccess);
@@ -97,6 +105,33 @@ extern bool __hipExtractCodeObjectFromFatBinary(const void* data,
const std::vector& devices,
std::vector>& code_objs);
+bool ihipModuleRegisterGlobal(amd::Program* program, hipModule_t* module) {
+
+ size_t var_size = 0;
+ hipDeviceptr_t device_ptr = nullptr;
+ std::vector var_names;
+
+ device::Program* dev_program
+ = program->getDeviceProgram(*hip::getCurrentContext()->devices()[0]);
+
+ if (!dev_program->getGlobalSymbolsFromCodeObj(&var_names)) {
+ return false;
+ }
+
+ 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);
+ }
+
+ PlatformState::DeviceVar dvar{it->c_str(), modules,
+ std::vector{ g_devices.size()}};
+ PlatformState::instance().registerVar(it->c_str(), dvar);
+ }
+
+ return true;
+}
+
hipError_t ihipModuleLoadData(hipModule_t *module, const void *image)
{
std::vector> code_objs;
@@ -115,6 +150,10 @@ hipError_t ihipModuleLoadData(hipModule_t *module, const void *image)
*module = reinterpret_cast(as_cl(program));
+ if (!ihipModuleRegisterGlobal(program, module)) {
+ return hipErrorUnknown;
+ }
+
return hipSuccess;
}
diff --git a/projects/hip/api/hip/hip_platform.cpp b/projects/hip/api/hip/hip_platform.cpp
index c358f8c4b3..d284570322 100644
--- a/projects/hip/api/hip/hip_platform.cpp
+++ b/projects/hip/api/hip/hip_platform.cpp
@@ -165,10 +165,23 @@ extern "C" std::vector< std::pair >* __hipRegisterFatBinary(c
return programs;
}
+void PlatformState::unregisterVar(hipModule_t hmod) {
+ auto it = vars_.begin();
+ while (it != vars_.end()) {
+ DeviceVar& dvar = it->second;
+ if ((*dvar.modules)[0].first == hmod) {
+ delete dvar.modules;
+ vars_.erase(it++);
+ } else {
+ ++it;
+ }
+ }
+}
+
void PlatformState::registerVar(const void* hostvar,
const DeviceVar& rvar) {
amd::ScopedLock lock(lock_);
- vars_.insert(std::make_pair(hostvar, rvar));
+ vars_.insert(std::make_pair(std::string(reinterpret_cast(hostvar)), rvar));
}
void PlatformState::registerFunction(const void* hostFunction,
@@ -253,11 +266,10 @@ bool PlatformState::getFuncAttr(const void* hostFunction,
return true;
}
-
bool PlatformState::getGlobalVar(const void* hostVar, int deviceId,
hipDeviceptr_t* dev_ptr, size_t* size_ptr) {
amd::ScopedLock lock(lock_);
- const auto it = vars_.find(hostVar);
+ const auto it = vars_.find(std::string(reinterpret_cast(hostVar)));
if (it != vars_.cend()) {
DeviceVar& dvar = it->second;
if (dvar.rvars[deviceId].getdeviceptr() == nullptr) {