From 33214c5e427b829386fa8076f580fbb0b08d5484 Mon Sep 17 00:00:00 2001
From: foreman
Date: Fri, 25 Jan 2019 19:18:53 -0500
Subject: [PATCH] P4 to Git Change 1736033 by kjayapra@9_HIPWS_IPCCHKIN on
2019/01/25 17:44:48
SWDEV-145570 - IPC Mem Handle Changes for HIP.
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/hip/hip_internal.hpp#20 edit
... //depot/stg/opencl/drivers/opencl/api/hip/hip_memory.cpp#43 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#330 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#112 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.hpp#33 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#42 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.hpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.hpp#108 edit
[ROCm/clr commit: c22af4142dca579fa296737bd25267732b00b1a2]
---
projects/clr/hipamd/api/hip/hip_internal.hpp | 10 +++
projects/clr/hipamd/api/hip/hip_memory.cpp | 92 +++++++++++++++++---
2 files changed, 90 insertions(+), 12 deletions(-)
diff --git a/projects/clr/hipamd/api/hip/hip_internal.hpp b/projects/clr/hipamd/api/hip/hip_internal.hpp
index 27f7e33fc3..3ca1ba61d7 100644
--- a/projects/clr/hipamd/api/hip/hip_internal.hpp
+++ b/projects/clr/hipamd/api/hip/hip_internal.hpp
@@ -31,6 +31,16 @@ THE SOFTWARE.
#include
#include
+/*! IHIP IPC MEMORY Structure */
+#define IHIP_IPC_MEM_HANDLE_SIZE 32
+#define IHIP_IPC_MEM_RESERVED_SIZE LP64_SWITCH(28,24)
+
+typedef struct ihipIpcMemHandle_st {
+ char ipc_handle[IHIP_IPC_MEM_HANDLE_SIZE]; ///< ipc memory handle on ROCr
+ size_t psize;
+ char reserved[IHIP_IPC_MEM_RESERVED_SIZE];
+} ihipIpcMemHandle_t;
+
#define HIP_INIT() \
std::call_once(hip::g_ihipInitialized, hip::init); \
if (hip::g_context == nullptr && g_devices.size() > 0) { \
diff --git a/projects/clr/hipamd/api/hip/hip_memory.cpp b/projects/clr/hipamd/api/hip/hip_memory.cpp
index dcea3bd083..587bbbc96e 100644
--- a/projects/clr/hipamd/api/hip/hip_memory.cpp
+++ b/projects/clr/hipamd/api/hip/hip_memory.cpp
@@ -1249,28 +1249,96 @@ hipError_t hipMemsetD8(hipDeviceptr_t dst, unsigned char value, size_t sizeBytes
HIP_RETURN(hipSuccess);
}
-hipError_t hipIpcGetMemHandle(hipIpcMemHandle_t* handle, void* devPtr) {
- HIP_INIT_API(handle, devPtr);
+hipError_t hipIpcGetMemHandle(hipIpcMemHandle_t* handle, void* dev_ptr) {
+ HIP_INIT_API(handle, dev_ptr);
- assert(0 && "Unimplemented");
+ size_t offset = 0;
+ amd::Memory* amd_mem_obj = nullptr;
+ device::Memory* dev_mem_obj = nullptr;
+ ihipIpcMemHandle_t* ihandle = nullptr;
- HIP_RETURN(hipErrorUnknown);
+ if ((handle == nullptr) || (dev_ptr == nullptr)) {
+ HIP_RETURN(hipErrorInvalidValue);
+ }
+
+ /* Get AMD::Memory object corresponding to this pointer */
+ amd_mem_obj = getMemoryObject(dev_ptr, offset);
+ if (amd_mem_obj == nullptr) {
+ HIP_RETURN(hipErrorInvalidDevicePointer);
+ }
+
+ /* Get Device::Memory object pointer */
+ dev_mem_obj = amd_mem_obj->getDeviceMemory(*hip::getCurrentContext()->devices()[0],false);
+ if (dev_mem_obj == nullptr) {
+ HIP_RETURN(hipErrorInvalidDevicePointer);
+ }
+
+ /* Create an handle for IPC. Store the memory size inside the handle */
+ ihandle = reinterpret_cast(handle);
+ dev_mem_obj->IpcCreate(offset, &(ihandle->psize), &(ihandle->ipc_handle));
+
+ HIP_RETURN(hipSuccess);
}
-hipError_t hipIpcOpenMemHandle(void** devPtr, hipIpcMemHandle_t handle, unsigned int flags) {
- HIP_INIT_API(devPtr, &handle, flags);
+hipError_t hipIpcOpenMemHandle(void** dev_ptr, hipIpcMemHandle_t handle, unsigned int flags) {
+ HIP_INIT_API(dev_ptr, &handle, flags);
- assert(0 && "Unimplemented");
+ amd::Memory* amd_mem_obj = nullptr;
+ amd::Device* device = nullptr;
+ ihipIpcMemHandle_t* ihandle = nullptr;
- HIP_RETURN(hipErrorUnknown);
+ if (dev_ptr == nullptr) {
+ HIP_RETURN(hipErrorInvalidValue);
+ }
+
+ /* Call the IPC Attach from Device class */
+ device = hip::getCurrentContext()->devices()[0];
+ ihandle = reinterpret_cast(&handle);
+
+ amd_mem_obj = device->IpcAttach(&(ihandle->ipc_handle), ihandle->psize, flags, dev_ptr);
+ if (amd_mem_obj == nullptr) {
+ HIP_RETURN(hipErrorInvalidDevicePointer);
+ }
+
+ /* Add the memory to the MemObjMap */
+ amd::MemObjMap::AddMemObj(*dev_ptr, amd_mem_obj);
+
+ HIP_RETURN(hipSuccess);
}
-hipError_t hipIpcCloseMemHandle(void* devPtr) {
- HIP_INIT_API(devPtr);
+hipError_t hipIpcCloseMemHandle(void* dev_ptr) {
+ HIP_INIT_API(dev_ptr);
- assert(0 && "Unimplemented");
+ size_t offset = 0;
+ amd::Device* device = nullptr;
+ amd::Memory* amd_mem_obj = nullptr;
- HIP_RETURN(hipErrorUnknown);
+ hip::syncStreams();
+ hip::getNullStream()->finish();
+
+ if (dev_ptr == nullptr) {
+ HIP_RETURN(hipErrorInvalidValue);
+ }
+
+ /* Get the amd::Memory object */
+ amd_mem_obj = getMemoryObject(dev_ptr, offset);
+ if (amd_mem_obj == nullptr) {
+ HIP_RETURN(hipErrorInvalidDevicePointer);
+ }
+
+ /* Call IPC Detach from Device class */
+ device = hip::getCurrentContext()->devices()[0];
+ if (device == nullptr) {
+ HIP_RETURN(hipErrorNoDevice);
+ }
+
+ /* Remove the memory from MemObjMap */
+ amd::MemObjMap::RemoveMemObj(amd_mem_obj);
+
+ /* detach the memory */
+ device->IpcDetach(*amd_mem_obj);
+
+ HIP_RETURN(hipSuccess);
}
hipChannelFormatDesc hipCreateChannelDesc(int x, int y, int z, int w, hipChannelFormatKind f) {