From 129f4c6045bfaaf7757f1faa82e74929aa40b826 Mon Sep 17 00:00:00 2001 From: Zbigniew Zdanowicz Date: Thu, 13 May 2021 14:42:07 +0000 Subject: [PATCH] Enable manager of imported host pointers Related-To: NEO-5126 Signed-off-by: Zbigniew Zdanowicz --- .../core/source/driver/driver_handle_imp.cpp | 2 +- .../fixtures/host_pointer_manager_fixture.h | 28 +++++++- .../driver/host_pointer_manager_tests.cpp | 66 ++++++++++++++----- .../debug_settings/debug_variables_base.inl | 2 +- 4 files changed, 76 insertions(+), 22 deletions(-) diff --git a/level_zero/core/source/driver/driver_handle_imp.cpp b/level_zero/core/source/driver/driver_handle_imp.cpp index 30038ddf81..e4f35255ca 100644 --- a/level_zero/core/source/driver/driver_handle_imp.cpp +++ b/level_zero/core/source/driver/driver_handle_imp.cpp @@ -200,7 +200,7 @@ ze_result_t DriverHandleImp::initialize(std::vector uuidTimestamp = static_cast(std::chrono::system_clock::now().time_since_epoch().count()); - if (NEO::DebugManager.flags.EnableHostPointerImport.get() == 1) { + if (NEO::DebugManager.flags.EnableHostPointerImport.get() != 0) { createHostPointerManager(); } diff --git a/level_zero/core/test/unit_tests/fixtures/host_pointer_manager_fixture.h b/level_zero/core/test/unit_tests/fixtures/host_pointer_manager_fixture.h index 2b212761e3..919452a658 100644 --- a/level_zero/core/test/unit_tests/fixtures/host_pointer_manager_fixture.h +++ b/level_zero/core/test/unit_tests/fixtures/host_pointer_manager_fixture.h @@ -38,11 +38,9 @@ struct HostPointerManagerFixure { neoDevice->getExecutionEnvironment()->rootDeviceEnvironments[0]->memoryOperationsInterface.get()); devices.push_back(std::unique_ptr(neoDevice)); - DebugManager.flags.EnableHostPointerImport.set(1); hostDriverHandle = std::make_unique(); hostDriverHandle->initialize(std::move(devices)); device = hostDriverHandle->devices[0]; - EXPECT_NE(nullptr, hostDriverHandle->hostPointerManager.get()); openHostPointerManager = static_cast(hostDriverHandle->hostPointerManager.get()); heapPointer = hostDriverHandle->getMemoryManager()->allocateSystemMemory(heapSize, MemoryConstants::pageSize); @@ -59,8 +57,8 @@ struct HostPointerManagerFixure { hostDriverHandle->getMemoryManager()->freeSystemMemory(heapPointer); } - DebugManagerStateRestore debugRestore; + DebugManagerStateRestore debugRestore; std::unique_ptr hostDriverHandle; L0::ult::HostPointerManager *openHostPointerManager = nullptr; @@ -74,5 +72,29 @@ struct HostPointerManagerFixure { size_t heapSize = 4 * MemoryConstants::pageSize; }; +struct ForceDisabledHostPointerManagerFixure : public HostPointerManagerFixure { + void SetUp() { + DebugManager.flags.EnableHostPointerImport.set(0); + + HostPointerManagerFixure::SetUp(); + } + + void TearDown() { + HostPointerManagerFixure::TearDown(); + } +}; + +struct ForceEnabledHostPointerManagerFixure : public HostPointerManagerFixure { + void SetUp() { + DebugManager.flags.EnableHostPointerImport.set(1); + + HostPointerManagerFixure::SetUp(); + } + + void TearDown() { + HostPointerManagerFixure::TearDown(); + } +}; + } // namespace ult } // namespace L0 diff --git a/level_zero/core/test/unit_tests/sources/driver/host_pointer_manager_tests.cpp b/level_zero/core/test/unit_tests/sources/driver/host_pointer_manager_tests.cpp index 096615395f..19ff02a85a 100644 --- a/level_zero/core/test/unit_tests/sources/driver/host_pointer_manager_tests.cpp +++ b/level_zero/core/test/unit_tests/sources/driver/host_pointer_manager_tests.cpp @@ -22,6 +22,8 @@ using HostPointerManagerTest = Test; TEST_F(HostPointerManagerTest, givenMultipleGraphicsAllocationWhenCopyingHostPointerDataThenCopyOnlyExistingAllocations) { + EXPECT_NE(nullptr, hostDriverHandle->hostPointerManager.get()); + HostPointerData originData(4); auto gfxAllocation = openHostPointerManager->createHostPointerAllocation(device->getRootDeviceIndex(), heapPointer, @@ -39,24 +41,9 @@ TEST_F(HostPointerManagerTest, hostDriverHandle->getMemoryManager()->freeGraphicsMemory(gfxAllocation); } -TEST_F(HostPointerManagerTest, givenNoHeapManagerThenReturnFeatureUnsupported) { - hostDriverHandle->hostPointerManager.reset(nullptr); - - void *testPtr = heapPointer; - auto result = hostDriverHandle->importExternalPointer(testPtr, MemoryConstants::pageSize); - EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); - - result = hostDriverHandle->getHostPointerBaseAddress(testPtr, nullptr); - EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); - - result = hostDriverHandle->releaseImportedPointer(testPtr); - EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); - - auto gfxAllocation = hostDriverHandle->getDriverSystemMemoryAllocation(testPtr, 1u, device->getRootDeviceIndex(), nullptr); - EXPECT_EQ(nullptr, gfxAllocation); -} - TEST_F(HostPointerManagerTest, givenHostPointerImportedWhenGettingExistingAllocationThenRetrieveProperGpuAddress) { + EXPECT_NE(nullptr, hostDriverHandle->hostPointerManager.get()); + void *testPtr = heapPointer; auto result = hostDriverHandle->importExternalPointer(testPtr, MemoryConstants::pageSize); @@ -87,6 +74,8 @@ TEST_F(HostPointerManagerTest, givenHostPointerImportedWhenGettingExistingAlloca } TEST_F(HostPointerManagerTest, givenPointerRegisteredWhenSvmAllocationExistsThenRetrieveSvmFirst) { + EXPECT_NE(nullptr, hostDriverHandle->hostPointerManager.get()); + void *testPtr = heapPointer; size_t usmSize = MemoryConstants::pageSize; @@ -452,5 +441,48 @@ TEST_F(HostPointerManagerTest, givenMisalignedPointerRegisteredWhenGettingRelati EXPECT_EQ(ZE_RESULT_SUCCESS, result); } +using ForceDisabledHostPointerManagerTest = Test; + +TEST_F(ForceDisabledHostPointerManagerTest, givenHostPointerManagerForceDisabledThenReturnFeatureUnsupported) { + EXPECT_EQ(nullptr, hostDriverHandle->hostPointerManager.get()); + + void *testPtr = heapPointer; + auto result = hostDriverHandle->importExternalPointer(testPtr, MemoryConstants::pageSize); + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); + + void *basePtr = nullptr; + result = hostDriverHandle->getHostPointerBaseAddress(testPtr, &basePtr); + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); + + uintptr_t gpuAddress = 0; + auto gfxAllocation = hostDriverHandle->getDriverSystemMemoryAllocation(testPtr, 1u, device->getRootDeviceIndex(), &gpuAddress); + EXPECT_EQ(nullptr, gfxAllocation); + + result = hostDriverHandle->releaseImportedPointer(testPtr); + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, result); +} + +using ForceEnabledHostPointerManagerTest = Test; + +TEST_F(ForceEnabledHostPointerManagerTest, givenHostPointerManagerForceEnabledThenReturnSuccess) { + EXPECT_NE(nullptr, hostDriverHandle->hostPointerManager.get()); + + void *testPtr = heapPointer; + auto result = hostDriverHandle->importExternalPointer(testPtr, MemoryConstants::pageSize); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + + void *basePtr = nullptr; + result = hostDriverHandle->getHostPointerBaseAddress(testPtr, &basePtr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_EQ(testPtr, basePtr); + + uintptr_t gpuAddress = 0; + auto gfxAllocation = hostDriverHandle->getDriverSystemMemoryAllocation(testPtr, 1u, device->getRootDeviceIndex(), &gpuAddress); + EXPECT_NE(nullptr, gfxAllocation); + + result = hostDriverHandle->releaseImportedPointer(testPtr); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); +} + } // namespace ult } // namespace L0 diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 85b8b0dccf..2087177778 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -88,7 +88,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, EnableHostUsmSupport, -1, "-1: default, 0: disab DECLARE_DEBUG_VARIABLE(int32_t, MediaVfeStateMaxSubSlices, -1, ">=0: Programs Media Vfe State Maximum Number of Dual-Subslices to given value ") DECLARE_DEBUG_VARIABLE(int32_t, EnableMockSourceLevelDebugger, 0, "Switches driver to mode with active debugger. Active modes: 1: opt-disabled, 2: opt-enabled") DECLARE_DEBUG_VARIABLE(int32_t, ForceBtpPrefetchMode, -1, "-1: default, 0: disable, 1: enable, Enables Btp prefetching") -DECLARE_DEBUG_VARIABLE(int32_t, EnableHostPointerImport, -1, "-1: default - disabled, 0: disabled, 1: enabled, Experimental implementation to import Host Pointer into L0") +DECLARE_DEBUG_VARIABLE(int32_t, EnableHostPointerImport, -1, "-1: default - enabled, 0: disabled, 1: enabled, L0 extension implementation to import host pointers") DECLARE_DEBUG_VARIABLE(int32_t, OverrideProfilingTimerResolution, -1, "-1: default - disabled, 0<=: Override deviceInfo.profilingTimerResolution") DECLARE_DEBUG_VARIABLE(int32_t, GpuScratchRegWriteAfterWalker, -1, "-1: disabled, x: add GPU scratch register write after x walker") DECLARE_DEBUG_VARIABLE(int32_t, GpuScratchRegWriteRegisterOffset, 0, "register offset for GPU scratch register write after walker")