From db82df80e7f99b28262a4c9c92f17482796bd208 Mon Sep 17 00:00:00 2001 From: Aravind Gopalakrishnan Date: Tue, 1 Jun 2021 01:51:11 +0000 Subject: [PATCH] Use MiStoreDataImm for event signals Signed-off-by: Aravind Gopalakrishnan --- level_zero/core/source/cmdlist/cmdlist_hw.inl | 47 ++++++++++++++--- .../sources/cmdlist/test_cmdlist_1.cpp | 2 +- .../test_cmdlist_append_signal_event.cpp | 52 ++----------------- 3 files changed, 44 insertions(+), 57 deletions(-) diff --git a/level_zero/core/source/cmdlist/cmdlist_hw.inl b/level_zero/core/source/cmdlist/cmdlist_hw.inl index e40bc19e6b..28f0776985 100644 --- a/level_zero/core/source/cmdlist/cmdlist_hw.inl +++ b/level_zero/core/source/cmdlist/cmdlist_hw.inl @@ -1450,7 +1450,26 @@ void CommandListCoreFamily::appendSignalEventPostWalker(ze_event_ if (event->isEventTimestampFlagSet()) { appendEventForProfiling(hEvent, false); } else { - CommandListCoreFamily::appendSignalEvent(hEvent); + using POST_SYNC_OPERATION = typename GfxFamily::PIPE_CONTROL::POST_SYNC_OPERATION; + using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; + auto event = Event::fromHandle(hEvent); + + commandContainer.addToResidencyContainer(&event->getAllocation(this->device)); + uint64_t baseAddr = event->getGpuAddress(this->device); + + if (isCopyOnly()) { + NEO::MiFlushArgs args; + args.commandWithPostSync = true; + NEO::EncodeMiFlushDW::programMiFlushDw(*commandContainer.getCommandStream(), baseAddr, Event::STATE_SIGNALED, args); + } else { + NEO::PipeControlArgs args; + args.dcFlushEnable = (!event->signalScope) ? false : true; + NEO::MemorySynchronizationCommands::addPipeControlAndProgramPostSyncOperation( + *commandContainer.getCommandStream(), POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA, + baseAddr, Event::STATE_SIGNALED, + commandContainer.getDevice()->getHardwareInfo(), + args); + } } } @@ -1560,6 +1579,7 @@ ze_result_t CommandListCoreFamily::appendSignalEvent(ze_event_han using POST_SYNC_OPERATION = typename GfxFamily::PIPE_CONTROL::POST_SYNC_OPERATION; using GfxFamily = typename NEO::GfxFamilyMapper::GfxFamily; auto event = Event::fromHandle(hEvent); + bool applyScope = false; commandContainer.addToResidencyContainer(&event->getAllocation(this->device)); uint64_t baseAddr = event->getGpuAddress(this->device); @@ -1574,12 +1594,23 @@ ze_result_t CommandListCoreFamily::appendSignalEvent(ze_event_han NEO::EncodeMiFlushDW::programMiFlushDw(*commandContainer.getCommandStream(), ptrOffset(baseAddr, eventSignalOffset), Event::STATE_SIGNALED, args); } else { NEO::PipeControlArgs args; - args.dcFlushEnable = (!event->signalScope) ? false : true; - NEO::MemorySynchronizationCommands::addPipeControlAndProgramPostSyncOperation( - *commandContainer.getCommandStream(), POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA, - ptrOffset(baseAddr, eventSignalOffset), Event::STATE_SIGNALED, - commandContainer.getDevice()->getHardwareInfo(), - args); + applyScope = (!event->signalScope) ? false : true; + args.dcFlushEnable = applyScope; + if (applyScope || event->isEventTimestampFlagSet()) { + NEO::MemorySynchronizationCommands::addPipeControlAndProgramPostSyncOperation( + *commandContainer.getCommandStream(), POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA, + ptrOffset(baseAddr, eventSignalOffset), Event::STATE_SIGNALED, + commandContainer.getDevice()->getHardwareInfo(), + args); + } else { + using MI_STORE_DATA_IMM = typename GfxFamily::MI_STORE_DATA_IMM; + MI_STORE_DATA_IMM storeDataImmediate = GfxFamily::cmdInitStoreDataImm; + storeDataImmediate.setStoreQword(false); + storeDataImmediate.setDwordLength(MI_STORE_DATA_IMM::DWORD_LENGTH::DWORD_LENGTH_STORE_QWORD); + storeDataImmediate.setDataDword0(Event::STATE_SIGNALED); + auto buffer = commandContainer.getCommandStream()->template getSpaceForCmd(); + *buffer = storeDataImmediate; + } } return ZE_RESULT_SUCCESS; } @@ -1752,7 +1783,7 @@ ze_result_t CommandListCoreFamily::appendWriteGlobalTimestamp( } if (hSignalEvent) { - CommandListCoreFamily::appendSignalEvent(hSignalEvent); + CommandListCoreFamily::appendSignalEventPostWalker(hSignalEvent); } auto allocationStruct = getAlignedAllocation(this->device, dstptr, sizeof(uint64_t)); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp index 630c450e53..15b7f116aa 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_1.cpp @@ -1515,7 +1515,7 @@ HWTEST_F(CommandListCreate, givenCommandListWithCopyOnlyWhenAppendSignalEventThe EXPECT_NE(cmdList.end(), itor); } -HWTEST_F(CommandListCreate, givenCommandListWhenAppendSignalEventThenPipeControlIsProgrammed) { +HWTEST_F(CommandListCreate, givenCommandListWhenAppendSignalEventWithScopeThenPipeControlIsProgrammed) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; ze_result_t returnValue; std::unique_ptr commandList(CommandList::create(productFamily, device, NEO::EngineGroupType::RenderCompute, returnValue)); diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_signal_event.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_signal_event.cpp index 069bfa28a7..082c872e88 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_signal_event.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_append_signal_event.cpp @@ -20,9 +20,10 @@ namespace L0 { namespace ult { using CommandListAppendSignalEvent = Test; -HWTEST_F(CommandListAppendSignalEvent, WhenAppendingSignalEventThenPipeControlIsGenerated) { +HWTEST_F(CommandListAppendSignalEvent, WhenAppendingSignalEventWithoutScopeThenMiStoreImmIsGenerated) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION; + using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM; auto usedSpaceBefore = commandList->commandContainer.getCommandStream()->getUsed(); auto result = commandList->appendSignalEvent(event->toHandle()); @@ -35,22 +36,8 @@ HWTEST_F(CommandListAppendSignalEvent, WhenAppendingSignalEventThenPipeControlIs ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer( cmdList, ptrOffset(commandList->commandContainer.getCommandStream()->getCpuBase(), 0), usedSpaceAfter)); - // Find a PC w/ a WriteImmediateData and CS stall - auto itorPC = findAll(cmdList.begin(), cmdList.end()); - ASSERT_NE(0u, itorPC.size()); - bool postSyncFound = false; - for (auto it : itorPC) { - auto cmd = genCmdCast(*it); - if (cmd->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { - EXPECT_TRUE(cmd->getCommandStreamerStallEnable()); - EXPECT_EQ(cmd->getImmediateData(), Event::STATE_SIGNALED); - auto gpuAddress = event->getGpuAddress(device); - EXPECT_EQ(cmd->getAddressHigh(), gpuAddress >> 32u); - EXPECT_EQ(cmd->getAddress(), uint32_t(gpuAddress)); - postSyncFound = true; - } - } - ASSERT_TRUE(postSyncFound); + auto itor = findAll(cmdList.begin(), cmdList.end()); + ASSERT_NE(0u, itor.size()); } HWTEST_F(CommandListAppendSignalEvent, givenCmdlistWhenAppendingSignalEventThenEventPoolGraphicsAllocationIsAddedToResidencyContainer) { @@ -66,37 +53,6 @@ HWTEST_F(CommandListAppendSignalEvent, givenCmdlistWhenAppendingSignalEventThenE } } -HWTEST_F(CommandListAppendSignalEvent, givenEventWithScopeFlagNoneWhenAppendingSignalEventThenPipeControlHasNoDcFlush) { - using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; - using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION; - - auto usedSpaceBefore = commandList->commandContainer.getCommandStream()->getUsed(); - auto result = commandList->appendSignalEvent(event->toHandle()); - ASSERT_EQ(ZE_RESULT_SUCCESS, result); - - auto usedSpaceAfter = commandList->commandContainer.getCommandStream()->getUsed(); - ASSERT_GT(usedSpaceAfter, usedSpaceBefore); - - GenCmdList cmdList; - ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, - ptrOffset(commandList->commandContainer.getCommandStream()->getCpuBase(), 0), - usedSpaceAfter)); - - auto itorPC = findAll(cmdList.begin(), cmdList.end()); - ASSERT_NE(0u, itorPC.size()); - bool postSyncFound = false; - for (auto it : itorPC) { - auto cmd = genCmdCast(*it); - if (cmd->getPostSyncOperation() == POST_SYNC_OPERATION::POST_SYNC_OPERATION_WRITE_IMMEDIATE_DATA) { - EXPECT_EQ(cmd->getImmediateData(), Event::STATE_SIGNALED); - EXPECT_TRUE(cmd->getCommandStreamerStallEnable()); - EXPECT_FALSE(cmd->getDcFlushEnable()); - postSyncFound = true; - } - } - ASSERT_TRUE(postSyncFound); -} - HWTEST_F(CommandListAppendSignalEvent, givenEventWithScopeFlagDeviceWhenAppendingSignalEventThenPipeControlHasNoDcFlush) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; using POST_SYNC_OPERATION = typename PIPE_CONTROL::POST_SYNC_OPERATION;