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) {