P4 to Git Change 1781985 by gandryey@gera-win10 on 2019/05/13 11:54:40
SWDEV-189140 - Add P2P support in PAL path - PAL requires P2P resource open on the usage device. Add the new interface to open the resource - Add a hidden P2P device object creation into amd::Memory. It can be activated with OCL context that has a single device. Affected files ... ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_p2p_amd.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#337 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#134 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.cpp#25 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#74 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.hpp#28 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.cpp#80 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.hpp#23 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#133 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#126 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/command.cpp#93 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.cpp#136 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.hpp#109 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.hpp#306 edit
Этот коммит содержится в:
@@ -152,6 +152,26 @@ GpuMemoryReference* GpuMemoryReference::Create(const Device& dev,
|
||||
return memRef;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
GpuMemoryReference* GpuMemoryReference::Create(const Device& dev,
|
||||
const Pal::PeerGpuMemoryOpenInfo& openInfo) {
|
||||
Pal::Result result;
|
||||
size_t gpuMemSize = dev.iDev()->GetPeerGpuMemorySize(openInfo, &result);
|
||||
if (result != Pal::Result::Success) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GpuMemoryReference* memRef = new (gpuMemSize) GpuMemoryReference(dev);
|
||||
if (memRef != nullptr) {
|
||||
result = dev.iDev()->OpenPeerGpuMemory(openInfo, &memRef[1], &memRef->gpuMem_);
|
||||
if (result != Pal::Result::Success) {
|
||||
memRef->release();
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return memRef;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
GpuMemoryReference::GpuMemoryReference(const Device& dev)
|
||||
: gpuMem_(nullptr), cpuAddress_(nullptr), device_(dev), gpu_(nullptr) {}
|
||||
@@ -367,6 +387,7 @@ void Resource::memTypeToHeap(Pal::GpuMemoryCreateInfo* createInfo) {
|
||||
createInfo->heapCount = 2;
|
||||
createInfo->heaps[0] = Pal::GpuHeapLocal;
|
||||
createInfo->heaps[1] = Pal::GpuHeapGartUswc;
|
||||
createInfo->flags.peerWritable = dev().P2PAccessAllowed();
|
||||
#ifdef ATI_OS_LINUX
|
||||
// Note: SSG in Linux requires DGMA heap
|
||||
if (dev().properties().gpuMemoryProperties.busAddressableMemSize > 0) {
|
||||
@@ -391,6 +412,7 @@ void Resource::memTypeToHeap(Pal::GpuMemoryCreateInfo* createInfo) {
|
||||
createInfo->heaps[0] = Pal::GpuHeapInvisible;
|
||||
createInfo->heaps[1] = Pal::GpuHeapLocal;
|
||||
createInfo->heaps[2] = Pal::GpuHeapGartUswc;
|
||||
createInfo->flags.peerWritable = dev().P2PAccessAllowed();
|
||||
break;
|
||||
default:
|
||||
createInfo->heaps[0] = Pal::GpuHeapLocal;
|
||||
@@ -903,6 +925,20 @@ bool Resource::CreateInterop(CreateParams* params) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
bool Resource::CreateP2PAccess(CreateParams* params) {
|
||||
Pal::PeerGpuMemoryOpenInfo openInfo = {};
|
||||
openInfo.pOriginalMem = params->svmBase_->iMem();
|
||||
|
||||
memRef_ = GpuMemoryReference::Create(dev(), openInfo);
|
||||
if (nullptr == memRef_) {
|
||||
return false;
|
||||
}
|
||||
desc_.cardMemory_ = false;
|
||||
offset_ = params->svmBase_->offset();
|
||||
return true;
|
||||
}
|
||||
|
||||
// ================================================================================================
|
||||
bool Resource::CreatePinned(CreateParams* params) {
|
||||
PinnedParams* pinned = reinterpret_cast<PinnedParams*>(params);
|
||||
@@ -1070,42 +1106,45 @@ bool Resource::create(MemoryType memType, CreateParams* params) {
|
||||
if (dev().settings().disablePersistent_ && (memoryType() == Persistent)) {
|
||||
desc_.type_ = RemoteUSWC;
|
||||
}
|
||||
switch (memoryType()) {
|
||||
case OGLInterop:
|
||||
case D3D9Interop:
|
||||
case D3D10Interop:
|
||||
case D3D11Interop:
|
||||
return CreateInterop(params);
|
||||
case P2PAccess:
|
||||
return CreateP2PAccess(params);
|
||||
case Pinned:
|
||||
return CreatePinned(params);
|
||||
case View: {
|
||||
// Save the offset in the global heap
|
||||
ViewParams* view = reinterpret_cast<ViewParams*>(params);
|
||||
offset_ = view->offset_;
|
||||
|
||||
if ((memoryType() == OGLInterop) || (memoryType() == D3D9Interop) ||
|
||||
(memoryType() == D3D10Interop) || (memoryType() == D3D11Interop)) {
|
||||
return CreateInterop(params);
|
||||
// Make sure parent was provided
|
||||
if (nullptr != view->resource_) {
|
||||
viewOwner_ = view->resource_;
|
||||
offset_ += viewOwner_->offset();
|
||||
if (viewOwner_->data() != nullptr) {
|
||||
address_ = viewOwner_->data() + view->offset_;
|
||||
mapCount_++;
|
||||
}
|
||||
memRef_ = viewOwner_->memRef_;
|
||||
memRef_->retain();
|
||||
desc_.cardMemory_ = viewOwner_->desc().cardMemory_;
|
||||
} else {
|
||||
desc_.type_ = Empty;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!desc_.buffer_) {
|
||||
return CreateImage(params);
|
||||
}
|
||||
|
||||
if (memoryType() == Pinned) {
|
||||
return CreatePinned(params);
|
||||
}
|
||||
|
||||
if (memoryType() == View) {
|
||||
// Save the offset in the global heap
|
||||
ViewParams* view = reinterpret_cast<ViewParams*>(params);
|
||||
offset_ = view->offset_;
|
||||
|
||||
// Make sure parent was provided
|
||||
if (nullptr != view->resource_) {
|
||||
viewOwner_ = view->resource_;
|
||||
offset_ += viewOwner_->offset();
|
||||
if (viewOwner_->data() != nullptr) {
|
||||
address_ = viewOwner_->data() + view->offset_;
|
||||
mapCount_++;
|
||||
}
|
||||
memRef_ = viewOwner_->memRef_;
|
||||
memRef_->retain();
|
||||
desc_.cardMemory_ = viewOwner_->desc().cardMemory_;
|
||||
} else {
|
||||
desc_.type_ = Empty;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Pal::gpusize svmPtr = 0;
|
||||
if ((nullptr != params) && (nullptr != params->owner_) &&
|
||||
(nullptr != params->owner_->getSvmPtr())) {
|
||||
@@ -1823,6 +1862,7 @@ bool MemorySubAllocator::CreateChunk(const Pal::IGpuMemory* reserved_va) {
|
||||
createInfo.priority = Pal::GpuMemPriority::Normal;
|
||||
createInfo.heapCount = 1;
|
||||
createInfo.heaps[0] = Pal::GpuHeapInvisible;
|
||||
createInfo.flags.peerWritable = device_->P2PAccessAllowed();
|
||||
GpuMemoryReference* mem_ref = GpuMemoryReference::Create(*device_, createInfo);
|
||||
if (mem_ref != nullptr) {
|
||||
return InitAllocator(mem_ref);
|
||||
|
||||
Ссылка в новой задаче
Block a user