77
88#include " shared/source/page_fault_manager/cpu_page_fault_manager.h"
99
10- #include " shared/source/debug_settings/debug_settings_manager.h"
11- #include " shared/source/helpers/debug_helpers.h"
1210#include " shared/source/helpers/memory_properties_helpers.h"
13- #include " shared/source/helpers/options.h"
14- #include " shared/source/helpers/ptr_math.h"
1511#include " shared/source/memory_manager/unified_memory_manager.h"
1612
13+ #include < algorithm>
1714#include < mutex>
1815
1916namespace NEO {
@@ -26,6 +23,7 @@ void PageFaultManager::insertAllocation(void *ptr, size_t size, SVMAllocsManager
2623 if (initialPlacement != GraphicsAllocation::UsmInitialPlacement::CPU) {
2724 this ->protectCPUMemoryAccess (ptr, size);
2825 }
26+ unifiedMemoryManager->nonGpuDomainAllocs .push_back (ptr);
2927}
3028
3129void PageFaultManager::removeAllocation (void *ptr) {
@@ -35,6 +33,11 @@ void PageFaultManager::removeAllocation(void *ptr) {
3533 auto &pageFaultData = alloc->second ;
3634 if (pageFaultData.domain == AllocationDomain::Gpu) {
3735 allowCPUMemoryAccess (ptr, pageFaultData.size );
36+ } else {
37+ auto &cpuAllocs = pageFaultData.unifiedMemoryManager ->nonGpuDomainAllocs ;
38+ if (auto it = std::find (cpuAllocs.begin (), cpuAllocs.end (), ptr); it != cpuAllocs.end ()) {
39+ cpuAllocs.erase (it);
40+ }
3841 }
3942 this ->memoryData .erase (ptr);
4043 }
@@ -46,34 +49,34 @@ void PageFaultManager::moveAllocationToGpuDomain(void *ptr) {
4649 if (alloc != memoryData.end ()) {
4750 auto &pageFaultData = alloc->second ;
4851 if (pageFaultData.domain != AllocationDomain::Gpu) {
49- if (pageFaultData.domain == AllocationDomain::Cpu) {
50- if (DebugManager.flags .PrintUmdSharedMigration .get ()) {
51- printf (" UMD transferring shared allocation %llx from CPU to GPU\n " , reinterpret_cast <unsigned long long int >(ptr));
52- }
53- this ->transferToGpu (ptr, pageFaultData.cmdQ );
54- this ->protectCPUMemoryAccess (ptr, pageFaultData.size );
52+ this ->migrateStorageToGpuDomain (ptr, pageFaultData);
53+
54+ auto &cpuAllocs = pageFaultData.unifiedMemoryManager ->nonGpuDomainAllocs ;
55+ if (auto it = std::find (cpuAllocs.begin (), cpuAllocs.end (), ptr); it != cpuAllocs.end ()) {
56+ cpuAllocs.erase (it);
5557 }
56- pageFaultData.domain = AllocationDomain::Gpu;
5758 }
5859 }
5960}
6061
6162void PageFaultManager::moveAllocationsWithinUMAllocsManagerToGpuDomain (SVMAllocsManager *unifiedMemoryManager) {
6263 std::unique_lock<SpinLock> lock{mtx};
63- for (auto &alloc : this ->memoryData ) {
64- auto allocPtr = alloc.first ;
65- auto &pageFaultData = alloc.second ;
66- if (pageFaultData.unifiedMemoryManager == unifiedMemoryManager && pageFaultData.domain != AllocationDomain::Gpu) {
67- if (pageFaultData.domain == AllocationDomain::Cpu) {
68- if (DebugManager.flags .PrintUmdSharedMigration .get ()) {
69- printf (" UMD transferring shared allocation %llx from CPU to GPU\n " , reinterpret_cast <unsigned long long int >(allocPtr));
70- }
71- this ->transferToGpu (allocPtr, pageFaultData.cmdQ );
72- this ->protectCPUMemoryAccess (allocPtr, pageFaultData.size );
73- }
74- pageFaultData.domain = AllocationDomain::Gpu;
64+ for (auto allocPtr : unifiedMemoryManager->nonGpuDomainAllocs ) {
65+ auto &pageFaultData = this ->memoryData [allocPtr];
66+ this ->migrateStorageToGpuDomain (allocPtr, pageFaultData);
67+ }
68+ unifiedMemoryManager->nonGpuDomainAllocs .clear ();
69+ }
70+
71+ inline void PageFaultManager::migrateStorageToGpuDomain (void *ptr, PageFaultData &pageFaultData) {
72+ if (pageFaultData.domain == AllocationDomain::Cpu) {
73+ if (DebugManager.flags .PrintUmdSharedMigration .get ()) {
74+ printf (" UMD transferring shared allocation %llx from CPU to GPU\n " , reinterpret_cast <unsigned long long int >(ptr));
7575 }
76+ this ->transferToGpu (ptr, pageFaultData.cmdQ );
77+ this ->protectCPUMemoryAccess (ptr, pageFaultData.size );
7678 }
79+ pageFaultData.domain = AllocationDomain::Gpu;
7780}
7881
7982bool PageFaultManager::verifyPageFault (void *ptr) {
@@ -95,24 +98,22 @@ void PageFaultManager::setGpuDomainHandler(gpuDomainHandlerFunc gpuHandlerFuncPt
9598}
9699
97100void PageFaultManager::handleGpuDomainTransferForHw (PageFaultManager *pageFaultHandler, void *allocPtr, PageFaultData &pageFaultData) {
98- if (pageFaultData.domain == AllocationDomain::Gpu) {
99- if (DebugManager.flags .PrintUmdSharedMigration .get ()) {
100- printf (" UMD transferring shared allocation %llx from GPU to CPU\n " , reinterpret_cast <unsigned long long int >(allocPtr));
101- }
102- pageFaultHandler->transferToCpu (allocPtr, pageFaultData.size , pageFaultData.cmdQ );
103- }
104- pageFaultData.domain = AllocationDomain::Cpu;
101+ pageFaultHandler->migrateStorageToCpuDomain (allocPtr, pageFaultData);
105102 pageFaultHandler->allowCPUMemoryAccess (allocPtr, pageFaultData.size );
106103}
107104
108105void PageFaultManager::handleGpuDomainTransferForAubAndTbx (PageFaultManager *pageFaultHandler, void *allocPtr, PageFaultData &pageFaultData) {
109106 pageFaultHandler->allowCPUMemoryAccess (allocPtr, pageFaultData.size );
107+ pageFaultHandler->migrateStorageToCpuDomain (allocPtr, pageFaultData);
108+ }
110109
110+ inline void PageFaultManager::migrateStorageToCpuDomain (void *ptr, PageFaultData &pageFaultData) {
111111 if (pageFaultData.domain == AllocationDomain::Gpu) {
112112 if (DebugManager.flags .PrintUmdSharedMigration .get ()) {
113- printf (" UMD transferring shared allocation %llx from GPU to CPU\n " , reinterpret_cast <unsigned long long int >(allocPtr ));
113+ printf (" UMD transferring shared allocation %llx from GPU to CPU\n " , reinterpret_cast <unsigned long long int >(ptr ));
114114 }
115- pageFaultHandler->transferToCpu (allocPtr, pageFaultData.size , pageFaultData.cmdQ );
115+ this ->transferToCpu (ptr, pageFaultData.size , pageFaultData.cmdQ );
116+ pageFaultData.unifiedMemoryManager ->nonGpuDomainAllocs .push_back (ptr);
116117 }
117118 pageFaultData.domain = AllocationDomain::Cpu;
118119}
0 commit comments