diff --git a/hipamd/src/hip_code_object.cpp b/hipamd/src/hip_code_object.cpp index 8ad95b7aa5..69d4258e79 100644 --- a/hipamd/src/hip_code_object.cpp +++ b/hipamd/src/hip_code_object.cpp @@ -965,6 +965,19 @@ DynCO::~DynCO() { hipError_t err = ihipFree(elem.second->getManagedVarPtr()); assert(err == hipSuccess); } + + if (elem.second->getVarKind() == Var::DVK_Variable) { + for (auto dev : g_devices) { + DeviceVar* dvar = nullptr; + hipError_t err = elem.second->getDeviceVarPtr(&dvar, dev->deviceId()); + assert(err == hipSuccess); + if (dvar != nullptr) { + // free also deletes the device ptr + err = ihipFree(dvar->device_ptr()); + assert(err == hipSuccess); + } + } + } delete elem.second; } vars_.clear(); @@ -1179,10 +1192,12 @@ hipError_t StatCO::removeFatBinary(FatBinaryInfo** module) { hipError_t err; for (auto dev : g_devices) { DeviceVar* dvar = nullptr; - IHIP_RETURN_ONFAIL((*it)->getStatDeviceVar(&dvar, dev->deviceId())); - // free also deletes the device ptr - err = ihipFree(dvar->device_ptr()); - assert(err == hipSuccess); + IHIP_RETURN_ONFAIL((*it)->getDeviceVarPtr(&dvar, dev->deviceId())); + if (dvar != nullptr) { + // free also deletes the device ptr + err = ihipFree(dvar->device_ptr()); + assert(err == hipSuccess); + } } err = ihipFree(*(static_cast((*it)->getManagedVarPtr()))); assert(err == hipSuccess); diff --git a/hipamd/src/hip_global.cpp b/hipamd/src/hip_global.cpp index c63831b498..124b91090b 100644 --- a/hipamd/src/hip_global.cpp +++ b/hipamd/src/hip_global.cpp @@ -229,6 +229,16 @@ Var::~Var() { modules_ = nullptr; } +hipError_t Var::getDeviceVarPtr(DeviceVar** dvar, int deviceId) { + guarantee((deviceId >= 0), "Invalid DeviceId, less than zero"); + guarantee((static_cast(deviceId) < g_devices.size()), + "Invalid DeviceId, greater than no of code objects"); + guarantee((dVar_.size() == g_devices.size()), + "Device Var not initialized to size"); + *dvar = dVar_[deviceId]; + return hipSuccess; +} + hipError_t Var::getDeviceVar(DeviceVar** dvar, int deviceId, hipModule_t hmod) { guarantee((deviceId >= 0), "Invalid DeviceId, less than zero"); guarantee((static_cast(deviceId) < g_devices.size()), diff --git a/hipamd/src/hip_global.hpp b/hipamd/src/hip_global.hpp index 5d28da21be..22ba881809 100644 --- a/hipamd/src/hip_global.hpp +++ b/hipamd/src/hip_global.hpp @@ -121,6 +121,9 @@ public: //Return DeviceVar for module Generate/build if not already done so. hipError_t getStatDeviceVar(DeviceVar** dvar, int deviceId); + + hipError_t getDeviceVarPtr(DeviceVar** dvar, int deviceId); + void resize_dVar(size_t size) { dVar_.resize(size); } FatBinaryInfo** moduleInfo() { return modules_; };