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
This commit is contained in:
foreman
2017-02-01 18:39:14 -05:00
parent c0d4edda9d
commit a10c33ad77
2 ha cambiato i file con 38 aggiunte e 27 eliminazioni
+3 -1
Vedi File
@@ -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);
}
+35 -26
Vedi File
@@ -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<void *>(
amd::alignUp(reinterpret_cast<uintptr_t>(originalDeviceMemory_),
deviceImageInfo_.alignment));
amd::alignUp(reinterpret_cast<uintptr_t>(originalDeviceMemory_),
deviceImageInfo_.alignment));
assert(amd::isMultipleOf(
deviceMemory_, static_cast<size_t>(deviceImageInfo_.alignment)));
deviceMemory_, static_cast<size_t>(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) {