From d535a9fbf42442de724ce8e68e2bcf8a7da06a46 Mon Sep 17 00:00:00 2001
From: foreman
Date: Mon, 9 Jan 2017 19:02:23 -0500
Subject: [PATCH] P4 to Git Change 1359979 by
skudchad@skudchad_test_win_opencl2 on 2017/01/09 18:53:16
SWDEV-107271 - [OpenCL][GFXIP9 Bring up] add support for Raven(gfx901)
- Fix USWC memory calculations
- Try USWC allocations if local are unsuccessful
ReviewBoardURL = http://ocltc.amd.com/reviews/r/12116/diff/
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#40 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.cpp#9 edit
---
rocclr/runtime/device/pal/paldevice.cpp | 8 +++--
rocclr/runtime/device/pal/palmemory.cpp | 39 +++++++++++++++++++++++--
2 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/rocclr/runtime/device/pal/paldevice.cpp b/rocclr/runtime/device/pal/paldevice.cpp
index 844d84b511..0dc6730f9b 100644
--- a/rocclr/runtime/device/pal/paldevice.cpp
+++ b/rocclr/runtime/device/pal/paldevice.cpp
@@ -276,9 +276,11 @@ void NullDevice::fillDeviceInfo(
(static_cast(std::min(GPU_MAX_HEAP_SIZE, 100u)) *
static_cast(localRAM) / 100u);
+ uint uswcPercentAvailable = ((static_cast(heaps[Pal::GpuHeapGartUswc].heapSize) / Mi) > 1536 && IS_WINDOWS)
+ ? 75 : 50;
if (settings().apuSystem_) {
- info_.globalMemSize_ +=
- (static_cast(heaps[Pal::GpuHeapGartUswc].heapSize) * Mi * 75)/100;
+ info_.globalMemSize_ +=
+ (static_cast(heaps[Pal::GpuHeapGartUswc].heapSize) * uswcPercentAvailable) / 100;
}
// Find the largest heap form FB memory
@@ -289,7 +291,7 @@ void NullDevice::fillDeviceInfo(
#if defined(ATI_OS_WIN)
if (settings().apuSystem_) {
info_.maxMemAllocSize_ = std::max(
- (static_cast(heaps[Pal::GpuHeapGartUswc].heapSize) * Mi * 75)/100,
+ (static_cast(heaps[Pal::GpuHeapGartUswc].heapSize) * uswcPercentAvailable)/100,
info_.maxMemAllocSize_);
}
#endif
diff --git a/rocclr/runtime/device/pal/palmemory.cpp b/rocclr/runtime/device/pal/palmemory.cpp
index bfc2a3c7a6..8e1ab0a7ff 100644
--- a/rocclr/runtime/device/pal/palmemory.cpp
+++ b/rocclr/runtime/device/pal/palmemory.cpp
@@ -124,12 +124,45 @@ Memory::create(
Resource::CreateParams* params)
{
bool result;
-
+ uint allocAttempt = 0;
// Reset the flag in case we reallocate the heap in local/remote
flags_ &= ~HostMemoryDirectAccess;
- // Create a resource in CAL
- result = Resource::create(memType, params);
+ do {
+ // Create a resource in CAL
+ result = Resource::create(memType, params);
+ if (!result) {
+ size_t freeMemory[2];
+ // if requested memory is greater than available then exit the loop
+ dev().globalFreeMemory(freeMemory);
+
+ // Local to Persistent
+ if (memoryType() == Local) {
+ // For dgpu freeMemory[0] reports a sum of visible+invisible fb
+ if (owner()->getSize() > (freeMemory[0] * Ki)) {
+ break;
+ }
+ memType = Persistent;
+ }
+ // Don't switch to USWC if persistent memory was explicitly asked
+ else if ((allocAttempt > 0) && (memoryType() == Persistent)) {
+ memType = RemoteUSWC;
+ }
+ // Remote cacheable to uncacheable
+ else if (memoryType() == Remote) {
+ memType = RemoteUSWC;
+ }
+ else if (dev().settings().apuSystem_ && memoryType() == RemoteUSWC) {
+ if (owner()->getSize() > (freeMemory[0] * Ki)) {
+ break;
+ }
+ }
+ else {
+ break;
+ }
+ allocAttempt++;
+ }
+ } while (!result);
// Check if CAL created a resource
if (result) {