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