Skip to content

Commit 8974202

Browse files
Add method to set systolic mode
Resolves: NEO-6040 Signed-off-by: Szymon Morek [email protected]
1 parent c46f591 commit 8974202

File tree

10 files changed

+94
-18
lines changed

10 files changed

+94
-18
lines changed

opencl/test/unit_test/helpers/test_preamble_xehp_and_later.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,3 +504,12 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, RenderSurfaceStateXeHPAndLaterTests, givenSpecificP
504504

505505
EXPECT_EQ(FamilyType::RENDER_SURFACE_STATE::COHERENCY_TYPE_GPU_COHERENT, rssCmd.getCoherencyType());
506506
}
507+
508+
HWCMDTEST_F(IGFX_XE_HP_CORE, PreambleFixture, whenCallingIsSpecialPipelineSelectModeChangedThenReturnCorrectValue) {
509+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
510+
bool oldPipelineSelectSpecialMode = true;
511+
bool newPipelineSelectSpecialMode = false;
512+
513+
auto result = PreambleHelper<FamilyType>::isSpecialPipelineSelectModeChanged(oldPipelineSelectSpecialMode, newPipelineSelectSpecialMode, *defaultHwInfo);
514+
EXPECT_TRUE(result);
515+
}

opencl/test/unit_test/libult/ult_command_stream_receiver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
8888
using BaseClass::CommandStreamReceiver::lastSentL3Config;
8989
using BaseClass::CommandStreamReceiver::lastSentThreadArbitrationPolicy;
9090
using BaseClass::CommandStreamReceiver::lastSentUseGlobalAtomics;
91+
using BaseClass::CommandStreamReceiver::lastSpecialPipelineSelectMode;
9192
using BaseClass::CommandStreamReceiver::lastVmeSubslicesConfig;
9293
using BaseClass::CommandStreamReceiver::latestFlushedTaskCount;
9394
using BaseClass::CommandStreamReceiver::latestSentStatelessMocsConfig;

shared/source/command_container/command_encoder_xehp_and_later.inl

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void EncodeDispatchKernel<Family>::encode(CommandContainer &container,
7171

7272
if (kernelDescriptor.extendedInfo) {
7373
bool specialModeRequired = kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
74-
if (container.lastPipelineSelectModeRequired != specialModeRequired) {
74+
if (PreambleHelper<Family>::isSpecialPipelineSelectModeChanged(container.lastPipelineSelectModeRequired, specialModeRequired, hwInfo)) {
7575
container.lastPipelineSelectModeRequired = specialModeRequired;
7676
EncodeComputeMode<Family>::adjustPipelineSelect(container, kernelDescriptor);
7777
}
@@ -565,18 +565,10 @@ template <typename Family>
565565
void EncodeComputeMode<Family>::adjustPipelineSelect(CommandContainer &container, const NEO::KernelDescriptor &kernelDescriptor) {
566566
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
567567
auto pipelineSelectCmd = Family::cmdInitPipelineSelect;
568+
auto isSpecialModeSelected = kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
568569

569-
if (kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired()) {
570-
pipelineSelectCmd.setSystolicModeEnable(true);
571-
} else {
572-
pipelineSelectCmd.setSystolicModeEnable(false);
573-
}
574-
575-
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
576-
pipelineSelectCmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
577-
}
570+
PreambleHelper<Family>::appendProgramPipelineSelect(&pipelineSelectCmd, isSpecialModeSelected, container.getDevice()->getHardwareInfo());
578571

579-
pipelineSelectCmd.setMaskBits(pipelineSelectSystolicModeEnableMaskBits);
580572
pipelineSelectCmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
581573

582574
auto buffer = container.getCommandStream()->getSpace(sizeof(pipelineSelectCmd));

shared/source/command_stream/command_stream_receiver_hw_base.inl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,15 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
266266
}
267267

268268
auto newL3Config = PreambleHelper<GfxFamily>::getL3Config(peekHwInfo(), dispatchFlags.useSLM);
269+
auto isSpecialPipelineSelectModeChanged = PreambleHelper<GfxFamily>::isSpecialPipelineSelectModeChanged(lastSpecialPipelineSelectMode,
270+
dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode,
271+
peekHwInfo());
269272

270273
csrSizeRequestFlags.l3ConfigChanged = this->lastSentL3Config != newL3Config;
271274
csrSizeRequestFlags.coherencyRequestChanged = this->lastSentCoherencyRequest != static_cast<int8_t>(dispatchFlags.requiresCoherency);
272275
csrSizeRequestFlags.preemptionRequestChanged = this->lastPreemptionMode != dispatchFlags.preemptionMode;
273276
csrSizeRequestFlags.mediaSamplerConfigChanged = this->lastMediaSamplerConfig != static_cast<int8_t>(dispatchFlags.pipelineSelectArgs.mediaSamplerRequired);
274-
csrSizeRequestFlags.specialPipelineSelectModeChanged = this->lastSpecialPipelineSelectMode != dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode;
277+
csrSizeRequestFlags.specialPipelineSelectModeChanged = isSpecialPipelineSelectModeChanged;
275278

276279
if (dispatchFlags.numGrfRequired == GrfConfig::NotApplicable) {
277280
dispatchFlags.numGrfRequired = lastSentNumGrfRequired;

shared/source/helpers/preamble.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct PreambleHelper {
3737
static void programPipelineSelect(LinearStream *pCommandStream,
3838
const PipelineSelectArgs &pipelineSelectArgs,
3939
const HardwareInfo &hwInfo);
40+
static void appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo);
4041
static void programThreadArbitration(LinearStream *pCommandStream, uint32_t requiredThreadArbitrationPolicy);
4142
static void programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr);
4243
static void addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType);
@@ -58,6 +59,9 @@ struct PreambleHelper {
5859
static void programSemaphoreDelay(LinearStream *pCommandStream);
5960
static uint32_t getL3Config(const HardwareInfo &hwInfo, bool useSLM);
6061
static bool isL3Configurable(const HardwareInfo &hwInfo);
62+
static bool isSystolicModeConfigurable(const HardwareInfo &hwInfo);
63+
static bool isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
64+
const HardwareInfo &hwInfo);
6165
static size_t getAdditionalCommandsSize(const Device &device);
6266
static size_t getThreadArbitrationCommandsSize();
6367
static std::vector<uint32_t> getSupportedThreadArbitrationPolicies();

shared/source/helpers/preamble_bdw_and_later.inl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,17 @@ size_t PreambleHelper<GfxFamily>::getVFECommandsSize() {
7575
return sizeof(MEDIA_VFE_STATE) + sizeof(PIPE_CONTROL);
7676
}
7777

78+
template <typename GfxFamily>
79+
void PreambleHelper<GfxFamily>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {}
80+
81+
template <typename GfxFamily>
82+
bool PreambleHelper<GfxFamily>::isSystolicModeConfigurable(const HardwareInfo &hwInfo) {
83+
return false;
84+
}
85+
86+
template <typename GfxFamily>
87+
bool PreambleHelper<GfxFamily>::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
88+
const HardwareInfo &hwInfo) {
89+
return false;
90+
}
7891
} // namespace NEO

shared/source/helpers/preamble_xehp_and_later.inl

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,28 @@
2222

2323
namespace NEO {
2424

25+
template <>
26+
bool PreambleHelper<Family>::isSystolicModeConfigurable(const HardwareInfo &hwInfo);
27+
28+
template <>
29+
void PreambleHelper<Family>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {
30+
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
31+
auto command = static_cast<PIPELINE_SELECT *>(cmd);
32+
auto mask = command->getMaskBits();
33+
34+
if (PreambleHelper<Family>::isSystolicModeConfigurable(hwInfo)) {
35+
command->setSystolicModeEnable(isSpecialModeSelected);
36+
mask |= pipelineSelectSystolicModeEnableMaskBits;
37+
}
38+
39+
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
40+
command->setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
41+
mask |= pipelineSelectSystolicModeEnableMaskBits;
42+
}
43+
44+
command->setMaskBits(mask);
45+
}
46+
2547
template <>
2648
void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
2749
const PipelineSelectArgs &pipelineSelectArgs,
@@ -45,17 +67,13 @@ void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
4567
auto pCmd = pCommandStream->getSpaceForCmd<PIPELINE_SELECT>();
4668

4769
auto mask = pipelineSelectEnablePipelineSelectMaskBits |
48-
pipelineSelectMediaSamplerDopClockGateMaskBits |
49-
pipelineSelectSystolicModeEnableMaskBits;
70+
pipelineSelectMediaSamplerDopClockGateMaskBits;
5071

5172
cmd.setMaskBits(mask);
5273
cmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
5374
cmd.setMediaSamplerDopClockGateEnable(!pipelineSelectArgs.mediaSamplerRequired);
54-
cmd.setSystolicModeEnable(pipelineSelectArgs.specialPipelineSelectMode);
5575

56-
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
57-
cmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
58-
}
76+
appendProgramPipelineSelect(&cmd, pipelineSelectArgs.specialPipelineSelectMode, hwInfo);
5977

6078
*pCmd = cmd;
6179

shared/source/xe_hp_core/preamble_xe_hp_core.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@ void PreambleHelper<Family>::appendProgramVFEState(const HardwareInfo &hwInfo, c
3636
}
3737
}
3838

39+
template <>
40+
bool PreambleHelper<Family>::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
41+
const HardwareInfo &hwInfo) {
42+
return lastSpecialPipelineSelectMode != newSpecialPipelineSelectMode;
43+
}
44+
45+
template <>
46+
bool PreambleHelper<Family>::isSystolicModeConfigurable(const HardwareInfo &hwInfo) {
47+
return true;
48+
}
49+
3950
template struct PreambleHelper<Family>;
4051

4152
} // namespace NEO

shared/test/common/xe_hp_core/xehp/test_preamble_xehp.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,15 @@ XEHPTEST_F(XeHPPreambleVfeState, WhenProgramVFEStateIsCalledThenCorrectCfeStateA
114114
EXPECT_EQ(1u, cfeCmd.getNumberOfWalkers());
115115
EXPECT_EQ(expectedAddress, cfeCmd.getScratchSpaceBuffer());
116116
}
117+
118+
using XeHPPipelineSelect = ::testing::Test;
119+
120+
XEHPTEST_F(XeHPPipelineSelect, WhenAppendProgramPipelineSelectThenCorrectValuesSet) {
121+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
122+
PIPELINE_SELECT cmd = FamilyType::cmdInitPipelineSelect;
123+
PreambleHelper<FamilyType>::appendProgramPipelineSelect(&cmd, true, *defaultHwInfo);
124+
EXPECT_TRUE(cmd.getSystolicModeEnable());
125+
PreambleHelper<FamilyType>::appendProgramPipelineSelect(&cmd, false, *defaultHwInfo);
126+
EXPECT_FALSE(cmd.getSystolicModeEnable());
127+
EXPECT_EQ(pipelineSelectSystolicModeEnableMaskBits, cmd.getMaskBits());
128+
}

shared/test/unit_test/preamble/preamble_tests.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,19 @@ HWCMDTEST_F(IGFX_GEN8_CORE, PreambleTest, WhenGetScratchSpaceAddressOffsetForVfe
259259
offset + reinterpret_cast<uintptr_t>(preambleStream.getCpuBase()));
260260
}
261261

262+
HWCMDTEST_F(IGFX_GEN8_CORE, PreambleTest, WhenIsSystolicModeConfigurableThenReturnFalse) {
263+
auto result = PreambleHelper<FamilyType>::isSystolicModeConfigurable(*defaultHwInfo);
264+
EXPECT_FALSE(result);
265+
}
266+
267+
HWCMDTEST_F(IGFX_GEN8_CORE, PreambleTest, WhenAppendProgramPipelineSelectThenNothingChanged) {
268+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
269+
PIPELINE_SELECT cmd = FamilyType::cmdInitPipelineSelect;
270+
cmd.setMaskBits(pipelineSelectEnablePipelineSelectMaskBits);
271+
PreambleHelper<FamilyType>::appendProgramPipelineSelect(&cmd, true, *defaultHwInfo);
272+
EXPECT_EQ(pipelineSelectEnablePipelineSelectMaskBits, cmd.getMaskBits());
273+
}
274+
262275
HWTEST_F(PreambleTest, givenSetForceSemaphoreDelayBetweenWaitsWhenProgramSemaphoreDelayThenSemaWaitPollRegisterIsProgrammed) {
263276
using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM;
264277
DebugManagerStateRestore debugManagerStateRestore;

0 commit comments

Comments
 (0)