feature: mechanism to assign sync queue id in ImplicitScaling mode

Related-To: NEO-8171

Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
Bartosz Dunajski 2024-03-25 14:54:48 +00:00 committed by Compute-Runtime-Automation
parent 72725e6ba9
commit 97ce15614b
6 changed files with 100 additions and 25 deletions

View File

@ -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

View File

@ -44,11 +44,12 @@ struct CommandListImp : public CommandList {
const std::vector<Event *> &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<NEO::InOrderExecInfo> inOrderExecInfo;
NEO::SynchronizedDispatchMode synchronizedDispatchMode = NEO::SynchronizedDispatchMode::disabled;
uint32_t syncDispatchQueueId = std::numeric_limits<uint32_t>::max();
~CommandListImp() override = default;

View File

@ -51,4 +51,12 @@ NEO::TagAllocatorBase *Device::getHostInOrderCounterAllocator() {
return getInOrderCounterAllocator<NEO::DeviceAllocNodeType<false>>(hostInOrderCounterAllocator, inOrderAllocatorMutex, *getNEODevice());
}
uint32_t Device::getNextSyncDispatchQueueId() {
auto newValue = syncDispatchQueueIdAllocator.fetch_add(1);
UNRECOVERABLE_IF(newValue == (std::numeric_limits<uint32_t>::max() - 1));
return newValue;
}
} // namespace L0

View File

@ -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<NEO::TagAllocatorBase> deviceInOrderCounterAllocator;
std::unique_ptr<NEO::TagAllocatorBase> hostInOrderCounterAllocator;
std::mutex inOrderAllocatorMutex;
std::atomic<uint32_t> syncDispatchQueueIdAllocator = 0;
bool implicitScalingCapable = false;
};

View File

@ -106,6 +106,7 @@ struct WhiteBox<::L0::CommandListCoreFamily<gfxCoreFamily>>
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<L0::CommandListCoreFamilyImmediate<gfxCoreFamily>>
using BaseClass::signalAllEventPackets;
using BaseClass::stateBaseAddressTracking;
using BaseClass::stateComputeModeTracking;
using BaseClass::syncDispatchQueueId;
using BaseClass::synchronizedDispatchMode;
using BaseClass::synchronizeInOrderExecution;
using BaseClass::updateInOrderExecInfo;

View File

@ -290,30 +290,6 @@ HWTEST2_F(InOrderCmdListTests, givenCmdListsWhenDispatchingThenUseInternalTaskCo
}
}
HWTEST2_F(InOrderCmdListTests, givenDebugFlagSetWhenCreatingCmdListThenEnableSynchronizedDispatch, IsAtLeastSkl) {
auto immCmdList = createImmCmdList<gfxCoreFamily>();
auto regularCmdList = createRegularCmdList<gfxCoreFamily>(false);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode);
NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(0);
immCmdList = createImmCmdList<gfxCoreFamily>();
regularCmdList = createRegularCmdList<gfxCoreFamily>(false);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode);
NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1);
immCmdList = createImmCmdList<gfxCoreFamily>();
regularCmdList = createRegularCmdList<gfxCoreFamily>(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 <GFXCORE_FAMILY gfxCoreFamily>
DestroyableZeUniquePtr<WhiteBox<L0::CommandListCoreFamily<gfxCoreFamily>>> createMultiTileRegularCmdList(bool copyOnly) {
auto cmdList = createRegularCmdList<gfxCoreFamily>(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<gfxCoreFamily>(false);
auto regularCmdList1 = createRegularCmdList<gfxCoreFamily>(false);
auto immCmdList0 = createImmCmdList<gfxCoreFamily>();
auto immCmdList1 = createImmCmdList<gfxCoreFamily>();
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), regularCmdList0->syncDispatchQueueId);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList0->synchronizedDispatchMode);
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), regularCmdList1->syncDispatchQueueId);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList1->synchronizedDispatchMode);
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), immCmdList0->syncDispatchQueueId);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList0->synchronizedDispatchMode);
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), immCmdList1->syncDispatchQueueId);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList1->synchronizedDispatchMode);
}
HWTEST2_F(MultiTileSynchronizedDispatchTests, givenDebugFlagSetWhenCreatingCmdListThenEnableSynchronizedDispatch, IsAtLeastSkl) {
auto immCmdList = createMultiTileImmCmdList<gfxCoreFamily>();
auto regularCmdList = createMultiTileRegularCmdList<gfxCoreFamily>(false);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode);
NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(0);
immCmdList = createMultiTileImmCmdList<gfxCoreFamily>();
regularCmdList = createMultiTileRegularCmdList<gfxCoreFamily>(false);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, immCmdList->synchronizedDispatchMode);
EXPECT_EQ(NEO::SynchronizedDispatchMode::disabled, regularCmdList->synchronizedDispatchMode);
NEO::debugManager.flags.ForceSynchronizedDispatchMode.set(1);
immCmdList = createMultiTileImmCmdList<gfxCoreFamily>();
regularCmdList = createMultiTileRegularCmdList<gfxCoreFamily>(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<gfxCoreFamily>(false);
auto regularCmdList1 = createMultiTileRegularCmdList<gfxCoreFamily>(false);
auto immCmdList0 = createMultiTileImmCmdList<gfxCoreFamily>();
auto immCmdList1 = createMultiTileImmCmdList<gfxCoreFamily>();
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