GpuAgent::~GpuAgent() {
  if (ape1_base_ != 0)
    ReleaseApe1(reinterpret_cast<void*>(ape1_base_), ape1_size_);

  std::for_each(core::Agent::regions_.begin(), core::Agent::regions_.end(),
                DeleteObject());
  core::Agent::regions_.clear();

  if (scratch_pool_.base() != NULL) {
    hsaKmtFreeMemory(scratch_pool_.base(), scratch_pool_.size());
  }
}
/// @brief Free agent accessible memory (system / local memory).
static void FreeKfdMemory(void* ptr, size_t size) {
    if (ptr == NULL || size == 0) {
        return;
    }

    // Completely deregister ptr (could be two references on the registration due
    // to an explicit registration call)
    while (core::Runtime::runtime_singleton_->Deregister(ptr))
        ;

    HSAKMT_STATUS status = hsaKmtFreeMemory(ptr, size);
    assert(status == HSAKMT_STATUS_SUCCESS);
}
GpuAgent::~GpuAgent() {
  if (ape1_base_ != 0) {
    ReleaseApe1(reinterpret_cast<void*>(ape1_base_), ape1_size_);
  }

  regions_.clear();

  if (scratch_pool_.base() != NULL) {
    hsaKmtFreeMemory(scratch_pool_.base(), scratch_pool_.size());
  }

  if (blit_ != NULL) {
    hsa_status_t status = blit_->Destroy();
    assert(status == HSA_STATUS_SUCCESS);

    delete blit_;
  }
}