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
Dieser Commit ist enthalten in:
Rahul Manocha
2024-11-01 22:04:07 +00:00
committet von Rahul Manocha
Ursprung e2eeb20c00
Commit a2d8199402
3 geänderte Dateien mit 32 neuen und 4 gelöschten Zeilen
+19 -4
Datei anzeigen
@@ -965,6 +965,19 @@ DynCO::~DynCO() {
hipError_t err = ihipFree(elem.second->getManagedVarPtr()); hipError_t err = ihipFree(elem.second->getManagedVarPtr());
assert(err == hipSuccess); 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; delete elem.second;
} }
vars_.clear(); vars_.clear();
@@ -1179,10 +1192,12 @@ hipError_t StatCO::removeFatBinary(FatBinaryInfo** module) {
hipError_t err; hipError_t err;
for (auto dev : g_devices) { for (auto dev : g_devices) {
DeviceVar* dvar = nullptr; DeviceVar* dvar = nullptr;
IHIP_RETURN_ONFAIL((*it)->getStatDeviceVar(&dvar, dev->deviceId())); IHIP_RETURN_ONFAIL((*it)->getDeviceVarPtr(&dvar, dev->deviceId()));
// free also deletes the device ptr if (dvar != nullptr) {
err = ihipFree(dvar->device_ptr()); // free also deletes the device ptr
assert(err == hipSuccess); err = ihipFree(dvar->device_ptr());
assert(err == hipSuccess);
}
} }
err = ihipFree(*(static_cast<void**>((*it)->getManagedVarPtr()))); err = ihipFree(*(static_cast<void**>((*it)->getManagedVarPtr())));
assert(err == hipSuccess); assert(err == hipSuccess);
+10
Datei anzeigen
@@ -229,6 +229,16 @@ Var::~Var() {
modules_ = nullptr; 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) { hipError_t Var::getDeviceVar(DeviceVar** dvar, int deviceId, hipModule_t hmod) {
guarantee((deviceId >= 0), "Invalid DeviceId, less than zero"); guarantee((deviceId >= 0), "Invalid DeviceId, less than zero");
guarantee((static_cast<size_t>(deviceId) < g_devices.size()), guarantee((static_cast<size_t>(deviceId) < g_devices.size()),
+3
Datei anzeigen
@@ -121,6 +121,9 @@ public:
//Return DeviceVar for module Generate/build if not already done so. //Return DeviceVar for module Generate/build if not already done so.
hipError_t getStatDeviceVar(DeviceVar** dvar, int deviceId); hipError_t getStatDeviceVar(DeviceVar** dvar, int deviceId);
hipError_t getDeviceVarPtr(DeviceVar** dvar, int deviceId);
void resize_dVar(size_t size) { dVar_.resize(size); } void resize_dVar(size_t size) { dVar_.resize(size); }
FatBinaryInfo** moduleInfo() { return modules_; }; FatBinaryInfo** moduleInfo() { return modules_; };