Create method to deduce transfer type

Related-To: NEO-7564
Signed-off-by: Fabian Zwolinski <fabian.zwolinski@intel.com>
This commit is contained in:
Fabian Zwolinski
2023-01-20 17:21:19 +00:00
committed by Compute-Runtime-Automation
parent eb002acaa1
commit d6bfcdb245
4 changed files with 139 additions and 1 deletions

View File

@@ -142,11 +142,14 @@ struct CommandListCoreFamilyImmediate : public CommandListCoreFamily<gfxCoreFami
NEO::LogicalStateHelper *getLogicalStateHelper() const override;
bool preferCopyThroughLockedPtr(NEO::SvmAllocationData *dstAlloc, bool dstFound, NEO::SvmAllocationData *srcAlloc, bool srcFound, size_t size);
bool isSuitableUSMHostAlloc(NEO::SvmAllocationData *alloc, bool allocFound);
bool isSuitableUSMDeviceAlloc(NEO::SvmAllocationData *alloc, bool allocFound);
bool isSuitableUSMSharedAlloc(NEO::SvmAllocationData *alloc, bool allocFound);
ze_result_t performCpuMemcpy(void *dstptr, const void *srcptr, size_t size, NEO::SvmAllocationData *dstAlloc, NEO::SvmAllocationData *srcAlloc, ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents);
void *obtainLockedPtrFromDevice(NEO::SvmAllocationData *alloc, void *ptr);
bool waitForEventsFromHost();
void checkWaitEventsState(uint32_t numWaitEvents, ze_event_handle_t *waitEventList);
TransferType getTransferType(NEO::SvmAllocationData *dstAlloc, bool dstFound, NEO::SvmAllocationData *srcAlloc, bool srcFound);
protected:
void printKernelsPrintfOutput(bool hangDetected);

View File

@@ -661,12 +661,22 @@ bool CommandListCoreFamilyImmediate<gfxCoreFamily>::preferCopyThroughLockedPtr(N
return false;
}
template <GFXCORE_FAMILY gfxCoreFamily>
bool CommandListCoreFamilyImmediate<gfxCoreFamily>::isSuitableUSMHostAlloc(NEO::SvmAllocationData *alloc, bool allocFound) {
return allocFound && (alloc->memoryType == InternalMemoryType::HOST_UNIFIED_MEMORY);
}
template <GFXCORE_FAMILY gfxCoreFamily>
bool CommandListCoreFamilyImmediate<gfxCoreFamily>::isSuitableUSMDeviceAlloc(NEO::SvmAllocationData *alloc, bool allocFound) {
return allocFound && (alloc->memoryType == InternalMemoryType::DEVICE_UNIFIED_MEMORY) &&
alloc->gpuAllocations.getGraphicsAllocation(this->device->getRootDeviceIndex())->storageInfo.getNumBanks() == 1;
}
template <GFXCORE_FAMILY gfxCoreFamily>
bool CommandListCoreFamilyImmediate<gfxCoreFamily>::isSuitableUSMSharedAlloc(NEO::SvmAllocationData *alloc, bool allocFound) {
return allocFound && (alloc->memoryType == InternalMemoryType::SHARED_UNIFIED_MEMORY);
}
template <GFXCORE_FAMILY gfxCoreFamily>
ze_result_t CommandListCoreFamilyImmediate<gfxCoreFamily>::performCpuMemcpy(void *dstptr, const void *srcptr, size_t size, NEO::SvmAllocationData *dstAlloc, NEO::SvmAllocationData *srcAlloc, ze_event_handle_t hSignalEvent, uint32_t numWaitEvents, ze_event_handle_t *phWaitEvents) {
@@ -741,6 +751,51 @@ void CommandListCoreFamilyImmediate<gfxCoreFamily>::checkWaitEventsState(uint32_
}
}
template <GFXCORE_FAMILY gfxCoreFamily>
TransferType CommandListCoreFamilyImmediate<gfxCoreFamily>::getTransferType(NEO::SvmAllocationData *dstAlloc, bool dstFound, NEO::SvmAllocationData *srcAlloc, bool srcFound) {
const bool srcHostUSM = isSuitableUSMHostAlloc(srcAlloc, srcFound);
const bool srcDeviceUSM = isSuitableUSMDeviceAlloc(srcAlloc, srcFound) || isSuitableUSMSharedAlloc(srcAlloc, srcFound);
const bool srcHostNonUSM = srcAlloc == nullptr;
const bool dstHostUSM = isSuitableUSMHostAlloc(dstAlloc, dstFound);
const bool dstDeviceUSM = isSuitableUSMDeviceAlloc(dstAlloc, dstFound) || isSuitableUSMSharedAlloc(dstAlloc, dstFound);
const bool dstHostNonUSM = dstAlloc == nullptr;
TransferType retVal;
if (srcHostNonUSM && dstHostUSM) {
retVal = HOST_NON_USM_TO_HOST_USM;
}
if (srcHostNonUSM && dstDeviceUSM) {
retVal = HOST_NON_USM_TO_DEVICE_USM;
}
if (srcHostNonUSM && dstHostNonUSM) {
retVal = HOST_NON_USM_TO_HOST_NON_USM;
}
if (srcHostUSM && dstHostUSM) {
retVal = HOST_USM_TO_HOST_USM;
}
if (srcHostUSM && dstDeviceUSM) {
retVal = HOST_USM_TO_DEVICE_USM;
}
if (srcHostUSM && dstHostNonUSM) {
retVal = HOST_USM_TO_HOST_NON_USM;
}
if (srcDeviceUSM && dstHostUSM) {
retVal = DEVICE_USM_TO_HOST_USM;
}
if (srcDeviceUSM && dstDeviceUSM) {
retVal = DEVICE_USM_TO_DEVICE_USM;
}
if (srcDeviceUSM && dstHostNonUSM) {
retVal = DEVICE_USM_TO_HOST_NON_USM;
}
return retVal;
}
template <GFXCORE_FAMILY gfxCoreFamily>
void CommandListCoreFamilyImmediate<gfxCoreFamily>::printKernelsPrintfOutput(bool hangDetected) {
size_t size = this->printfKernelContainer.size();