Skip to content

Commit a95ab1d

Browse files
Share pipeline select state updates between regular and immediate command lists
Related-To: NEO-5019 Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
1 parent 842003f commit a95ab1d

File tree

14 files changed

+370
-14
lines changed

14 files changed

+370
-14
lines changed

level_zero/core/source/cmdlist/cmdlist_hw_immediate.inl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ void CommandListCoreFamilyImmediate<gfxCoreFamily>::updateDispatchFlagsWithRequi
4848
dispatchFlags.numGrfRequired = (requiredStateComputeMode.largeGrfMode.value == 1) ? GrfConfig::LargeGrfNumber
4949
: GrfConfig::DefaultGrfNumber;
5050
dispatchFlags.threadArbitrationPolicy = requiredStateComputeMode.threadArbitrationPolicy.value;
51+
52+
const auto &requiredPipelineSelect = this->requiredStreamState.pipelineSelect;
53+
dispatchFlags.pipelineSelectArgs.systolicPipelineSelectMode = requiredPipelineSelect.systolicMode.value != -1
54+
? !!requiredPipelineSelect.systolicMode.value
55+
: false;
5156
}
5257

5358
template <GFXCORE_FAMILY gfxCoreFamily>

level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ struct CmdListPipelineSelectStateFixture : public ModuleMutableCommandListFixtur
9292
template <typename FamilyType>
9393
void testBody();
9494

95+
template <typename FamilyType>
96+
void testBodyShareStateRegularImmediate();
97+
98+
template <typename FamilyType>
99+
void testBodyShareStateImmediateRegular();
100+
95101
DebugManagerStateRestore restorer;
96102
};
97103

level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.inl

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/test/common/helpers/unit_test_helper.h"
9+
#include "shared/test/common/libult/ult_command_stream_receiver.h"
910

1011
#include "level_zero/core/test/unit_tests/fixtures/cmdlist_fixture.h"
1112

@@ -365,5 +366,215 @@ void CmdListPipelineSelectStateFixture::testBody() {
365366
}
366367
}
367368

369+
template <typename FamilyType>
370+
void CmdListPipelineSelectStateFixture::testBodyShareStateRegularImmediate() {
371+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
372+
373+
const ze_group_count_t groupCount{1, 1, 1};
374+
CmdListKernelLaunchParams launchParams = {};
375+
376+
void *currentBuffer = nullptr;
377+
378+
auto &regularCmdlistRequiredState = commandList->getRequiredStreamState();
379+
auto &regularCmdListFinalState = commandList->getFinalStreamState();
380+
auto &csrState = commandQueue->csr->getStreamProperties();
381+
382+
auto commandListHandle = commandList->toHandle();
383+
384+
auto &regularCommandListStream = *commandList->commandContainer.getCommandStream();
385+
auto &cmdQueueStream = commandQueue->commandStream;
386+
387+
GenCmdList cmdList;
388+
std::vector<GenCmdList::iterator> pipelineSelectList;
389+
size_t sizeBefore = 0;
390+
size_t sizeAfter = 0;
391+
auto result = ZE_RESULT_SUCCESS;
392+
393+
mockKernelImmData->kernelDescriptor->kernelAttributes.flags.usesSystolicPipelineSelectMode = 1;
394+
395+
sizeBefore = regularCommandListStream.getUsed();
396+
result = commandList->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr, launchParams);
397+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
398+
sizeAfter = regularCommandListStream.getUsed();
399+
400+
EXPECT_EQ(1, regularCmdlistRequiredState.pipelineSelect.systolicMode.value);
401+
EXPECT_EQ(1, regularCmdListFinalState.pipelineSelect.systolicMode.value);
402+
403+
currentBuffer = ptrOffset(regularCommandListStream.getCpuBase(), sizeBefore);
404+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
405+
currentBuffer,
406+
(sizeAfter - sizeBefore)));
407+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
408+
EXPECT_EQ(0u, pipelineSelectList.size());
409+
410+
cmdList.clear();
411+
pipelineSelectList.clear();
412+
commandList->close();
413+
414+
sizeBefore = cmdQueueStream.getUsed();
415+
result = commandQueue->executeCommandLists(1, &commandListHandle, nullptr, false);
416+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
417+
sizeAfter = cmdQueueStream.getUsed();
418+
419+
EXPECT_EQ(1, csrState.pipelineSelect.systolicMode.value);
420+
421+
currentBuffer = ptrOffset(cmdQueueStream.getCpuBase(), sizeBefore);
422+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
423+
currentBuffer,
424+
(sizeAfter - sizeBefore)));
425+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
426+
ASSERT_EQ(1u, pipelineSelectList.size());
427+
428+
auto pipelineSelectCmd = genCmdCast<PIPELINE_SELECT *>(*pipelineSelectList[0]);
429+
EXPECT_TRUE(NEO::UnitTestHelper<FamilyType>::getSystolicFlagValueFromPipelineSelectCommand(*pipelineSelectCmd));
430+
431+
cmdList.clear();
432+
pipelineSelectList.clear();
433+
434+
auto &immediateCmdListStream = *commandListImmediate->commandContainer.getCommandStream();
435+
EXPECT_EQ(commandQueue->csr, commandListImmediate->csr);
436+
437+
auto &ultCsr = neoDevice->getUltCommandStreamReceiver<FamilyType>();
438+
auto &csrStream = ultCsr.commandStream;
439+
440+
size_t csrUsedBefore = csrStream.getUsed();
441+
sizeBefore = immediateCmdListStream.getUsed();
442+
result = commandListImmediate->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr, launchParams);
443+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
444+
sizeAfter = immediateCmdListStream.getUsed();
445+
size_t csrUsedAfter = csrStream.getUsed();
446+
447+
auto &immediateCmdListRequiredState = commandListImmediate->getRequiredStreamState();
448+
auto &immediateCmdListFinalState = commandListImmediate->getFinalStreamState();
449+
450+
EXPECT_EQ(1, immediateCmdListRequiredState.pipelineSelect.systolicMode.value);
451+
EXPECT_EQ(1, immediateCmdListFinalState.pipelineSelect.systolicMode.value);
452+
453+
currentBuffer = ptrOffset(immediateCmdListStream.getCpuBase(), sizeBefore);
454+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
455+
currentBuffer,
456+
(sizeAfter - sizeBefore)));
457+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
458+
EXPECT_EQ(0u, pipelineSelectList.size());
459+
460+
cmdList.clear();
461+
pipelineSelectList.clear();
462+
463+
EXPECT_EQ(1, csrState.pipelineSelect.systolicMode.value);
464+
465+
currentBuffer = ptrOffset(csrStream.getCpuBase(), csrUsedBefore);
466+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
467+
currentBuffer,
468+
(csrUsedAfter - csrUsedBefore)));
469+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
470+
EXPECT_EQ(0u, pipelineSelectList.size());
471+
}
472+
473+
template <typename FamilyType>
474+
void CmdListPipelineSelectStateFixture::testBodyShareStateImmediateRegular() {
475+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
476+
477+
const ze_group_count_t groupCount{1, 1, 1};
478+
CmdListKernelLaunchParams launchParams = {};
479+
480+
void *currentBuffer = nullptr;
481+
482+
auto &immediateCmdListRequiredState = commandListImmediate->getRequiredStreamState();
483+
auto &immediateCmdListFinalState = commandListImmediate->getFinalStreamState();
484+
485+
auto &immediateCmdListStream = *commandListImmediate->commandContainer.getCommandStream();
486+
487+
auto &csrState = commandQueue->csr->getStreamProperties();
488+
489+
EXPECT_EQ(commandQueue->csr, commandListImmediate->csr);
490+
491+
auto &ultCsr = neoDevice->getUltCommandStreamReceiver<FamilyType>();
492+
auto &csrStream = ultCsr.commandStream;
493+
494+
GenCmdList cmdList;
495+
std::vector<GenCmdList::iterator> pipelineSelectList;
496+
size_t sizeBefore = 0;
497+
size_t sizeAfter = 0;
498+
auto result = ZE_RESULT_SUCCESS;
499+
500+
mockKernelImmData->kernelDescriptor->kernelAttributes.flags.usesSystolicPipelineSelectMode = 1;
501+
502+
size_t csrUsedBefore = csrStream.getUsed();
503+
sizeBefore = immediateCmdListStream.getUsed();
504+
result = commandListImmediate->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr, launchParams);
505+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
506+
sizeAfter = immediateCmdListStream.getUsed();
507+
size_t csrUsedAfter = csrStream.getUsed();
508+
509+
EXPECT_EQ(1, immediateCmdListRequiredState.pipelineSelect.systolicMode.value);
510+
EXPECT_EQ(1, immediateCmdListFinalState.pipelineSelect.systolicMode.value);
511+
512+
currentBuffer = ptrOffset(immediateCmdListStream.getCpuBase(), sizeBefore);
513+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
514+
currentBuffer,
515+
(sizeAfter - sizeBefore)));
516+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
517+
EXPECT_EQ(0u, pipelineSelectList.size());
518+
519+
cmdList.clear();
520+
pipelineSelectList.clear();
521+
522+
EXPECT_EQ(1, csrState.pipelineSelect.systolicMode.value);
523+
524+
currentBuffer = ptrOffset(csrStream.getCpuBase(), csrUsedBefore);
525+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
526+
currentBuffer,
527+
(csrUsedAfter - csrUsedBefore)));
528+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
529+
ASSERT_EQ(1u, pipelineSelectList.size());
530+
531+
auto pipelineSelectCmd = genCmdCast<PIPELINE_SELECT *>(*pipelineSelectList[0]);
532+
EXPECT_TRUE(NEO::UnitTestHelper<FamilyType>::getSystolicFlagValueFromPipelineSelectCommand(*pipelineSelectCmd));
533+
534+
cmdList.clear();
535+
pipelineSelectList.clear();
536+
537+
auto &regularCmdlistRequiredState = commandList->getRequiredStreamState();
538+
auto &regularCmdListFinalState = commandList->getFinalStreamState();
539+
540+
auto commandListHandle = commandList->toHandle();
541+
542+
auto &regularCommandListStream = *commandList->commandContainer.getCommandStream();
543+
auto &cmdQueueStream = commandQueue->commandStream;
544+
545+
sizeBefore = regularCommandListStream.getUsed();
546+
result = commandList->appendLaunchKernel(kernel->toHandle(), &groupCount, nullptr, 0, nullptr, launchParams);
547+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
548+
sizeAfter = regularCommandListStream.getUsed();
549+
550+
EXPECT_EQ(1, regularCmdlistRequiredState.pipelineSelect.systolicMode.value);
551+
EXPECT_EQ(1, regularCmdListFinalState.pipelineSelect.systolicMode.value);
552+
553+
currentBuffer = ptrOffset(regularCommandListStream.getCpuBase(), sizeBefore);
554+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
555+
currentBuffer,
556+
(sizeAfter - sizeBefore)));
557+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
558+
EXPECT_EQ(0u, pipelineSelectList.size());
559+
560+
cmdList.clear();
561+
pipelineSelectList.clear();
562+
commandList->close();
563+
564+
sizeBefore = cmdQueueStream.getUsed();
565+
result = commandQueue->executeCommandLists(1, &commandListHandle, nullptr, false);
566+
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
567+
sizeAfter = cmdQueueStream.getUsed();
568+
569+
EXPECT_EQ(1, csrState.pipelineSelect.systolicMode.value);
570+
571+
currentBuffer = ptrOffset(cmdQueueStream.getCpuBase(), sizeBefore);
572+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList,
573+
currentBuffer,
574+
(sizeAfter - sizeBefore)));
575+
pipelineSelectList = findAll<PIPELINE_SELECT *>(cmdList.begin(), cmdList.end());
576+
EXPECT_EQ(0u, pipelineSelectList.size());
577+
}
578+
368579
} // namespace ult
369580
} // namespace L0

level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_7.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,8 @@ HWTEST2_F(MultiReturnCommandListTest, givenCmdQueueAndImmediateCmdListUseSameCsr
14141414
EXPECT_EQ(-1, regularCmdListFinalState.frontEndState.disableEUFusion.value);
14151415
}
14161416

1417+
commandList->close();
1418+
14171419
GenCmdList cmdList;
14181420
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(
14191421
cmdList,
@@ -1597,6 +1599,7 @@ HWTEST2_F(MultiReturnCommandListTest, givenCmdQueueAndImmediateCmdListUseSameCsr
15971599

15981600
cmdList.clear();
15991601
feStateCmds.clear();
1602+
commandList->close();
16001603

16011604
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(
16021605
cmdList,

level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_enqueue_cmdlist_2.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,10 +536,21 @@ HWTEST_F(PauseOnGpuTests, givenPauseModeSetToBeforeAndAfterWhenDispatchingThenIn
536536
using CmdListPipelineSelectStateTest = Test<CmdListPipelineSelectStateFixture>;
537537

538538
using SystolicSupport = IsAnyProducts<IGFX_ALDERLAKE_P, IGFX_XE_HP_SDV, IGFX_DG2, IGFX_PVC>;
539+
539540
HWTEST2_F(CmdListPipelineSelectStateTest,
540541
givenAppendSystolicKernelToCommandListWhenExecutingCommandListThenPipelineSelectStateIsTrackedCorrectly, SystolicSupport) {
541542
testBody<FamilyType>();
542543
}
543544

545+
HWTEST2_F(CmdListPipelineSelectStateTest,
546+
givenCmdQueueAndImmediateCmdListUseSameCsrWhenAppendingSystolicKernelOnBothRegularFirstThenPipelineSelectStateIsNotChanged, SystolicSupport) {
547+
testBodyShareStateRegularImmediate<FamilyType>();
548+
}
549+
550+
HWTEST2_F(CmdListPipelineSelectStateTest,
551+
givenCmdQueueAndImmediateCmdListUseSameCsrWhenAppendingSystolicKernelOnBothImmediateFirstThenPipelineSelectStateIsNotChanged, SystolicSupport) {
552+
testBodyShareStateImmediateRegular<FamilyType>();
553+
}
554+
544555
} // namespace ult
545556
} // namespace L0

opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_1_tests.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,7 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, GivenPreambleSentAndMediaSamplerRe
724724
}
725725
HWTEST2_F(CommandStreamReceiverFlushTaskTests, GivenPreambleSentAndMediaSamplerRequirementChangedWhenFlushingTaskThenPipelineSelectIsSent, IsAtMostXeHpcCore) {
726726
auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver<FamilyType>();
727+
commandStreamReceiver.pipelineSupportFlags.mediaSamplerDopClockGate = true;
727728
commandStreamReceiver.isPreambleSent = true;
728729
commandStreamReceiver.lastMediaSamplerConfig = 1;
729730
flushTask(commandStreamReceiver);

0 commit comments

Comments
 (0)