From 6e8e12b17c61d0fa5164c6fcf6521bc15d849014 Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Wed, 13 May 2020 11:48:07 -0400 Subject: [PATCH] Set CPU access flag for SVM Make sure all GPUs have CPU access flag for the fine grain buffer. Change-Id: Ifc843c2807e70a271b269192ae7859205ff458f3 [ROCm/clr commit: 8904848abc9a5a8c3cb06048be26009570f195fd] --- projects/clr/rocclr/device/rocm/rocmemory.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/projects/clr/rocclr/device/rocm/rocmemory.cpp b/projects/clr/rocclr/device/rocm/rocmemory.cpp index 532af16652..2d1bb8b00b 100644 --- a/projects/clr/rocclr/device/rocm/rocmemory.cpp +++ b/projects/clr/rocclr/device/rocm/rocmemory.cpp @@ -711,15 +711,16 @@ bool Buffer::create() { cl_mem_flags memFlags = owner()->getMemFlags(); if (owner()->getSvmPtr() != nullptr) { - if (dev().forceFineGrain(owner()) || - dev().isFineGrainedSystem(true)) { + if (dev().forceFineGrain(owner()) || dev().isFineGrainedSystem(true)) { memFlags |= CL_MEM_SVM_FINE_GRAIN_BUFFER; - // Don't enable direct access to GPU memory with large bar, because - // there is no tracking of HDP flush after CPU writes - // flags_ |= HostMemoryDirectAccess; } const bool isFineGrain = memFlags & CL_MEM_SVM_FINE_GRAIN_BUFFER; + if (isFineGrain) { + // Use CPU direct access for the fine grain buffer + flags_ |= HostMemoryDirectAccess; + } + if (owner()->getSvmPtr() == reinterpret_cast(1)) { if (isFineGrain) { if (memFlags & CL_MEM_SVM_ATOMICS) { @@ -728,8 +729,8 @@ bool Buffer::create() { else { deviceMemory_ = dev().hostAlloc(size(), 1, false); } - flags_ |= HostMemoryDirectAccess; } else { + assert(!isHostMemDirectAccess() && "Runtime doesn't support direct access to GPU memory!"); deviceMemory_ = dev().deviceLocalAlloc(size(), (memFlags & CL_MEM_SVM_ATOMICS) != 0); } owner()->setSvmPtr(deviceMemory_); @@ -737,14 +738,12 @@ bool Buffer::create() { deviceMemory_ = owner()->getSvmPtr(); } - if (!isFineGrain && - (owner()->parent() != nullptr) && + if (!isFineGrain && (owner()->parent() != nullptr) && (owner()->parent()->getSvmPtr() != nullptr)) { owner()->parent()->commitSvmMemory(); } - if ((deviceMemory_ != nullptr) && - (dev().settings().apuSystem_ || !isFineGrain)) { + if ((deviceMemory_ != nullptr) && (dev().settings().apuSystem_ || !isFineGrain)) { const_cast(dev()).updateFreeMemory(size(), false); }