mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 21:18:24 +08:00
feature: atomic signaling for combined CB Event
Related-To: NEO-13971 Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
dc5a356161
commit
904d90df90
@@ -2866,6 +2866,9 @@ void CommandListCoreFamily<gfxCoreFamily>::appendSdiInOrderCounterSignalling(uin
|
||||
|
||||
template <GFXCORE_FAMILY gfxCoreFamily>
|
||||
void CommandListCoreFamily<gfxCoreFamily>::appendSignalInOrderDependencyCounter(Event *signalEvent, bool copyOffloadOperation, bool stall) {
|
||||
using ATOMIC_OPCODES = typename GfxFamily::MI_ATOMIC::ATOMIC_OPCODES;
|
||||
using DATA_SIZE = typename GfxFamily::MI_ATOMIC::DATA_SIZE;
|
||||
|
||||
uint64_t deviceAllocGpuVa = inOrderExecInfo->getBaseDeviceAddress();
|
||||
uint64_t signalValue = inOrderExecInfo->getCounterValue() + getInOrderIncrementValue();
|
||||
|
||||
@@ -2885,9 +2888,6 @@ void CommandListCoreFamily<gfxCoreFamily>::appendSignalInOrderDependencyCounter(
|
||||
args);
|
||||
|
||||
} else if (this->inOrderAtomicSignalingEnabled) {
|
||||
using ATOMIC_OPCODES = typename GfxFamily::MI_ATOMIC::ATOMIC_OPCODES;
|
||||
using DATA_SIZE = typename GfxFamily::MI_ATOMIC::DATA_SIZE;
|
||||
|
||||
ATOMIC_OPCODES opcode = ATOMIC_OPCODES::ATOMIC_8B_INCREMENT;
|
||||
uint64_t operand1Data = 0;
|
||||
|
||||
@@ -2907,6 +2907,11 @@ void CommandListCoreFamily<gfxCoreFamily>::appendSignalInOrderDependencyCounter(
|
||||
appendSdiInOrderCounterSignalling(inOrderExecInfo->getBaseHostGpuAddress(), signalValue, copyOffloadOperation);
|
||||
}
|
||||
|
||||
if (signalEvent && signalEvent->getInOrderIncrementValue() > 0) {
|
||||
NEO::EncodeAtomic<GfxFamily>::programMiAtomic(*cmdStream, signalEvent->getInOrderExecInfo()->getBaseDeviceAddress(), ATOMIC_OPCODES::ATOMIC_8B_ADD,
|
||||
DATA_SIZE::DATA_SIZE_QWORD, 0, 0, signalEvent->getInOrderIncrementValue(), 0);
|
||||
}
|
||||
|
||||
if ((NEO::debugManager.flags.ProgramUserInterruptOnResolvedDependency.get() == 1 || copyOffloadOperation) && signalEvent && signalEvent->isInterruptModeEnabled()) {
|
||||
NEO::EnodeUserInterrupt<GfxFamily>::encode(*cmdStream);
|
||||
}
|
||||
|
||||
@@ -5374,6 +5374,44 @@ HWTEST2_F(InOrderCmdListTests, givenExternalSyncStorageWhenCallingAppendThenDont
|
||||
context->freeMem(devAddress);
|
||||
}
|
||||
|
||||
HWTEST2_F(InOrderCmdListTests, givenExternalSyncStorageWhenCallingAppendSignalInOrderDependencyCounterThenProgramAtomicOperation, MatchAny) {
|
||||
using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
|
||||
using ATOMIC_OPCODES = typename FamilyType::MI_ATOMIC::ATOMIC_OPCODES;
|
||||
using DATA_SIZE = typename FamilyType::MI_ATOMIC::DATA_SIZE;
|
||||
|
||||
constexpr uint64_t incValue = static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()) + 1234;
|
||||
constexpr uint64_t counterValue = incValue * 2;
|
||||
|
||||
auto devAddress = reinterpret_cast<uint64_t *>(allocDeviceMem(sizeof(uint64_t)));
|
||||
|
||||
auto immCmdList = createImmCmdList<gfxCoreFamily>();
|
||||
|
||||
ze_event_handle_t handle = nullptr;
|
||||
createExternalSyncStorageEvent(counterValue, incValue, devAddress, handle);
|
||||
|
||||
auto cmdStream = immCmdList->getCmdContainer().getCommandStream();
|
||||
immCmdList->inOrderAtomicSignalingEnabled = false;
|
||||
immCmdList->appendSignalInOrderDependencyCounter(Event::fromHandle(handle), false, false);
|
||||
|
||||
GenCmdList cmdList;
|
||||
ASSERT_TRUE(FamilyType::Parse::parseCommandBuffer(cmdList, cmdStream->getCpuBase(), cmdStream->getUsed()));
|
||||
|
||||
auto it = find<MI_ATOMIC *>(cmdList.begin(), cmdList.end());
|
||||
ASSERT_NE(cmdList.end(), it);
|
||||
|
||||
auto miAtomic = genCmdCast<MI_ATOMIC *>(*it);
|
||||
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_8B_ADD, miAtomic->getAtomicOpcode());
|
||||
EXPECT_EQ(DATA_SIZE::DATA_SIZE_QWORD, miAtomic->getDataSize());
|
||||
EXPECT_EQ(getLowPart(incValue), miAtomic->getOperand1DataDword0());
|
||||
EXPECT_EQ(getHighPart(incValue), miAtomic->getOperand1DataDword1());
|
||||
|
||||
EXPECT_EQ(castToUint64(devAddress), NEO::UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomic));
|
||||
|
||||
zeEventDestroy(handle);
|
||||
|
||||
context->freeMem(devAddress);
|
||||
}
|
||||
|
||||
HWTEST_F(InOrderCmdListTests, givenTimestmapEnabledWhenCreatingStandaloneCbEventThenSetCorrectPacketSize) {
|
||||
zex_counter_based_event_desc_t counterBasedDesc = {ZEX_STRUCTURE_COUNTER_BASED_EVENT_DESC}; // NOLINT(clang-analyzer-optin.core.EnumCastOutOfRange), NEO-12901
|
||||
counterBasedDesc.flags = ZEX_COUNTER_BASED_EVENT_FLAG_KERNEL_TIMESTAMP;
|
||||
|
||||
Reference in New Issue
Block a user