From a7be0eb56a456e44acb24bc4946428cf401a89ad Mon Sep 17 00:00:00 2001 From: German Andryeyev Date: Tue, 15 Feb 2022 09:26:46 -0500 Subject: [PATCH] SWDEV-316824 - Fix P2P compute copy path Use device memory object for the GPU VA address look-up. Change-Id: I76bf58b29205f7b3ba1bf68e9fcca69421267203 [ROCm/clr commit: 3fd4a67670787d83ed545503fac372668a99b5f7] --- projects/clr/rocclr/device/rocm/rocblit.cpp | 4 ++-- projects/clr/rocclr/device/rocm/rocblit.hpp | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/projects/clr/rocclr/device/rocm/rocblit.cpp b/projects/clr/rocclr/device/rocm/rocblit.cpp index 8d8a643942..7183b02d2f 100644 --- a/projects/clr/rocclr/device/rocm/rocblit.cpp +++ b/projects/clr/rocclr/device/rocm/rocblit.cpp @@ -2104,9 +2104,9 @@ bool KernelBlitManager::copyBuffer(device::Memory& srcMemory, device::Memory& ds // Program kernels arguments for the blit operation cl_mem mem = as_cl(srcMemory.owner()); - setArgument(kernels_[blitType], 0, sizeof(cl_mem), &mem); + setArgument(kernels_[blitType], 0, sizeof(cl_mem), &mem, 0, &srcMemory); mem = as_cl(dstMemory.owner()); - setArgument(kernels_[blitType], 1, sizeof(cl_mem), &mem); + setArgument(kernels_[blitType], 1, sizeof(cl_mem), &mem, 0, &dstMemory); // Program source origin uint64_t srcOffset = srcOrigin[0] / CopyBuffAlignment[i]; setArgument(kernels_[blitType], 2, sizeof(srcOffset), &srcOffset); diff --git a/projects/clr/rocclr/device/rocm/rocblit.hpp b/projects/clr/rocclr/device/rocm/rocblit.hpp index 217bb8ee5d..acbf3611d5 100644 --- a/projects/clr/rocclr/device/rocm/rocblit.hpp +++ b/projects/clr/rocclr/device/rocm/rocblit.hpp @@ -447,7 +447,8 @@ class KernelBlitManager : public DmaBlitManager { void releaseArguments(address args) const; inline void setArgument(amd::Kernel* kernel, size_t index, - size_t size, const void* value, uint32_t offset = 0) const; + size_t size, const void* value, uint32_t offset = 0, + const device::Memory* dev_mem = nullptr) const; uint32_t ConstantBufferOffset() const { // Make sure it can fit at least 128 bytes for OCL memory fill of double16 @@ -490,7 +491,8 @@ static const char* BlitName[KernelBlitManager::BlitTotal] = { }; inline void KernelBlitManager::setArgument(amd::Kernel* kernel, size_t index, - size_t size, const void* value, uint32_t offset) const { + size_t size, const void* value, uint32_t offset, + const device::Memory* dev_mem) const { const amd::KernelParameterDescriptor& desc = kernel->signature().at(index); void* param = kernel->parameters().values() + desc.offset_; @@ -511,8 +513,13 @@ inline void KernelBlitManager::setArgument(amd::Kernel* kernel, size_t index, // convert cl_mem to amd::Memory*, return false if invalid. reinterpret_cast(kernel->parameters().values() + kernel->parameters().memoryObjOffset())[desc.info_.arrayIndex_] = mem; - LP64_SWITCH(uint32_value, uint64_value) = static_cast( - mem->getDeviceMemory(dev())->virtualAddress()) + offset; + if (dev_mem == nullptr) { + LP64_SWITCH(uint32_value, uint64_value) = static_cast( + mem->getDeviceMemory(dev())->virtualAddress()) + offset; + } else { + LP64_SWITCH(uint32_value, uint64_value) = static_cast( + dev_mem->virtualAddress()) + offset; + } } } else if (desc.type_ == T_SAMPLER) { assert(false && "No sampler support in blit manager! Use internal samplers!");