From a10c33ad77f833593fb5d3984a14dbad0cb48467 Mon Sep 17 00:00:00 2001 From: foreman Date: Wed, 1 Feb 2017 18:39:14 -0500 Subject: [PATCH] P4 to Git Change 1368253 by gandryey@gera-w8 on 2017/02/01 18:29:08 SWDEV-112352 - [ROCm CQE][OCLonLC][QR][G] Aborted/Segmentation fault is observed with "sub_buffers_read_write_dual_devices" of Buffers, due to CL#1364923 - Keep system memory for multiple devices in case of possible initialization on the second device Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#41 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#9 edit --- rocclr/runtime/device/rocm/rocdevice.cpp | 4 +- rocclr/runtime/device/rocm/rocmemory.cpp | 61 ++++++++++++++---------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/rocclr/runtime/device/rocm/rocdevice.cpp b/rocclr/runtime/device/rocm/rocdevice.cpp index 84dd70f527..403c65cd6f 100644 --- a/rocclr/runtime/device/rocm/rocdevice.cpp +++ b/rocclr/runtime/device/rocm/rocdevice.cpp @@ -1417,7 +1417,9 @@ Device::createMemory(amd::Memory &owner) const amd::Coord3D(0, 0, 0), imageView->getRegion(), 0, 0, true); - if (owner.getMemFlags() & CL_MEM_COPY_HOST_PTR) { + // Release host memory for single device, since runtime copied data + if ((owner.getMemFlags() & CL_MEM_COPY_HOST_PTR) && + (owner.getContext().devices().size() == 1)) { owner.setHostMem(nullptr); } diff --git a/rocclr/runtime/device/rocm/rocmemory.cpp b/rocclr/runtime/device/rocm/rocmemory.cpp index b86f292f18..8d350cd8e4 100644 --- a/rocclr/runtime/device/rocm/rocmemory.cpp +++ b/rocclr/runtime/device/rocm/rocmemory.cpp @@ -395,7 +395,11 @@ Buffer::create() owner()->getHostMem(), *devBufferView, amd::Coord3D(0), amd::Coord3D(size()), true); - owner()->setHostMem(nullptr); + // Release host memory for single device, + // since runtime copied data + if (owner()->getContext().devices().size() == 1) { + owner()->setHostMem(nullptr); + } bufferView->release(); return ret; @@ -419,13 +423,13 @@ Buffer::create() flags_ |= HostMemoryDirectAccess; if (dev_.agent_profile() == HSA_PROFILE_FULL) { - deviceMemory_ = owner()->getHostMem(); + deviceMemory_ = owner()->getHostMem(); - if (memFlags & CL_MEM_USE_HOST_PTR) { - hsa_memory_register(deviceMemory_, size()); - } + if (memFlags & CL_MEM_USE_HOST_PTR) { + hsa_memory_register(deviceMemory_, size()); + } - return deviceMemory_ != NULL; + return deviceMemory_ != NULL; } if (owner()->getSvmPtr() != owner()->getHostMem()) { @@ -656,8 +660,9 @@ Image::create() } //Interop image - if(owner()->isInterop()) - return createInteropImage(); + if (owner()->isInterop()) { + return createInteropImage(); + } // Get memory size requirement for device specific image. hsa_status_t status = hsa_ext_image_data_get_info( @@ -673,28 +678,27 @@ Image::create() // support alignment larger than HSA memory region allocation granularity. // In this case, the user manages the alignment. const size_t alloc_size = - (deviceImageInfo_.alignment <= dev_.alloc_granularity()) - ? deviceImageInfo_.size - : deviceImageInfo_.size + deviceImageInfo_.alignment; + (deviceImageInfo_.alignment <= dev_.alloc_granularity()) + ? deviceImageInfo_.size + : deviceImageInfo_.size + deviceImageInfo_.alignment; if (!(owner()->getMemFlags() & CL_MEM_ALLOC_HOST_PTR)) { - originalDeviceMemory_ = dev_.deviceLocalAlloc(alloc_size); + originalDeviceMemory_ = dev_.deviceLocalAlloc(alloc_size); } if (originalDeviceMemory_ == NULL) { - originalDeviceMemory_ = - dev_.hostAlloc(alloc_size, 1, false); + originalDeviceMemory_ = dev_.hostAlloc(alloc_size, 1, false); } deviceMemory_ = reinterpret_cast( - amd::alignUp(reinterpret_cast(originalDeviceMemory_), - deviceImageInfo_.alignment)); + amd::alignUp(reinterpret_cast(originalDeviceMemory_), + deviceImageInfo_.alignment)); assert(amd::isMultipleOf( - deviceMemory_, static_cast(deviceImageInfo_.alignment))); + deviceMemory_, static_cast(deviceImageInfo_.alignment))); status = hsa_ext_image_create( - dev_.getBackendDevice(), &imageDescriptor_, deviceMemory_, + dev_.getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, &hsaImageObject_); if (status != HSA_STATUS_SUCCESS) { @@ -719,17 +723,22 @@ Image::createView(const Memory &parent) oldestParent = oldestParent->parent(); } - kind_=parent.getKind(); + kind_ = parent.getKind(); hsa_status_t status; - if(kind_==MEMORY_KIND_INTEROP) - status = hsa_amd_image_create(dev_.getBackendDevice(), &imageDescriptor_, amdImageDesc_, deviceMemory_, permission_, &hsaImageObject_); + if (kind_ == MEMORY_KIND_INTEROP) { + status = hsa_amd_image_create(dev_.getBackendDevice(), &imageDescriptor_, + amdImageDesc_, deviceMemory_, permission_, &hsaImageObject_); + } else if (oldestParent->asBuffer()) { - status = hsa_ext_image_create_with_layout(dev_.getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, - HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR, owner()->asImage()->getRowPitch(), 0, - &hsaImageObject_); - } else { - status= hsa_ext_image_create(dev_.getBackendDevice(), &imageDescriptor_, deviceMemory_, permission_, &hsaImageObject_); + status = hsa_ext_image_create_with_layout(dev_.getBackendDevice(), + &imageDescriptor_, deviceMemory_, permission_, + HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR, owner()->asImage()->getRowPitch(), 0, + &hsaImageObject_); + } + else { + status= hsa_ext_image_create(dev_.getBackendDevice(), &imageDescriptor_, + deviceMemory_, permission_, &hsaImageObject_); } if (status != HSA_STATUS_SUCCESS) {