2
0

rocr: Assume KFD in hsa_amd_interop functions (#1138)

Este cometimento está contido em:
Yiannis Papadopoulos
2025-11-07 10:38:06 -05:00
cometido por GitHub
ascendente a9082a7158
cometimento 30785f8d18
2 ficheiros modificados com 24 adições e 15 eliminações
+1 -1
Ver ficheiro
@@ -348,7 +348,7 @@ public:
/// @brief Releases the residency of the memory
/// @param[in] mem address of memory to be made unresident
/// @return HSA_STATUS_SUCCESS if the driver successfully makes the memory
/// @return HSA_STATUS_SUCCESS if the driver successfully releases the residency
virtual hsa_status_t MakeMemoryUnresident(const void* mem) const = 0;
/// Unique identifier for supported kernel-mode drivers.
@@ -905,25 +905,30 @@ hsa_status_t Runtime::InteropMap(uint32_t num_agents, Agent** agents,
if (num_agents > tinyArraySize) delete[] nodes;
});
for (uint32_t i = 0; i < num_agents; i++)
agents[i]->GetInfo((hsa_agent_info_t)HSA_AMD_AGENT_INFO_DRIVER_NODE_ID,
&nodes[i]);
for (uint32_t i = 0; i < num_agents; i++) {
if (agents[i]->driver().kernel_driver_type_ != DriverType::KFD) {
return HSA_STATUS_ERROR_INVALID_AGENT;
}
agents[i]->GetInfo(static_cast<hsa_agent_info_t>(HSA_AMD_AGENT_INFO_DRIVER_NODE_ID), &nodes[i]);
}
if (HSAKMT_CALL(hsaKmtRegisterGraphicsHandleToNodes(interop_handle, &info, num_agents,
nodes)) != HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR;
HSAuint64 altAddress;
assert(num_agents > 0);
auto& driver = agents[0]->driver();
uint64_t altAddress;
HsaMemMapFlags map_flags;
map_flags.Value = 0;
map_flags.ui32.PageSize = HSA_PAGE_SIZE_64KB;
if (HSAKMT_CALL(hsaKmtMapMemoryToGPUNodes(info.MemoryAddress, info.SizeInBytes,
&altAddress, map_flags, num_agents,
nodes)) != HSAKMT_STATUS_SUCCESS) {
if (driver.MakeMemoryResident(info.MemoryAddress, info.SizeInBytes, &altAddress, &map_flags,
num_agents, nodes) != HSA_STATUS_SUCCESS) {
map_flags.ui32.PageSize = HSA_PAGE_SIZE_4KB;
if (HSAKMT_CALL(hsaKmtMapMemoryToGPUNodes(info.MemoryAddress, info.SizeInBytes, &altAddress, map_flags,
num_agents, nodes)) != HSAKMT_STATUS_SUCCESS) {
HSAKMT_CALL(hsaKmtDeregisterMemory(info.MemoryAddress));
if (driver.MakeMemoryResident(info.MemoryAddress, info.SizeInBytes, &altAddress, &map_flags,
num_agents, nodes) != HSA_STATUS_SUCCESS) {
driver.DeregisterMemory(info.MemoryAddress);
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
}
@@ -942,10 +947,14 @@ hsa_status_t Runtime::InteropMap(uint32_t num_agents, Agent** agents,
}
hsa_status_t Runtime::InteropUnmap(void* ptr) {
if(HSAKMT_CALL(hsaKmtUnmapMemoryToGPU(ptr))!=HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
if(HSAKMT_CALL(hsaKmtDeregisterMemory(ptr))!=HSAKMT_STATUS_SUCCESS)
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
auto& driver = core::Runtime::runtime_singleton_->AgentDriver(DriverType::KFD);
hsa_status_t err = driver.MakeMemoryUnresident(ptr);
if (err != HSA_STATUS_SUCCESS) return HSA_STATUS_ERROR_INVALID_ARGUMENT;
err = driver.DeregisterMemory(ptr);
if (err != HSA_STATUS_SUCCESS) return HSA_STATUS_ERROR_INVALID_ARGUMENT;
return HSA_STATUS_SUCCESS;
}