diff --git a/shared/source/execution_environment/execution_environment.cpp b/shared/source/execution_environment/execution_environment.cpp index 8b145cd5b2..cb59f49cfd 100644 --- a/shared/source/execution_environment/execution_environment.cpp +++ b/shared/source/execution_environment/execution_environment.cpp @@ -152,9 +152,9 @@ DirectSubmissionController *ExecutionEnvironment::initializeDirectSubmissionCont return directSubmissionController.get(); } -void ExecutionEnvironment::initializeUnifiedMemoryReuseCleaner() { +void ExecutionEnvironment::initializeUnifiedMemoryReuseCleaner(bool enable) { std::lock_guard lock(initializeUnifiedMemoryReuseCleanerMutex); - auto initializeUnifiedMemoryReuseCleaner = UnifiedMemoryReuseCleaner::isSupported(); + auto initializeUnifiedMemoryReuseCleaner = UnifiedMemoryReuseCleaner::isSupported() && enable; if (debugManager.flags.ExperimentalUSMAllocationReuseCleaner.get() != -1) { initializeUnifiedMemoryReuseCleaner = debugManager.flags.ExperimentalUSMAllocationReuseCleaner.get() == 1; diff --git a/shared/source/execution_environment/execution_environment.h b/shared/source/execution_environment/execution_environment.h index 0de06b43fa..2a9bdd63f2 100644 --- a/shared/source/execution_environment/execution_environment.h +++ b/shared/source/execution_environment/execution_environment.h @@ -66,7 +66,7 @@ class ExecutionEnvironment : public ReferenceTrackedObject bool isFP64EmulationEnabled() const { return fp64EmulationEnabled; } DirectSubmissionController *initializeDirectSubmissionController(); - void initializeUnifiedMemoryReuseCleaner(); + void initializeUnifiedMemoryReuseCleaner(bool enable); std::unique_ptr memoryManager; std::unique_ptr unifiedMemoryReuseCleaner; diff --git a/shared/source/memory_manager/unified_memory_manager.cpp b/shared/source/memory_manager/unified_memory_manager.cpp index 3045bde4c2..93f85602ab 100644 --- a/shared/source/memory_manager/unified_memory_manager.cpp +++ b/shared/source/memory_manager/unified_memory_manager.cpp @@ -845,9 +845,7 @@ void SVMAllocsManager::initUsmAllocationsCaches(Device &device) { this->usmDeviceAllocationsCacheEnabled = !!debugManager.flags.ExperimentalEnableDeviceAllocationCache.get(); } if (this->usmDeviceAllocationsCacheEnabled) { - if (!device.isAnyDirectSubmissionEnabled(true)) { - device.getExecutionEnvironment()->initializeUnifiedMemoryReuseCleaner(); - } + device.getExecutionEnvironment()->initializeUnifiedMemoryReuseCleaner(!device.isAnyDirectSubmissionEnabled(true)); this->initUsmDeviceAllocationsCache(device); } @@ -856,9 +854,7 @@ void SVMAllocsManager::initUsmAllocationsCaches(Device &device) { this->usmHostAllocationsCacheEnabled = !!debugManager.flags.ExperimentalEnableHostAllocationCache.get(); } if (this->usmHostAllocationsCacheEnabled) { - if (!device.isAnyDirectSubmissionEnabled(true)) { - device.getExecutionEnvironment()->initializeUnifiedMemoryReuseCleaner(); - } + device.getExecutionEnvironment()->initializeUnifiedMemoryReuseCleaner(!device.isAnyDirectSubmissionEnabled(true)); this->initUsmHostAllocationsCache(); } } diff --git a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp index 94dd762f59..62908ef8d9 100644 --- a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp +++ b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp @@ -304,11 +304,11 @@ TEST(ExecutionEnvironment, givenExperimentalUSMAllocationReuseCleanerSetWhenInit VariableBackup funcBackup{&NEO::Thread::createFunc, [](void *(*func)(void *), void *arg) -> std::unique_ptr { return nullptr; }}; MockExecutionEnvironment executionEnvironment{}; - executionEnvironment.initializeUnifiedMemoryReuseCleaner(); + executionEnvironment.initializeUnifiedMemoryReuseCleaner(true); auto cleaner = executionEnvironment.unifiedMemoryReuseCleaner.get(); EXPECT_NE(cleaner, nullptr); - executionEnvironment.initializeUnifiedMemoryReuseCleaner(); + executionEnvironment.initializeUnifiedMemoryReuseCleaner(true); EXPECT_EQ(cleaner, executionEnvironment.unifiedMemoryReuseCleaner.get()); } @@ -317,11 +317,23 @@ TEST(ExecutionEnvironment, givenExperimentalUSMAllocationReuseCleanerSetZeroWhen debugManager.flags.ExperimentalUSMAllocationReuseCleaner.set(0); MockExecutionEnvironment executionEnvironment{}; - executionEnvironment.initializeUnifiedMemoryReuseCleaner(); + executionEnvironment.initializeUnifiedMemoryReuseCleaner(true); EXPECT_EQ(nullptr, executionEnvironment.unifiedMemoryReuseCleaner.get()); } +TEST(ExecutionEnvironment, givenExperimentalUSMAllocationReuseCleanerSetAndNotEnabledWhenInitializeUnifiedMemoryReuseCleanerThenForceInit) { + DebugManagerStateRestore restorer; + debugManager.flags.ExperimentalUSMAllocationReuseCleaner.set(1); + + VariableBackup funcBackup{&NEO::Thread::createFunc, [](void *(*func)(void *), void *arg) -> std::unique_ptr { return nullptr; }}; + MockExecutionEnvironment executionEnvironment{}; + executionEnvironment.initializeUnifiedMemoryReuseCleaner(false); + auto cleaner = executionEnvironment.unifiedMemoryReuseCleaner.get(); + + EXPECT_NE(cleaner, nullptr); +} + TEST(ExecutionEnvironment, givenNeoCalEnabledWhenCreateExecutionEnvironmentThenSetDebugVariables) { const std::unordered_map config = { {"UseKmdMigration", 0},