SWDEV-311270 - Clean-up IPC path in ROCclr

- Make IPC interfaces generic between devices and rely on the IPC buffer
for attach/detach logic

Change-Id: Id3c18d122030329b7ee532bbb6317de9dd6a0bbe


[ROCm/clr commit: 9aa6f25f1c]
이 커밋은 다음에 포함됨:
German
2023-06-16 18:38:34 -04:00
커밋한 사람 German Andryeyev
부모 60b9dc4a45
커밋 c8e65415ea
13개의 변경된 파일과 196개의 추가작업 그리고 299개의 파일을 삭제
-136
파일 보기
@@ -2220,142 +2220,6 @@ void Device::updateFreeMemory(size_t size, bool free) {
ClPrint(amd::LOG_INFO, amd::LOG_MEM, "device=0x%lx, freeMem_ = 0x%zx", this, freeMem_.load());
}
bool Device::IpcCreate(void* dev_ptr, size_t* mem_size, void* handle, size_t* mem_offset) const {
hsa_status_t hsa_status = HSA_STATUS_SUCCESS;
amd::Memory* amd_mem_obj = amd::MemObjMap::FindMemObj(dev_ptr);
if (amd_mem_obj == nullptr) {
DevLogPrintfError("Cannot retrieve amd_mem_obj for dev_ptr: 0x%x", dev_ptr);
return false;
}
// Get the original pointer from the amd::Memory object
void* orig_dev_ptr = nullptr;
if (amd_mem_obj->getSvmPtr() != nullptr) {
orig_dev_ptr = amd_mem_obj->getSvmPtr();
} else if (amd_mem_obj->getHostMem() != nullptr) {
orig_dev_ptr = amd_mem_obj->getHostMem();
} else {
ShouldNotReachHere();
}
// Check if the dev_ptr is lesser than original dev_ptr
if (orig_dev_ptr > dev_ptr) {
//If this happens, then revisit FindMemObj logic
DevLogPrintfError("Original dev_ptr: 0x%x cannot be greater than dev_ptr: 0x%x",
orig_dev_ptr, dev_ptr);
return false;
}
//Calculate the memory offset from the original base ptr
*mem_offset = reinterpret_cast<address>(dev_ptr) - reinterpret_cast<address>(orig_dev_ptr);
*mem_size = amd_mem_obj->getSize();
//Check if the dev_ptr is greater than memory allocated
if (*mem_offset > *mem_size) {
DevLogPrintfError("Memory offset: %u cannot be greater than size of "
"original memory allocated: %u", *mem_size, *mem_offset);
return false;
}
hsa_status = hsa_amd_ipc_memory_create(orig_dev_ptr, *mem_size,
reinterpret_cast<hsa_amd_ipc_memory_t*>(handle));
if (hsa_status != HSA_STATUS_SUCCESS) {
LogPrintfError("Failed to create memory for IPC, failed with hsa_status: %d \n", hsa_status);
return false;
}
return true;
}
bool Device::IpcAttach(const void* handle, size_t mem_size, size_t mem_offset,
unsigned int flags, void** dev_ptr) const {
amd::Memory* amd_mem_obj = nullptr;
void* orig_dev_ptr = nullptr;
// Retrieve the devPtr from the handle
hsa_status_t hsa_status =
hsa_amd_ipc_memory_attach(reinterpret_cast<const hsa_amd_ipc_memory_t*>(handle),
mem_size, (1 + p2p_agents_.size()), p2p_agents_list_,
&orig_dev_ptr);
if (hsa_status != HSA_STATUS_SUCCESS) {
LogPrintfError("HSA failed to attach IPC memory with status: %d \n", hsa_status);
return false;
}
amd_mem_obj = amd::MemObjMap::FindMemObj(orig_dev_ptr);
if (amd_mem_obj == nullptr) {
// Memory does not exist, create an amd Memory object for the pointer
amd_mem_obj = new (context()) amd::Buffer(context(), flags, mem_size, orig_dev_ptr);
if (amd_mem_obj == nullptr) {
LogError("failed to create a mem object!");
return false;
}
if (!amd_mem_obj->create(nullptr)) {
LogError("failed to create a svm hidden buffer!");
amd_mem_obj->release();
return false;
}
amd_mem_obj->setIpcShared(true);
// Add the original mem_ptr to the MemObjMap with newly created amd_mem_obj
amd::MemObjMap::AddMemObj(orig_dev_ptr, amd_mem_obj);
} else {
//Memory already exists, just retain the old one.
amd_mem_obj->retain();
}
//Make sure the mem_offset doesnt overflow the allocated memory
guarantee((mem_offset < mem_size), "IPC mem offset greater than allocated size");
// Return orig_dev_ptr
*dev_ptr = reinterpret_cast<address>(orig_dev_ptr);
return true;
}
bool Device::IpcDetach (void* dev_ptr) const {
hsa_status_t hsa_status = HSA_STATUS_SUCCESS;
amd::Memory* amd_mem_obj = amd::MemObjMap::FindMemObj(dev_ptr);
if (amd_mem_obj == nullptr) {
DevLogPrintfError("Memory object for the ptr: 0x%x cannot be null \n", dev_ptr);
return false;
}
if (!amd_mem_obj->ipcShared()) {
DevLogPrintfError("Memory object for the ptr: 0x%x is not ipcShared \n", dev_ptr);
return false;
}
// Get the original pointer from the amd::Memory object
void* orig_dev_ptr = nullptr;
if (amd_mem_obj->getSvmPtr() != nullptr) {
orig_dev_ptr = amd_mem_obj->getSvmPtr();
} else if (amd_mem_obj->getHostMem() != nullptr) {
orig_dev_ptr = amd_mem_obj->getHostMem();
} else {
ShouldNotReachHere();
}
if (amd_mem_obj->release() == 0) {
amd::MemObjMap::RemoveMemObj(orig_dev_ptr);
// Detach the memory from HSA
hsa_status = hsa_amd_ipc_memory_detach(orig_dev_ptr);
if (hsa_status != HSA_STATUS_SUCCESS) {
LogPrintfError("HSA failed to detach memory with status: %d \n", hsa_status);
return false;
}
}
return true;
}
// ================================================================================================
void* Device::svmAlloc(amd::Context& context, size_t size, size_t alignment, cl_svm_mem_flags flags,
void* svmPtr) const {