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_;
};