SWDEV-563842 - Fix Memory Address Offset Bug (#1749)
* SWDEV-563842 - Fix Memory Address Offset Bug * Revert "SWDEV-563842 - Fix Memory Address Offset Bug" This reverts commit 477958dc48300ee1fe0166aa6f0d3d8125b91f5e. * SWDEV-563842 - Fix Memcpy Address Offset Bug * SWDEV-563842 - Find Memcpy Device Address Offset * Revert "SWDEV-563842 - Find Memcpy Device Address Offset" This reverts commit 6c75a9e5b58b7dfabb9e3f91fa3dd892d42639cc. * Revert "SWDEV-563842 - Fix Memcpy Address Offset Bug" This reverts commit 0b89072a988074aa4da4e8fc7ba04c554f31ed44. * SWDEV-563842 - MemObjMap_ Offset Support This patch fixes the buffer offset handling bug. * Revert "SWDEV-563842 - MemObjMap_ Offset Support" This reverts commit 37fce3382465e3420721e5277377f943ec2b30a1. * SWDEV-563842 - External Memory Buffer View
Tento commit je obsažen v:
@@ -111,8 +111,8 @@ hipError_t ihipFree(void* ptr) {
|
||||
// Wait on the device, associated with the current memory object during allocation
|
||||
g_devices[device_id]->SyncAllStreams();
|
||||
|
||||
// External mem is not svm.
|
||||
if (memory_object->isInterop()) {
|
||||
// Non SVM memory free, such as external memory
|
||||
if (memory_object->getSvmPtr() == nullptr) {
|
||||
amd::MemObjMap::RemoveMemObj(ptr);
|
||||
memory_object->release();
|
||||
} else {
|
||||
@@ -172,15 +172,35 @@ hipError_t hipExternalMemoryGetMappedBuffer(void** devPtr, hipExternalMemory_t e
|
||||
if (devPtr == nullptr || extMem == nullptr || bufferDesc == nullptr || bufferDesc->flags != 0) {
|
||||
HIP_RETURN(hipErrorInvalidValue);
|
||||
}
|
||||
auto buf = reinterpret_cast<amd::ExternalBuffer*>(extMem);
|
||||
const device::Memory* devMem = buf->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]);
|
||||
|
||||
if (devMem == nullptr || ((bufferDesc->offset + bufferDesc->size) > devMem->size())) {
|
||||
auto buf = reinterpret_cast<amd::ExternalBuffer*>(extMem);
|
||||
|
||||
// Validate bounds
|
||||
if (bufferDesc->size > buf->getSize() ||
|
||||
bufferDesc->offset > buf->getSize() - bufferDesc->size) {
|
||||
HIP_RETURN(hipErrorInvalidValue);
|
||||
}
|
||||
*devPtr = reinterpret_cast<void*>(devMem->virtualAddress() + bufferDesc->offset);
|
||||
amd::MemObjMap::AddMemObj(*devPtr, buf);
|
||||
buf->retain();
|
||||
|
||||
// Create a buffer view
|
||||
auto view = new (buf->getContext())
|
||||
amd::Buffer(*buf, buf->getMemFlags(), bufferDesc->offset, bufferDesc->size);
|
||||
if (view == nullptr || !view->create()) {
|
||||
if (view) view->release();
|
||||
HIP_RETURN(hipErrorOutOfMemory);
|
||||
}
|
||||
|
||||
// Create device memory for the current device
|
||||
const device::Memory* devMem = view->getDeviceMemory(*hip::getCurrentDevice()->devices()[0]);
|
||||
if (devMem == nullptr) {
|
||||
view->release();
|
||||
HIP_RETURN(hipErrorInvalidValue);
|
||||
}
|
||||
|
||||
// Map the device memory to the user pointer
|
||||
*devPtr = reinterpret_cast<void*>(devMem->virtualAddress());
|
||||
amd::MemObjMap::AddMemObj(*devPtr, view);
|
||||
view->retain();
|
||||
|
||||
HIP_RETURN(hipSuccess);
|
||||
}
|
||||
|
||||
|
||||
Odkázat v novém úkolu
Zablokovat Uživatele