mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Add method to set systolic mode
Resolves: NEO-6040 Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:

committed by
Compute-Runtime-Automation

parent
7996f0a924
commit
7ad007ec92
@ -579,3 +579,12 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, RenderSurfaceStateXeHPPlusTests, givenSpecificProdu
|
||||
|
||||
EXPECT_EQ(FamilyType::RENDER_SURFACE_STATE::COHERENCY_TYPE_GPU_COHERENT, rssCmd.getCoherencyType());
|
||||
}
|
||||
|
||||
HWCMDTEST_F(IGFX_XE_HP_CORE, PreambleFixture, whenCallingIsSpecialPipelineSelectModeChangedThenReturnCorrectValue) {
|
||||
using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT;
|
||||
bool oldPipelineSelectSpecialMode = true;
|
||||
bool newPipelineSelectSpecialMode = false;
|
||||
|
||||
auto result = PreambleHelper<FamilyType>::isSpecialPipelineSelectModeChanged(oldPipelineSelectSpecialMode, newPipelineSelectSpecialMode, *defaultHwInfo);
|
||||
EXPECT_TRUE(result);
|
||||
}
|
||||
|
@ -84,6 +84,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw<GfxFamily>, publ
|
||||
using BaseClass::CommandStreamReceiver::lastSentL3Config;
|
||||
using BaseClass::CommandStreamReceiver::lastSentThreadArbitrationPolicy;
|
||||
using BaseClass::CommandStreamReceiver::lastSentUseGlobalAtomics;
|
||||
using BaseClass::CommandStreamReceiver::lastSpecialPipelineSelectMode;
|
||||
using BaseClass::CommandStreamReceiver::lastVmeSubslicesConfig;
|
||||
using BaseClass::CommandStreamReceiver::latestFlushedTaskCount;
|
||||
using BaseClass::CommandStreamReceiver::latestSentStatelessMocsConfig;
|
||||
|
@ -69,7 +69,7 @@ void EncodeDispatchKernel<Family>::encode(CommandContainer &container,
|
||||
|
||||
if (kernelDescriptor.extendedInfo) {
|
||||
bool specialModeRequired = kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
|
||||
if (container.lastPipelineSelectModeRequired != specialModeRequired) {
|
||||
if (PreambleHelper<Family>::isSpecialPipelineSelectModeChanged(container.lastPipelineSelectModeRequired, specialModeRequired, hwInfo)) {
|
||||
container.lastPipelineSelectModeRequired = specialModeRequired;
|
||||
EncodeComputeMode<Family>::adjustPipelineSelect(container, kernelDescriptor);
|
||||
}
|
||||
@ -539,18 +539,10 @@ template <typename Family>
|
||||
void EncodeComputeMode<Family>::adjustPipelineSelect(CommandContainer &container, const NEO::KernelDescriptor &kernelDescriptor) {
|
||||
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
|
||||
auto pipelineSelectCmd = Family::cmdInitPipelineSelect;
|
||||
auto isSpecialModeSelected = kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired();
|
||||
|
||||
if (kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired()) {
|
||||
pipelineSelectCmd.setSystolicModeEnable(true);
|
||||
} else {
|
||||
pipelineSelectCmd.setSystolicModeEnable(false);
|
||||
}
|
||||
PreambleHelper<Family>::appendProgramPipelineSelect(&pipelineSelectCmd, isSpecialModeSelected, container.getDevice()->getHardwareInfo());
|
||||
|
||||
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
|
||||
pipelineSelectCmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
|
||||
}
|
||||
|
||||
pipelineSelectCmd.setMaskBits(pipelineSelectSystolicModeEnableMaskBits);
|
||||
pipelineSelectCmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
|
||||
|
||||
auto buffer = container.getCommandStream()->getSpace(sizeof(pipelineSelectCmd));
|
||||
|
@ -258,12 +258,15 @@ CompletionStamp CommandStreamReceiverHw<GfxFamily>::flushTask(
|
||||
}
|
||||
|
||||
auto newL3Config = PreambleHelper<GfxFamily>::getL3Config(peekHwInfo(), dispatchFlags.useSLM);
|
||||
auto isSpecialPipelineSelectModeChanged = PreambleHelper<GfxFamily>::isSpecialPipelineSelectModeChanged(lastSpecialPipelineSelectMode,
|
||||
dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode,
|
||||
peekHwInfo());
|
||||
|
||||
csrSizeRequestFlags.l3ConfigChanged = this->lastSentL3Config != newL3Config;
|
||||
csrSizeRequestFlags.coherencyRequestChanged = this->lastSentCoherencyRequest != static_cast<int8_t>(dispatchFlags.requiresCoherency);
|
||||
csrSizeRequestFlags.preemptionRequestChanged = this->lastPreemptionMode != dispatchFlags.preemptionMode;
|
||||
csrSizeRequestFlags.mediaSamplerConfigChanged = this->lastMediaSamplerConfig != static_cast<int8_t>(dispatchFlags.pipelineSelectArgs.mediaSamplerRequired);
|
||||
csrSizeRequestFlags.specialPipelineSelectModeChanged = this->lastSpecialPipelineSelectMode != dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode;
|
||||
csrSizeRequestFlags.specialPipelineSelectModeChanged = isSpecialPipelineSelectModeChanged;
|
||||
|
||||
if (dispatchFlags.numGrfRequired == GrfConfig::NotApplicable) {
|
||||
dispatchFlags.numGrfRequired = lastSentNumGrfRequired;
|
||||
|
@ -37,6 +37,7 @@ struct PreambleHelper {
|
||||
static void programPipelineSelect(LinearStream *pCommandStream,
|
||||
const PipelineSelectArgs &pipelineSelectArgs,
|
||||
const HardwareInfo &hwInfo);
|
||||
static void appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo);
|
||||
static void programThreadArbitration(LinearStream *pCommandStream, uint32_t requiredThreadArbitrationPolicy);
|
||||
static void programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr);
|
||||
static void addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType);
|
||||
@ -59,6 +60,9 @@ struct PreambleHelper {
|
||||
static void programSemaphoreDelay(LinearStream *pCommandStream);
|
||||
static uint32_t getL3Config(const HardwareInfo &hwInfo, bool useSLM);
|
||||
static bool isL3Configurable(const HardwareInfo &hwInfo);
|
||||
static bool isSystolicModeConfigurable(const HardwareInfo &hwInfo);
|
||||
static bool isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
|
||||
const HardwareInfo &hwInfo);
|
||||
static size_t getAdditionalCommandsSize(const Device &device);
|
||||
static size_t getThreadArbitrationCommandsSize();
|
||||
static size_t getVFECommandsSize();
|
||||
|
@ -77,4 +77,17 @@ size_t PreambleHelper<GfxFamily>::getVFECommandsSize() {
|
||||
return sizeof(MEDIA_VFE_STATE) + sizeof(PIPE_CONTROL);
|
||||
}
|
||||
|
||||
template <typename GfxFamily>
|
||||
void PreambleHelper<GfxFamily>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {}
|
||||
|
||||
template <typename GfxFamily>
|
||||
bool PreambleHelper<GfxFamily>::isSystolicModeConfigurable(const HardwareInfo &hwInfo) {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename GfxFamily>
|
||||
bool PreambleHelper<GfxFamily>::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
|
||||
const HardwareInfo &hwInfo) {
|
||||
return false;
|
||||
}
|
||||
} // namespace NEO
|
||||
|
@ -22,6 +22,12 @@
|
||||
|
||||
namespace NEO {
|
||||
|
||||
template <>
|
||||
void PreambleHelper<Family>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo);
|
||||
|
||||
template <>
|
||||
bool PreambleHelper<Family>::isSystolicModeConfigurable(const HardwareInfo &hwInfo);
|
||||
|
||||
template <>
|
||||
void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
|
||||
const PipelineSelectArgs &pipelineSelectArgs,
|
||||
@ -45,17 +51,13 @@ void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
|
||||
auto pCmd = pCommandStream->getSpaceForCmd<PIPELINE_SELECT>();
|
||||
|
||||
auto mask = pipelineSelectEnablePipelineSelectMaskBits |
|
||||
pipelineSelectMediaSamplerDopClockGateMaskBits |
|
||||
pipelineSelectSystolicModeEnableMaskBits;
|
||||
pipelineSelectMediaSamplerDopClockGateMaskBits;
|
||||
|
||||
cmd.setMaskBits(mask);
|
||||
cmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU);
|
||||
cmd.setMediaSamplerDopClockGateEnable(!pipelineSelectArgs.mediaSamplerRequired);
|
||||
cmd.setSystolicModeEnable(pipelineSelectArgs.specialPipelineSelectMode);
|
||||
|
||||
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
|
||||
cmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
|
||||
}
|
||||
appendProgramPipelineSelect(&cmd, pipelineSelectArgs.specialPipelineSelectMode, hwInfo);
|
||||
|
||||
*pCmd = cmd;
|
||||
|
||||
@ -67,6 +69,25 @@ void PreambleHelper<Family>::programPipelineSelect(LinearStream *pCommandStream,
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
void PreambleHelper<Family>::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {
|
||||
using PIPELINE_SELECT = typename Family::PIPELINE_SELECT;
|
||||
auto command = static_cast<PIPELINE_SELECT *>(cmd);
|
||||
auto mask = command->getMaskBits();
|
||||
|
||||
if (PreambleHelper<Family>::isSystolicModeConfigurable(hwInfo)) {
|
||||
command->setSystolicModeEnable(isSpecialModeSelected);
|
||||
mask |= pipelineSelectSystolicModeEnableMaskBits;
|
||||
}
|
||||
|
||||
if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) {
|
||||
command->setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get());
|
||||
mask |= pipelineSelectSystolicModeEnableMaskBits;
|
||||
}
|
||||
|
||||
command->setMaskBits(mask);
|
||||
}
|
||||
|
||||
template <>
|
||||
void PreambleHelper<Family>::addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType) {
|
||||
}
|
||||
|
@ -35,6 +35,17 @@ void PreambleHelper<Family>::appendProgramVFEState(const HardwareInfo &hwInfo, c
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
bool PreambleHelper<Family>::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode,
|
||||
const HardwareInfo &hwInfo) {
|
||||
return lastSpecialPipelineSelectMode != newSpecialPipelineSelectMode;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool PreambleHelper<Family>::isSystolicModeConfigurable(const HardwareInfo &hwInfo) {
|
||||
return true;
|
||||
}
|
||||
|
||||
template struct PreambleHelper<Family>;
|
||||
|
||||
} // namespace NEO
|
||||
|
Reference in New Issue
Block a user