diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index 632bcdf5a8..afe0e6a835 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -2866,6 +2866,9 @@ void CommandListCoreFamily::appendSdiInOrderCounterSignalling(uin template void CommandListCoreFamily::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::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::appendSignalInOrderDependencyCounter( appendSdiInOrderCounterSignalling(inOrderExecInfo->getBaseHostGpuAddress(), signalValue, copyOffloadOperation); } + if (signalEvent && signalEvent->getInOrderIncrementValue() > 0) { + NEO::EncodeAtomic::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::encode(*cmdStream); } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp index 43df027b6b..1a73948291 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_in_order_cmdlist_1.cpp @@ -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(std::numeric_limits::max()) + 1234; + constexpr uint64_t counterValue = incValue * 2; + + auto devAddress = reinterpret_cast(allocDeviceMem(sizeof(uint64_t))); + + auto immCmdList = createImmCmdList(); + + 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(cmdList.begin(), cmdList.end()); + ASSERT_NE(cmdList.end(), it); + + auto miAtomic = genCmdCast(*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::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;