Skip to content

Commit 7ad007e

Browse files
Add method to set systolic mode
Resolves: NEO-6040 Signed-off-by: Szymon Morek <szymon.morek@intel.com>
1 parent 7996f0a commit 7ad007e

File tree

8 files changed

+72
-18
lines changed

8 files changed

+72
-18
lines changed

opencl/test/unit_test/helpers/test_preamble_xehp_plus.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,3 +579,12 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, RenderSurfaceStateXeHPPlusTests, givenSpecificProdu
579579

580580
EXPECT_EQ(FamilyType::RENDER_SURFACE_STATE::COHERENCY_TYPE_GPU_COHERENT, rssCmd.getCoherencyType());
581581
}
582+
583+
HWCMDTEST_F(IGFX_XE_HP_CORE, PreambleFixture, whenCallingIsSpecialPipelineSelectModeChangedThenReturnCorrectValue) {
584+
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
585+
bool oldPipelineSelectSpecialMode = true;
586+
bool newPipelineSelectSpecialMode = false;
587+
588+
auto result = PreambleHelper<FamilyType>::isSpecialPipelineSelectModeChanged(oldPipelineSelectSpecialMode, newPipelineSelectSpecialMode, *defaultHwInfo);
589+
EXPECT_TRUE(result);
590+
}

opencl/test/unit_test/libult/ult_command_stream_receiver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
8484
using BaseClass::CommandStreamReceiver::lastSentL3Config;
8585
using BaseClass::CommandStreamReceiver::lastSentThreadArbitrationPolicy;
8686
using BaseClass::CommandStreamReceiver::lastSentUseGlobalAtomics;
87+
using BaseClass::CommandStreamReceiver::lastSpecialPipelineSelectMode;
8788
using BaseClass::CommandStreamReceiver::lastVmeSubslicesConfig;
8889
using BaseClass::CommandStreamReceiver::latestFlushedTaskCount;
8990
using BaseClass::CommandStreamReceiver::latestSentStatelessMocsConfig;

shared/source/command_container/command_encoder_xehp_plus.inl

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

7070
if (kernelDescriptor.extendedInfo) {
7171
bool specialModeRequired = kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
72-
if (container.lastPipelineSelectModeRequired != specialModeRequired) {
72+
if (PreambleHelper<Family>::isSpecialPipelineSelectModeChanged(container.lastPipelineSelectModeRequired, specialModeRequired, hwInfo)) {
7373
container.lastPipelineSelectModeRequired = specialModeRequired;
7474
EncodeComputeMode<Family>::adjustPipelineSelect(container, kernelDescriptor);
7575
}
@@ -539,18 +539,10 @@ template <typename Family>
539539
void EncodeComputeMode<Family>::adjustPipelineSelect(CommandContainer &container, const NEO::KernelDescriptor &kernelDescriptor) {
540540
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
541541
auto pipelineSelectCmd = Family::cmdInitPipelineSelect;
542+
auto isSpecialModeSelected = kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
542543

543-
if (kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired()) {
544-
pipelineSelectCmd.setSystolicModeEnable(true);
545-
} else {
546-
pipelineSelectCmd.setSystolicModeEnable(false);
547-
}
548-
549-
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
550-
pipelineSelectCmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
551-
}
544+
PreambleHelper<Family>::appendProgramPipelineSelect(&pipelineSelectCmd, isSpecialModeSelected, container.getDevice()->getHardwareInfo());
552545

553-
pipelineSelectCmd.setMaskBits(pipelineSelectSystolicModeEnableMaskBits);
554546
pipelineSelectCmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
555547

556548
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
@@ -258,12 +258,15 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
258258
}
259259

260260
auto newL3Config = PreambleHelper<GfxFamily>::getL3Config(peekHwInfo(), dispatchFlags.useSLM);
261+
auto isSpecialPipelineSelectModeChanged = PreambleHelper<GfxFamily>::isSpecialPipelineSelectModeChanged(lastSpecialPipelineSelectMode,
262+
dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode,
263+
peekHwInfo());
261264

262265
csrSizeRequestFlags.l3ConfigChanged = this->lastSentL3Config != newL3Config;
263266
csrSizeRequestFlags.coherencyRequestChanged = this->lastSentCoherencyRequest != static_cast<int8_t>(dispatchFlags.requiresCoherency);
264267
csrSizeRequestFlags.preemptionRequestChanged = this->lastPreemptionMode != dispatchFlags.preemptionMode;
265268
csrSizeRequestFlags.mediaSamplerConfigChanged = this->lastMediaSamplerConfig != static_cast<int8_t>(dispatchFlags.pipelineSelectArgs.mediaSamplerRequired);
266-
csrSizeRequestFlags.specialPipelineSelectModeChanged = this->lastSpecialPipelineSelectMode != dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode;
269+
csrSizeRequestFlags.specialPipelineSelectModeChanged = isSpecialPipelineSelectModeChanged;
267270

268271
if (dispatchFlags.numGrfRequired == GrfConfig::NotApplicable) {
269272
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);
@@ -59,6 +60,9 @@ struct PreambleHelper {
5960
static void programSemaphoreDelay(LinearStream *pCommandStream);
6061
static uint32_t getL3Config(const HardwareInfo &hwInfo, bool useSLM);
6162
static bool isL3Configurable(const HardwareInfo &hwInfo);
63+
static bool isSystolicModeConfigurable(const HardwareInfo &hwInfo);
64+
static bool isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
65+
const HardwareInfo &hwInfo);
6266
static size_t getAdditionalCommandsSize(const Device &device);
6367
static size_t getThreadArbitrationCommandsSize();
6468
static size_t getVFECommandsSize();

shared/source/helpers/preamble_bdw_plus.inl

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

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

shared/source/helpers/preamble_xehp_plus.inl

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

2323
namespace NEO {
2424

25+
template <>
26+
void PreambleHelper<Family>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo);
27+
28+
template <>
29+
bool PreambleHelper<Family>::isSystolicModeConfigurable(const HardwareInfo &hwInfo);
30+
2531
template <>
2632
void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
2733
const PipelineSelectArgs &pipelineSelectArgs,
@@ -45,17 +51,13 @@ void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
4551
auto pCmd = pCommandStream->getSpaceForCmd<PIPELINE_SELECT>();
4652

4753
auto mask = pipelineSelectEnablePipelineSelectMaskBits |
48-
pipelineSelectMediaSamplerDopClockGateMaskBits |
49-
pipelineSelectSystolicModeEnableMaskBits;
54+
pipelineSelectMediaSamplerDopClockGateMaskBits;
5055

5156
cmd.setMaskBits(mask);
5257
cmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
5358
cmd.setMediaSamplerDopClockGateEnable(!pipelineSelectArgs.mediaSamplerRequired);
54-
cmd.setSystolicModeEnable(pipelineSelectArgs.specialPipelineSelectMode);
5559

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

6062
*pCmd = cmd;
6163

@@ -67,6 +69,25 @@ void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
6769
}
6870
}
6971

72+
template <>
73+
void PreambleHelper<Family>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {
74+
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
75+
auto command = static_cast<PIPELINE_SELECT *>(cmd);
76+
auto mask = command->getMaskBits();
77+
78+
if (PreambleHelper<Family>::isSystolicModeConfigurable(hwInfo)) {
79+
command->setSystolicModeEnable(isSpecialModeSelected);
80+
mask |= pipelineSelectSystolicModeEnableMaskBits;
81+
}
82+
83+
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
84+
command->setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
85+
mask |= pipelineSelectSystolicModeEnableMaskBits;
86+
}
87+
88+
command->setMaskBits(mask);
89+
}
90+
7091
template <>
7192
void PreambleHelper<Family>::addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType) {
7293
}

shared/source/xe_hp_core/preamble_xe_hp_core.cpp

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

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

4051
} // namespace NEO

0 commit comments

Comments
 (0)