Add method to set systolic mode

Resolves: NEO-6040

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2021-07-28 14:27:23 +00:00
committed by Compute-Runtime-Automation
parent 7996f0a924
commit 7ad007ec92
8 changed files with 72 additions and 18 deletions

View File

@@ -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();

View File

@@ -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

View File

@@ -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) {
}