Refactor preemption methods

- moving primary template definitions to preemption.inl

Change-Id: Ia54c652503a6272c55800e5ba59b94ef21fa2a19
This commit is contained in:
Hoppe, Mateusz
2018-02-12 13:41:08 +01:00
committed by sys_ocldev
parent d563059c14
commit 85f890690d
4 changed files with 103 additions and 84 deletions

View File

@@ -66,4 +66,17 @@ class PreemptionHelper {
static PreemptionMode getDefaultPreemptionMode(const HardwareInfo &hwInfo);
};
template <typename GfxFamily>
struct PreemptionConfig {
static const uint32_t mmioAddress;
static const uint32_t maskVal;
static const uint32_t maskShift;
static const uint32_t mask;
static const uint32_t threadGroupVal;
static const uint32_t cmdLevelVal;
static const uint32_t midThreadVal;
};
} // namespace OCLRT

View File

@@ -23,6 +23,7 @@
#include "runtime/command_stream/preemption.h"
#include "runtime/device/device.h"
#include "runtime/command_queue/dispatch_walker_helper.h"
#include "runtime/memory_manager/graphics_allocation.h"
namespace OCLRT {
@@ -70,4 +71,63 @@ void PreemptionHelper::applyPreemptionWaCmdsEnd(LinearStream *pCommandStream, co
}
}
template <typename GfxFamily>
void PreemptionHelper::programPreamble(LinearStream &preambleCmdStream, const Device &device,
const GraphicsAllocation *preemptionCsr) {
if (device.getPreemptionMode() != PreemptionMode::MidThread) {
return;
}
UNRECOVERABLE_IF(nullptr == preemptionCsr);
using GPGPU_CSR_BASE_ADDRESS = typename GfxFamily::GPGPU_CSR_BASE_ADDRESS;
using STATE_SIP = typename GfxFamily::STATE_SIP;
auto csr = reinterpret_cast<GPGPU_CSR_BASE_ADDRESS *>(preambleCmdStream.getSpace(sizeof(GPGPU_CSR_BASE_ADDRESS)));
csr->init();
csr->setGpgpuCsrBaseAddress(preemptionCsr->getGpuAddressToPatch());
auto sip = reinterpret_cast<STATE_SIP *>(preambleCmdStream.getSpace(sizeof(STATE_SIP)));
sip->init();
sip->setSystemInstructionPointer(0);
}
template <typename GfxFamily>
void PreemptionHelper::programCmdStream(LinearStream &cmdStream,
PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode,
GraphicsAllocation *preemptionCsr,
const LinearStream &ih, const Device &device) {
if (oldPreemptionMode == newPreemptionMode) {
DEBUG_BREAK_IF((newPreemptionMode == PreemptionMode::MidThread) && (false == isValidInstructionHeapForMidThreadPreemption(ih, device)));
return;
}
uint32_t regVal = 0;
if (newPreemptionMode == PreemptionMode::MidThread) {
regVal = PreemptionConfig<GfxFamily>::midThreadVal | PreemptionConfig<GfxFamily>::mask;
} else if (newPreemptionMode == PreemptionMode::ThreadGroup) {
regVal = PreemptionConfig<GfxFamily>::threadGroupVal | PreemptionConfig<GfxFamily>::mask;
} else {
regVal = PreemptionConfig<GfxFamily>::cmdLevelVal | PreemptionConfig<GfxFamily>::mask;
}
LriHelper<GfxFamily>::program(&cmdStream, PreemptionConfig<GfxFamily>::mmioAddress, regVal);
}
template <typename GfxFamily>
size_t PreemptionHelper::getRequiredCmdStreamSize(PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode) {
if (newPreemptionMode == oldPreemptionMode) {
return 0;
}
return sizeof(typename GfxFamily::MI_LOAD_REGISTER_IMM);
}
template <typename GfxFamily>
size_t PreemptionHelper::getRequiredPreambleSize(const Device &device) {
if (device.getPreemptionMode() != PreemptionMode::MidThread) {
return 0;
}
return sizeof(typename GfxFamily::GPGPU_CSR_BASE_ADDRESS) + sizeof(typename GfxFamily::STATE_SIP);
}
} // namespace OCLRT