diff --git a/rocclr/device/rocm/rocmemory.cpp b/rocclr/device/rocm/rocmemory.cpp index bccb74a8ac..2553fffc31 100644 --- a/rocclr/device/rocm/rocmemory.cpp +++ b/rocclr/device/rocm/rocmemory.cpp @@ -1137,6 +1137,19 @@ bool Image::create() { return createInteropImage(); } + // Checking if original device memory can be accessed by peer devices + device::Memory* orgDevMem = owner()->getOriginalDeviceMemory(); + if (amd::IS_HIP && + orgDevMem != nullptr && orgDevMem->getAllowedPeerAccess()) { + roc::Image* orgImage = static_cast(orgDevMem); + // fill all required values + deviceImageInfo_ = orgImage->deviceImageInfo_; + permission_ = orgImage->permission_; + deviceMemory_ = orgImage->deviceMemory_; + hsaImageObject_ = orgImage->hsaImageObject_; + return true; + } + // Get memory size requirement for device specific image. hsa_status_t status = hsa_ext_image_data_get_info(dev().getBackendDevice(), &imageDescriptor_, permission_, &deviceImageInfo_); diff --git a/rocclr/platform/memory.hpp b/rocclr/platform/memory.hpp index 4d28e45965..b24450db49 100644 --- a/rocclr/platform/memory.hpp +++ b/rocclr/platform/memory.hpp @@ -294,6 +294,9 @@ class Memory : public amd::RuntimeObject { bool alloc = true //!< Allocates memory ); + //! Get origianl device memory + device::Memory* getOriginalDeviceMemory() const { return deviceMemories_[0].value_; }; + //! Allocate host memory (as required) bool allocHostMemory(void* initFrom, //!< Host memory provided by the application bool allocHostMem, //!< Force system memory allocation