SWDEV-494409 - Fix destructor path for Static and Dynamic CO

1) For Dynamic CO variables, free the device pointer in
   DynCO destructor instead of DeviceVar destructor.
2) For Static CO Remove Fatbinary,
   only call hipFree for valid device Vars instead of all devices.

Change-Id: I84291f5371b2c05d1d0bcdb4f9c6bd122e7c9b21


[ROCm/clr commit: a2d8199402]
This commit is contained in:
Rahul Manocha authored and Rahul Manocha committed 2024-11-19 13:04:44 -05:00
1 parent ca8ca0bc35
commit ee20409853
3 files changed
+32 -4

No files matched your search

+19 -4
View File
@@ -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<void**>((*it)->getManagedVarPtr())));
assert(err == hipSuccess);
+10
View File
@@ -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<size_t>(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<size_t>(deviceId) < g_devices.size()),
+3
View File
@@ -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_; };