HSA Enabled IPC support

Uncommented HSA IPC code.
Changed hsa_amd_ipc_memory_t to be 8 uint32_t's instead of 9 to
match spec

Change-Id: Id1523125e9b876a23c3743df1be29c98b47f6725


[ROCm/ROCR-Runtime commit: 160f8c5880]
Este commit está contenido en:
Chris Freehill
2016-12-01 09:31:23 -06:00
cometido por Sean Keely
padre 578c17681b
commit 1df3375ec4
Se han modificado 2 ficheros con 56 adiciones y 59 borrados
+55 -58
Ver fichero
@@ -717,77 +717,74 @@ hsa_status_t Runtime::SetPtrInfoData(void* ptr, void* userptr) {
}
hsa_status_t Runtime::IPCCreate(void* ptr, size_t len, hsa_amd_ipc_memory_t* handle) {
return HSA_STATUS_ERROR;
//static_assert(sizeof(hsa_amd_ipc_memory_t) == sizeof(HsaSharedMemoryHandle),
// "Thunk IPC mismatch.");
//if (hsaKmtShareMemory(ptr, len, (HsaSharedMemoryHandle*)handle) == HSAKMT_STATUS_SUCCESS)
// return HSA_STATUS_SUCCESS;
//else
// return HSA_STATUS_ERROR_INVALID_ARGUMENT;
static_assert(sizeof(hsa_amd_ipc_memory_t) == sizeof(HsaSharedMemoryHandle),
"Thunk IPC mismatch.");
if (hsaKmtShareMemory(ptr, len, (HsaSharedMemoryHandle*)handle) == HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_SUCCESS;
else
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
}
hsa_status_t Runtime::IPCAttach(const hsa_amd_ipc_memory_t* handle, size_t len, uint32_t num_agents,
Agent** agents, void** mapped_ptr) {
return HSA_STATUS_ERROR;
//static const int tinyArraySize = 8;
//void* importAddress;
//HSAuint64 importSize;
//HSAuint64 altAddress;
//if (num_agents == 0) {
// if (hsaKmtRegisterSharedHandle(reinterpret_cast<const HsaSharedMemoryHandle*>(handle),
// &importAddress, &importSize) != HSAKMT_STATUS_SUCCESS)
// return HSA_STATUS_ERROR_INVALID_ARGUMENT;
// if (hsaKmtMapMemoryToGPU(importAddress, importSize, &altAddress) != HSAKMT_STATUS_SUCCESS) {
// hsaKmtDeregisterMemory(importAddress);
// return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
// }
// *mapped_ptr = importAddress;
// return HSA_STATUS_SUCCESS;
//}
static const int tinyArraySize = 8;
void* importAddress;
HSAuint64 importSize;
HSAuint64 altAddress;
if (num_agents == 0) {
if (hsaKmtRegisterSharedHandle(reinterpret_cast<const HsaSharedMemoryHandle*>(handle),
&importAddress, &importSize) != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
if (hsaKmtMapMemoryToGPU(importAddress, importSize, &altAddress) != HSAKMT_STATUS_SUCCESS) {
hsaKmtDeregisterMemory(importAddress);
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
*mapped_ptr = importAddress;
return HSA_STATUS_SUCCESS;
}
//HSAuint32* nodes = nullptr;
//if (num_agents > tinyArraySize)
// nodes = new HSAuint32[num_agents];
//else
// nodes = (HSAuint32*)alloca(sizeof(HSAuint32) * num_agents);
//if (nodes == NULL) return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
HSAuint32* nodes = nullptr;
if (num_agents > tinyArraySize)
nodes = new HSAuint32[num_agents];
else
nodes = (HSAuint32*)alloca(sizeof(HSAuint32) * num_agents);
if (nodes == NULL) return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
//MAKE_SCOPE_GUARD([&]() {
// if (num_agents > tinyArraySize) delete[] nodes;
//});
MAKE_SCOPE_GUARD([&]() {
if (num_agents > tinyArraySize) delete[] nodes;
});
//for (int i = 0; i < num_agents; i++)
// agents[i]->GetInfo((hsa_agent_info_t)HSA_AMD_AGENT_INFO_DRIVER_NODE_ID, &nodes[i]);
for (int i = 0; i < num_agents; i++)
agents[i]->GetInfo((hsa_agent_info_t)HSA_AMD_AGENT_INFO_DRIVER_NODE_ID, &nodes[i]);
//if (hsaKmtRegisterSharedHandleToNodes(reinterpret_cast<const HsaSharedMemoryHandle*>(handle),
// &importAddress, &importSize, num_agents,
// nodes) != HSAKMT_STATUS_SUCCESS)
// return HSA_STATUS_ERROR_INVALID_ARGUMENT;
if (hsaKmtRegisterSharedHandleToNodes(reinterpret_cast<const HsaSharedMemoryHandle*>(handle),
&importAddress, &importSize, num_agents,
nodes) != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
//HsaMemMapFlags map_flags;
//map_flags.Value = 0;
//map_flags.ui32.PageSize = HSA_PAGE_SIZE_64KB;
//if (hsaKmtMapMemoryToGPUNodes(importAddress, importSize, &altAddress, map_flags, num_agents,
// nodes) != HSAKMT_STATUS_SUCCESS) {
// map_flags.ui32.PageSize = HSA_PAGE_SIZE_4KB;
// if (hsaKmtMapMemoryToGPUNodes(importAddress, importSize, &altAddress, map_flags, num_agents,
// nodes) != HSAKMT_STATUS_SUCCESS) {
// hsaKmtDeregisterMemory(importAddress);
// return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
// }
//}
HsaMemMapFlags map_flags;
map_flags.Value = 0;
map_flags.ui32.PageSize = HSA_PAGE_SIZE_64KB;
if (hsaKmtMapMemoryToGPUNodes(importAddress, importSize, &altAddress, map_flags, num_agents,
nodes) != HSAKMT_STATUS_SUCCESS) {
map_flags.ui32.PageSize = HSA_PAGE_SIZE_4KB;
if (hsaKmtMapMemoryToGPUNodes(importAddress, importSize, &altAddress, map_flags, num_agents,
nodes) != HSAKMT_STATUS_SUCCESS) {
hsaKmtDeregisterMemory(importAddress);
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
}
//*mapped_ptr = importAddress;
//return HSA_STATUS_SUCCESS;
*mapped_ptr = importAddress;
return HSA_STATUS_SUCCESS;
}
hsa_status_t Runtime::IPCDetach(void* ptr) {
return HSA_STATUS_ERROR;
//if (hsaKmtUnmapMemoryToGPU(ptr) != HSAKMT_STATUS_SUCCESS)
// return HSA_STATUS_ERROR_INVALID_ARGUMENT;
//if (hsaKmtDeregisterMemory(ptr) != HSAKMT_STATUS_SUCCESS)
// return HSA_STATUS_ERROR_INVALID_ARGUMENT;
//return HSA_STATUS_SUCCESS;
if (hsaKmtUnmapMemoryToGPU(ptr) != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
if (hsaKmtDeregisterMemory(ptr) != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
return HSA_STATUS_SUCCESS;
}
void Runtime::AsyncEventsLoop(void*) {
@@ -1398,7 +1398,7 @@ hsa_status_t HSA_API hsa_amd_pointer_info_set_userdata(void* ptr,
* allocation.
*/
typedef struct hsa_amd_ipc_memory_s {
uint32_t handle[9];
uint32_t handle[8];
} hsa_amd_ipc_memory_t;
/**