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:
parent
72725e6ba9
commit
97ce15614b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue