From 97ce15614bcf260cff6d80f841e7433e1006adee Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Mon, 25 Mar 2024 14:54:48 +0000 Subject: [PATCH] feature: mechanism to assign sync queue id in ImplicitScaling mode Related-To: NEO-8171 Signed-off-by: Bartosz Dunajski --- .../core/source/cmdlist/cmdlist_imp.cpp | 9 ++ level_zero/core/source/cmdlist/cmdlist_imp.h | 3 +- level_zero/core/source/device/device.cpp | 8 ++ level_zero/core/source/device/device.h | 2 + .../core/test/unit_tests/mocks/mock_cmdlist.h | 2 + .../sources/cmdlist/test_in_order_cmdlist.cpp | 101 +++++++++++++----- 6 files changed, 100 insertions(+), 25 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_imp.cpp b/level_zero/core/source/cmdlist/cmdlist_imp.cpp index 9659a8752a..b0d25bb4f2 100644 --- a/level_zero/core/source/cmdlist/cmdlist_imp.cpp +++ b/level_zero/core/source/cmdlist/cmdlist_imp.cpp @@ -298,4 +298,13 @@ void CommandListImp::addRegularCmdListSubmissionCounter() { } } +void CommandListImp::enableSynchronizedDispatch(NEO::SynchronizedDispatchMode mode) { + if (!device->isImplicitScalingCapable()) { + return; + } + + this->synchronizedDispatchMode = mode; + this->syncDispatchQueueId = device->getNextSyncDispatchQueueId(); +} + } // namespace L0 diff --git a/level_zero/core/source/cmdlist/cmdlist_imp.h b/level_zero/core/source/cmdlist/cmdlist_imp.h index e132689c40..740e72ffb7 100644 --- a/level_zero/core/source/cmdlist/cmdlist_imp.h +++ b/level_zero/core/source/cmdlist/cmdlist_imp.h @@ -44,11 +44,12 @@ struct CommandListImp : public CommandList { const std::vector &peekMappedEventList() { return mappedTsEventList; } void addRegularCmdListSubmissionCounter(); virtual void patchInOrderCmds() = 0; - void enableSynchronizedDispatch(NEO::SynchronizedDispatchMode mode) { synchronizedDispatchMode = mode; } + void enableSynchronizedDispatch(NEO::SynchronizedDispatchMode mode); protected: std::shared_ptr inOrderExecInfo; NEO::SynchronizedDispatchMode synchronizedDispatchMode = NEO::SynchronizedDispatchMode::disabled; + uint32_t syncDispatchQueueId = std::numeric_limits::max(); ~CommandListImp() override = default; diff --git a/level_zero/core/source/device/device.cpp b/level_zero/core/source/device/device.cpp index eda06a9e20..c5efb5238e 100644 --- a/level_zero/core/source/device/device.cpp +++ b/level_zero/core/source/device/device.cpp @@ -51,4 +51,12 @@ NEO::TagAllocatorBase *Device::getHostInOrderCounterAllocator() { return getInOrderCounterAllocator>(hostInOrderCounterAllocator, inOrderAllocatorMutex, *getNEODevice()); } +uint32_t Device::getNextSyncDispatchQueueId() { + auto newValue = syncDispatchQueueIdAllocator.fetch_add(1); + + UNRECOVERABLE_IF(newValue == (std::numeric_limits::max() - 1)); + + return newValue; +} + } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/source/device/device.h b/level_zero/core/source/device/device.h index 5705ec8a21..0ed1f6f5aa 100644 --- a/level_zero/core/source/device/device.h +++ b/level_zero/core/source/device/device.h @@ -151,12 +151,14 @@ struct Device : _ze_device_handle_t { virtual uint32_t getEventMaxKernelCount() const = 0; NEO::TagAllocatorBase *getDeviceInOrderCounterAllocator(); NEO::TagAllocatorBase *getHostInOrderCounterAllocator(); + uint32_t getNextSyncDispatchQueueId(); protected: NEO::Device *neoDevice = nullptr; std::unique_ptr deviceInOrderCounterAllocator; std::unique_ptr hostInOrderCounterAllocator; std::mutex inOrderAllocatorMutex; + std::atomic syncDispatchQueueIdAllocator = 0; bool implicitScalingCapable = false; }; diff --git a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h index 05974cbd11..86779e966a 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h +++ b/level_zero/core/test/unit_tests/mocks/mock_cmdlist.h @@ -106,6 +106,7 @@ struct WhiteBox<::L0::CommandListCoreFamily> using BaseClass::signalAllEventPackets; using BaseClass::stateBaseAddressTracking; using BaseClass::stateComputeModeTracking; + using BaseClass::syncDispatchQueueId; using BaseClass::synchronizedDispatchMode; using BaseClass::unifiedMemoryControls; using BaseClass::updateInOrderExecInfo; @@ -216,6 +217,7 @@ struct WhiteBox> using BaseClass::signalAllEventPackets; using BaseClass::stateBaseAddressTracking; using BaseClass::stateComputeModeTracking; + using BaseClass::syncDispatchQueueId; using BaseClass::synchronizedDispatchMode; using BaseClass::synchronizeInOrderExecution; using BaseClass::updateInOrderExecInfo; diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp index 8cefb3ec69..66357e7a80 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist.cpp @@ -290,30 +290,6 @@ HWTEST2_F(InOrderCmdListTests, givenCmdListsWhenDispatchingThenUseInternalTaskCo } } -HWTEST2_F(InOrderCmdListTests, givenDebugFlagSetWhenCreatingCmdListThenEnableSynchronizedDispatch, IsAtLeastSkl) { - auto immCmdList = createImmCmdList(); - auto regularCmdList = createRegularCmdList(false); - - EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode); - EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode); - - NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(0); - - immCmdList = createImmCmdList(); - regularCmdList = createRegularCmdList(false); - - EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode); - EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode); - - NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1); - - immCmdList = createImmCmdList(); - regularCmdList = createRegularCmdList(false); - - EXPECT_EQ(NEO::SynchronizedDispatchMode::full, immCmdList->synchronizedDispatchMode); - EXPECT_EQ(NEO::SynchronizedDispatchMode::full, regularCmdList->synchronizedDispatchMode); -} - HWTEST2_F(InOrderCmdListTests, givenDebugFlagSetWhenEventHostSyncCalledThenCallWaitUserFence, IsAtLeastXeHpCore) { NEO::debugManager.flags.WaitForUserFenceOnEventHostSynchronize.set(1); @@ -4142,6 +4118,15 @@ struct MultiTileInOrderCmdListTests : public InOrderCmdListTests { return cmdList; } + template + DestroyableZeUniquePtr>> createMultiTileRegularCmdList(bool copyOnly) { + auto cmdList = createRegularCmdList(copyOnly); + + cmdList->partitionCount = partitionCount; + + return cmdList; + } + const uint32_t partitionCount = 2; }; @@ -5881,5 +5866,73 @@ HWTEST2_F(InOrderCmdListTests, givenInOrderModeAndNoopWaitEventsAllowedWhenEvent EXPECT_EQ(0, memCmpRet); } +using SynchronizedDispatchTests = InOrderCmdListFixture; +using MultiTileSynchronizedDispatchTests = MultiTileInOrderCmdListTests; + +HWTEST2_F(SynchronizedDispatchTests, givenSingleTileSyncDispatchQueueWhenCreatingThenDontAssignQueueId, IsAtLeastSkl) { + NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1); + + auto regularCmdList0 = createRegularCmdList(false); + auto regularCmdList1 = createRegularCmdList(false); + auto immCmdList0 = createImmCmdList(); + auto immCmdList1 = createImmCmdList(); + + EXPECT_EQ(std::numeric_limits::max(), regularCmdList0->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList0->synchronizedDispatchMode); + + EXPECT_EQ(std::numeric_limits::max(), regularCmdList1->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList1->synchronizedDispatchMode); + + EXPECT_EQ(std::numeric_limits::max(), immCmdList0->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList0->synchronizedDispatchMode); + + EXPECT_EQ(std::numeric_limits::max(), immCmdList1->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList1->synchronizedDispatchMode); +} + +HWTEST2_F(MultiTileSynchronizedDispatchTests, givenDebugFlagSetWhenCreatingCmdListThenEnableSynchronizedDispatch, IsAtLeastSkl) { + auto immCmdList = createMultiTileImmCmdList(); + auto regularCmdList = createMultiTileRegularCmdList(false); + + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode); + + NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(0); + + immCmdList = createMultiTileImmCmdList(); + regularCmdList = createMultiTileRegularCmdList(false); + + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode); + EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode); + + NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1); + + immCmdList = createMultiTileImmCmdList(); + regularCmdList = createMultiTileRegularCmdList(false); + + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, immCmdList->synchronizedDispatchMode); + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, regularCmdList->synchronizedDispatchMode); +} + +HWTEST2_F(MultiTileSynchronizedDispatchTests, givenMultiTileSyncDispatchQueueWhenCreatingThenAssignQueueId, IsAtLeastSkl) { + NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1); + + auto regularCmdList0 = createMultiTileRegularCmdList(false); + auto regularCmdList1 = createMultiTileRegularCmdList(false); + auto immCmdList0 = createMultiTileImmCmdList(); + auto immCmdList1 = createMultiTileImmCmdList(); + + EXPECT_EQ(0u, regularCmdList0->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, regularCmdList0->synchronizedDispatchMode); + + EXPECT_EQ(1u, regularCmdList1->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, regularCmdList1->synchronizedDispatchMode); + + EXPECT_EQ(2u, immCmdList0->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, immCmdList0->synchronizedDispatchMode); + + EXPECT_EQ(3u, immCmdList1->syncDispatchQueueId); + EXPECT_EQ(NEO::SynchronizedDispatchMode::full, immCmdList1->synchronizedDispatchMode); +} } // namespace ult } // namespace L0