rocr: Release agent resources before pools

Adding a general stage for agents to release their resources on
shutdown. This avoids a circular dependency during shutdown because
we have to delete allocated resources before deleting memory pools, but
we also have to delete memory pools before destroying agents.
Este cometimento está contido em:
David Yat Sin criou e Yat Sin, David cometeu 2025-03-25 14:25:04 -04:00
1 ascendente a66130bc48
cometimento 947391deac
5 ficheiros modificados
+47 -31

Não existem ficheiros que correspondam à sua pesquisa

+2 -2
Ver ficheiro
@@ -524,9 +524,9 @@ hsa_status_t KfdDriver::IsModelEnabled(bool* enable) const {
// AIE does not support streaming performance monitor.
HSAKMT_STATUS status = HSAKMT_STATUS_ERROR;
status = hsaKmtModelEnabled(enable);
if (status != HSAKMT_STATUS_SUCCESS) {
if (status != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR;
}
return HSA_STATUS_SUCCESS;
}
+4
Ver ficheiro
@@ -320,10 +320,14 @@ class Agent : public Checked<0xF6BC25EB17E6F917> {
__forceinline void Enable() { enabled_ = true; }
__forceinline void Disable() { enabled_ = false; }
virtual void Trim() {
for (auto region : regions()) region->Trim();
}
virtual void ReleaseResources() { }
protected:
// Intention here is to have a polymorphic update procedure for public_handle_
// which is callable on any Agent* but only from some class dervied from
+5
Ver ficheiro
@@ -87,6 +87,8 @@ class GpuAgentInt : public core::Agent {
// @retval HSA_STATUS_SUCCESS if initialization is successful.
virtual hsa_status_t PostToolsInit() = 0;
virtual void ReleaseResources() = 0;
// @brief Invoke the user provided callback for each region accessible by
// this agent.
//
@@ -237,6 +239,9 @@ class GpuAgent : public GpuAgentInt {
// @brief GPU agent destructor.
~GpuAgent();
// @brief Release allocated resources and disables agent
void ReleaseResources() override;
// @brief Ensure blits are ready (performance hint).
void PreloadBlits() override;
+31 -29
Ver ficheiro
@@ -247,35 +247,6 @@ GpuAgent::GpuAgent(HSAuint32 node, const HsaNodeProperties& node_props, bool xna
}
GpuAgent::~GpuAgent() {
if (this->Enabled()) {
for (auto& blit : blits_) {
if (!blit.empty()) {
hsa_status_t status = blit->Destroy(*this);
assert(status == HSA_STATUS_SUCCESS);
}
}
if (ape1_base_ != 0) {
_aligned_free(reinterpret_cast<void*>(ape1_base_));
}
scratch_cache_.trim(true);
scratch_cache_.free_reserve();
if (scratch_pool_.base() != NULL) {
hsaKmtFreeMemory(scratch_pool_.base(), scratch_pool_.size());
}
for (int i = 0; i < QueueCount; i++)
queues_[i].reset();
system_deallocator()(doorbell_queue_map_);
if (trap_code_buf_ != NULL) {
ReleaseShader(trap_code_buf_, trap_code_buf_size_);
}
}
std::for_each(regions_.begin(), regions_.end(), DeleteObject());
regions_.clear();
}
@@ -947,6 +918,37 @@ void GpuAgent::PreloadBlits() {
}
}
void GpuAgent::ReleaseResources() {
if (this->Enabled()) {
this->Disable();
for (auto& blit : blits_) {
if (!blit.empty()) {
hsa_status_t status = blit->Destroy(*this);
assert(status == HSA_STATUS_SUCCESS);
}
}
if (ape1_base_ != 0) {
_aligned_free(reinterpret_cast<void*>(ape1_base_));
}
scratch_cache_.trim(true);
scratch_cache_.free_reserve();
if (scratch_pool_.base() != NULL) {
hsaKmtFreeMemory(scratch_pool_.base(), scratch_pool_.size());
}
for (int i = 0; i < QueueCount; i++)
queues_[i].reset();
system_deallocator()(doorbell_queue_map_);
if (trap_code_buf_ != NULL)
system_deallocator()(trap_code_buf_);
}
}
hsa_status_t GpuAgent::PostToolsInit() {
// Defer memory allocation until agents have been discovered.
InitAllocators();
+5
Ver ficheiro
@@ -2098,6 +2098,11 @@ void Runtime::Unload() {
amd::hsa::loader::Loader::Destroy(loader_);
loader_ = nullptr;
for(auto nodeAgent: agents_by_node_) {
for (auto agent: nodeAgent.second)
agent->ReleaseResources();
}
asyncSignals_.control.Shutdown();
asyncExceptions_.control.Shutdown();