From aeb94403c7aaba7bd12eb41bbedfbed59298bedc Mon Sep 17 00:00:00 2001 From: foreman Date: Fri, 12 Jan 2018 14:59:13 -0500 Subject: [PATCH] P4 to Git Change 1503207 by wchau@wchau_OCL_boltzmann on 2018/01/12 14:51:08 SWDEV-140733 - OpenCL Runtime Support for Raven BU in ROCm - Fix OCLMemoryInfo issue of incorrect free memory info - Fix OCLPerfMemCreate failure due to memory leak Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#31 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.cpp#30 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.hpp#12 edit [ROCm/clr commit: 074f37ac4d12f8870433ffad50167a28a6c1db46] --- .../rocclr/runtime/device/rocm/rocmemory.cpp | 33 ++++++++++++++----- .../runtime/device/rocm/rocsettings.cpp | 6 ++++ .../runtime/device/rocm/rocsettings.hpp | 3 +- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/projects/clr/rocclr/runtime/device/rocm/rocmemory.cpp b/projects/clr/rocclr/runtime/device/rocm/rocmemory.cpp index 6281979916..835ff96ea8 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocmemory.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocmemory.cpp @@ -579,17 +579,25 @@ void Buffer::destroy() { return; } #endif - if ((deviceMemory_ != nullptr) && (deviceMemory_ != owner()->getHostMem())) { - // if they are identical, the host pointer will be - // deallocated later on => avoid double deallocation - if (isHostMemDirectAccess()) { - if (memFlags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)) { - if (dev().agent_profile() != HSA_PROFILE_FULL) { - hsa_amd_memory_unlock(owner()->getHostMem()); + if (deviceMemory_ != nullptr) { + if (deviceMemory_ != owner()->getHostMem()) { + // if they are identical, the host pointer will be + // deallocated later on => avoid double deallocation + if (isHostMemDirectAccess()) { + if (memFlags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR)) { + if (dev().agent_profile() != HSA_PROFILE_FULL) { + hsa_amd_memory_unlock(owner()->getHostMem()); + } } + } else { + dev().memFree(deviceMemory_, size()); + const_cast(dev()).updateFreeMemory(size(), true); + } + } + else if (dev().settings().apuSystem_) { + if (!(memFlags & (CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))) { + dev().memFree(deviceMemory_, size()); } - } else { - dev().memFree(deviceMemory_, size()); const_cast(dev()).updateFreeMemory(size(), true); } } @@ -672,6 +680,10 @@ bool Buffer::create() { deviceMemory_ = dev().hostAlloc(size(), 1, false); owner()->setHostMem(deviceMemory_); + + if (dev().settings().apuSystem_) { + const_cast(dev()).updateFreeMemory(size(), false); + } } else { const_cast(dev()).updateFreeMemory(size(), false); @@ -938,6 +950,9 @@ bool Image::create() { if (originalDeviceMemory_ == nullptr) { originalDeviceMemory_ = dev().hostAlloc(alloc_size, 1, false); + if (dev().settings().apuSystem_) { + const_cast(dev()).updateFreeMemory(alloc_size, false); + } } else { const_cast(dev()).updateFreeMemory(alloc_size, false); diff --git a/projects/clr/rocclr/runtime/device/rocm/rocsettings.cpp b/projects/clr/rocclr/runtime/device/rocm/rocsettings.cpp index dafa597b2f..72423a67dc 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocsettings.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocsettings.cpp @@ -72,6 +72,8 @@ Settings::Settings() { // Don't support Denormals for single precision by default singleFpDenorm_ = false; + + apuSystem_ = false; } bool Settings::create(bool fullProfile, int gfxipVersion) { @@ -124,6 +126,10 @@ bool Settings::create(bool fullProfile, int gfxipVersion) { } #endif // WITH_LIGHTNING_COMPILER + if (gfxipVersion == 902) { + apuSystem_ = true; + } + // Override current device settings override(); diff --git a/projects/clr/rocclr/runtime/device/rocm/rocsettings.hpp b/projects/clr/rocclr/runtime/device/rocm/rocsettings.hpp index 3f94c3f783..cb14035a55 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocsettings.hpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocsettings.hpp @@ -29,7 +29,8 @@ class Settings : public device::Settings { uint stagedXferRead_ : 1; //!< Uses a staged buffer read uint stagedXferWrite_ : 1; //!< Uses a staged buffer write uint singleFpDenorm_ : 1; //!< Support Single FP Denorm - uint reserved_ : 21; + uint apuSystem_ : 1; //!< APU system + uint reserved_ : 20; }; uint value_; };