diff --git a/rocclr/device/pal/paldevice.cpp b/rocclr/device/pal/paldevice.cpp index 65a104025a..8610ceeb8e 100644 --- a/rocclr/device/pal/paldevice.cpp +++ b/rocclr/device/pal/paldevice.cpp @@ -1678,6 +1678,22 @@ pal::Memory* Device::createImage(amd::Memory& owner, bool directAccess) const { // Create memory object result = gpuImage->create(Resource::Pinned, ¶ms); + } else { + Resource::CreateParams params; + params.owner_ = &owner; + params.gpu_ = static_cast(owner.getVirtualDevice()); + params.svmBase_ = static_cast(owner.svmBase()); + Resource::MemoryType type = Resource::MemoryType::Empty; + if (owner.P2PAccess()) { + params.svmBase_ = static_cast(owner.BaseP2PMemory()); + if (params.svmBase_ != nullptr) { + type = Resource::P2PAccess; + } + } + if (type == Resource::P2PAccess) { + // Create memory object + result = gpuImage->create(type, ¶ms); + } } if (!result && !owner.isInterop()) { diff --git a/rocclr/device/pal/palresource.cpp b/rocclr/device/pal/palresource.cpp index c0af7b9ded..a8d75ac4cf 100644 --- a/rocclr/device/pal/palresource.cpp +++ b/rocclr/device/pal/palresource.cpp @@ -220,7 +220,32 @@ GpuMemoryReference* GpuMemoryReference::Create(const Device& dev, } return memRef; } +GpuMemoryReference* GpuMemoryReference::Create(const Device& dev, + const Pal::PeerImageOpenInfo& openInfo, + Pal::IImage** image) { + Pal::Result result; + size_t imageSize = 0; + size_t gpuMemSize = 0; + dev.iDev()->GetPeerImageSizes(openInfo, &imageSize, &gpuMemSize, &result); + if (Pal::Result::Success != result) { + return nullptr; + } + char* imgMem = new char[imageSize]; + GpuMemoryReference* memRef = new (gpuMemSize) GpuMemoryReference(dev); + if (memRef != nullptr) { + result = dev.iDev()->OpenPeerImage(openInfo, imgMem, &memRef[1], image, + &memRef->gpuMem_); + if (result == Pal::Result::Success) { + result = memRef->MakeResident(); + } + if (result != Pal::Result::Success) { + memRef->release(); + return nullptr; + } + } + return memRef; +} // ================================================================================================ GpuMemoryReference::GpuMemoryReference(const Device& dev) : gpuMem_(nullptr), cpuAddress_(nullptr), device_(dev), gpu_(nullptr) {} @@ -1003,11 +1028,16 @@ bool Resource::CreateInterop(CreateParams* params) { } // ================================================================================================ -bool Resource::CreateP2PAccess(CreateParams* params) { - Pal::PeerGpuMemoryOpenInfo openInfo = {}; - openInfo.pOriginalMem = params->svmBase_->iMem(); - - memRef_ = GpuMemoryReference::Create(dev(), openInfo); + bool Resource::CreateP2PAccess(CreateParams* params) { + if (params->owner_->asImage()) { + Pal::PeerImageOpenInfo openInfo = {}; + openInfo.pOriginalImage = params->svmBase_->image(); + memRef_ = GpuMemoryReference::Create(dev(), openInfo, &image_); + } else { + Pal::PeerGpuMemoryOpenInfo openInfo = {}; + openInfo.pOriginalMem = params->svmBase_->iMem(); + memRef_ = GpuMemoryReference::Create(dev(), openInfo); + } if (nullptr == memRef_) { return false; } diff --git a/rocclr/device/pal/palresource.hpp b/rocclr/device/pal/palresource.hpp index d20ae74131..2a0e17ff39 100644 --- a/rocclr/device/pal/palresource.hpp +++ b/rocclr/device/pal/palresource.hpp @@ -55,6 +55,8 @@ class GpuMemoryReference : public amd::ReferenceCountedObject { static GpuMemoryReference* Create(const Device& dev, const Pal::PeerGpuMemoryOpenInfo& openInfo); + static GpuMemoryReference* Create(const Device& dev, const Pal::PeerImageOpenInfo& openInfo, + Pal::IImage** image); //! Default constructor GpuMemoryReference(const Device& dev);