Skip to content

Commit a71b88f

Browse files
PageFaultHandler: speedup UM allocations lookup
Add a per-instance SVMAllocsManager::nonGpuDomainAllocs container for all allocations to be removed in moveAllocationsWithinUMAllocsManagerToGpuDomain. This approach replaces the current iterative search and performs the task faster. Add 7 new unit-tests to verify the functionality related to nonGpuDomainAllocs container, both in expected and unexpected/synthetic scenarios. For UTs replace a dummy unifiedMemoryManager pointer with a pointer to an instace of SVMAllocsManager, otherwise a SegFault error is thrown at the end of tests. Perform overall cleanup in related tests implementation, includes but not limited to removal of: - givenInitialPlacementGpu\ WhenMovingToGpuDomainThenFirstAccessDoesNotInvokeTransfer As it is fully covered by: givenAllocationMovedToGpuDomain\ WhenVerifyingPagefaultThenAllocationIsMovedToCpuDomain - givenInitialPlacementGpu\ WhenVerifyingPagefaultThenFirstAccessDoesNotInvokeTransfer As it is fully covered by: givenTbxAndnitialPlacementGpu\ WhenVerifyingPagefaultThenMemoryIsUnprotectedOnly Finally, reduce code duplication where possible. Related-To: NEO-6658 Signed-off-by: Maciej Bielski <[email protected]>
1 parent b7f5169 commit a71b88f

File tree

5 files changed

+264
-173
lines changed

5 files changed

+264
-173
lines changed

shared/source/memory_manager/unified_memory_manager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ class SVMAllocsManager {
164164

165165
std::map<CommandStreamReceiver *, InternalAllocationsTracker> indirectAllocationsResidency;
166166

167+
using NonGpuDomainAllocsContainer = std::vector<void *>;
168+
NonGpuDomainAllocsContainer nonGpuDomainAllocs;
169+
167170
protected:
168171
void *createZeroCopySvmAllocation(size_t size, const SvmAllocationProperties &svmProperties,
169172
const std::set<uint32_t> &rootDeviceIndices,

shared/source/page_fault_manager/cpu_page_fault_manager.cpp

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
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

1916
namespace 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

3129
void 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

6162
void 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

7982
bool PageFaultManager::verifyPageFault(void *ptr) {
@@ -95,24 +98,22 @@ void PageFaultManager::setGpuDomainHandler(gpuDomainHandlerFunc gpuHandlerFuncPt
9598
}
9699

97100
void 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

108105
void 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
}

shared/source/page_fault_manager/cpu_page_fault_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class PageFaultManager : public NonCopyableOrMovableClass {
6262
static void handleGpuDomainTransferForHw(PageFaultManager *pageFaultHandler, void *alloc, PageFaultData &pageFaultData);
6363
static void handleGpuDomainTransferForAubAndTbx(PageFaultManager *pageFaultHandler, void *alloc, PageFaultData &pageFaultData);
6464
void selectGpuDomainHandler();
65+
inline void migrateStorageToGpuDomain(void *ptr, PageFaultData &pageFaultData);
66+
inline void migrateStorageToCpuDomain(void *ptr, PageFaultData &pageFaultData);
6567

6668
decltype(&handleGpuDomainTransferForHw) gpuDomainHandler = &handleGpuDomainTransferForHw;
6769

0 commit comments

Comments
 (0)