feature: Add ftrHeaplessMode flag

Pass hwInfo to isHeaplessModeEnabled and isForceBindlessRequired functions.

Related-To: NEO-14526

Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski
2025-04-01 23:42:36 +00:00
committed by Compute-Runtime-Automation
parent 8961e8b50d
commit 504440fc4d
100 changed files with 182 additions and 163 deletions

View File

@@ -125,7 +125,7 @@ size_t SipKernel::getStateSaveAreaSize(Device *device) const {
SipKernelType SipKernel::getSipKernelType(Device &device) {
if (device.getDebugger() != nullptr) {
auto &compilerProductHelper = device.getRootDeviceEnvironment().getHelper<CompilerProductHelper>();
if (compilerProductHelper.isHeaplessModeEnabled()) {
if (compilerProductHelper.isHeaplessModeEnabled(device.getHardwareInfo())) {
return SipKernelType::dbgHeapless;
} else {
return SipKernelType::dbgBindless;
@@ -309,7 +309,7 @@ const SipKernel &SipKernel::getSipKernelImpl(Device &device) {
const SipKernel &SipKernel::getDebugSipKernel(Device &device) {
SipKernelType debugSipType;
auto &compilerProductHelper = device.getRootDeviceEnvironment().getHelper<CompilerProductHelper>();
if (compilerProductHelper.isHeaplessModeEnabled()) {
if (compilerProductHelper.isHeaplessModeEnabled(device.getHardwareInfo())) {
debugSipType = SipKernelType::dbgHeapless;
} else {
debugSipType = SipKernelType::dbgBindless;
@@ -327,7 +327,7 @@ const SipKernel &SipKernel::getDebugSipKernel(Device &device) {
const SipKernel &SipKernel::getDebugSipKernel(Device &device, OsContext *context) {
SipKernelType debugSipType;
auto &compilerProductHelper = device.getRootDeviceEnvironment().getHelper<CompilerProductHelper>();
if (compilerProductHelper.isHeaplessModeEnabled()) {
if (compilerProductHelper.isHeaplessModeEnabled(device.getHardwareInfo())) {
debugSipType = SipKernelType::dbgHeapless;
} else {
debugSipType = SipKernelType::dbgBindless;

View File

@@ -65,7 +65,8 @@ uint32_t EncodeStates<Family>::copySamplerState(IndirectHeap *dsh,
auto borderColor = reinterpret_cast<const SAMPLER_BORDER_COLOR_STATE *>(ptrOffset(fnDynamicStateHeap, borderColorOffset));
auto &compilerProductHelper = rootDeviceEnvironment.getHelper<CompilerProductHelper>();
bool heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled();
auto &hwInfo = *rootDeviceEnvironment.getHardwareInfo();
bool heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled(hwInfo);
if (!bindlessHeapHelper || (!bindlessHeapHelper->isGlobalDshSupported())) {
borderColorOffsetInDsh = static_cast<uint32_t>(dsh->getUsed());
@@ -98,7 +99,6 @@ uint32_t EncodeStates<Family>::copySamplerState(IndirectHeap *dsh,
}
auto &helper = rootDeviceEnvironment.getHelper<ProductHelper>();
auto &hwInfo = *rootDeviceEnvironment.getHardwareInfo();
auto srcSamplerState = reinterpret_cast<const SAMPLER_STATE *>(ptrOffset(fnDynamicStateHeap, samplerStateOffset));
SAMPLER_STATE state = {};
for (uint32_t i = 0; i < samplerCount; i++) {

View File

@@ -99,7 +99,7 @@ CommandStreamReceiver::CommandStreamReceiver(ExecutionEnvironment &executionEnvi
registeredClients.reserve(16);
auto &compilerProductHelper = rootDeviceEnvironment.getHelper<CompilerProductHelper>();
this->heaplessModeEnabled = compilerProductHelper.isHeaplessModeEnabled();
this->heaplessModeEnabled = compilerProductHelper.isHeaplessModeEnabled(hwInfo);
this->evictionAllocations.reserve(2 * MemoryConstants::kiloByte);
}

View File

@@ -49,7 +49,7 @@ void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &
bool isMidThreadPreemption = device.getPreemptionMode() == PreemptionMode::MidThread;
auto &compilerProductHelper = device.getCompilerProductHelper();
bool useFullAddress = compilerProductHelper.isHeaplessModeEnabled();
bool useFullAddress = compilerProductHelper.isHeaplessModeEnabled(device.getHardwareInfo());
if (isMidThreadPreemption || debuggingEnabled) {
GraphicsAllocation *sipAllocation = SipKernel::getSipKernel(device, context).getSipAllocation();

View File

@@ -9,7 +9,7 @@
namespace NEO {
namespace CompilerOptions {
void applyExtraInternalOptions(std::string &internalOptions, const CompilerProductHelper &compilerProductHelper, HeaplessMode heaplessMode) {
void applyExtraInternalOptions(std::string &internalOptions, const HardwareInfo &hwInfo, const CompilerProductHelper &compilerProductHelper, HeaplessMode heaplessMode) {
}
} // namespace CompilerOptions

View File

@@ -11,11 +11,12 @@
namespace NEO {
class CompilerProductHelper;
struct HardwareInfo;
namespace CompilerOptions {
enum class HeaplessMode;
void applyExtraInternalOptions(std::string &internalOptions, const CompilerProductHelper &compilerProductHelper, CompilerOptions::HeaplessMode heaplessMode);
void applyExtraInternalOptions(std::string &internalOptions, const HardwareInfo &hwInfo, const CompilerProductHelper &compilerProductHelper, CompilerOptions::HeaplessMode heaplessMode);
} // namespace CompilerOptions
} // namespace NEO

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2024 Intel Corporation
* Copyright (C) 2020-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -25,10 +25,11 @@ bool DebuggerL0::initDebuggingInOs(NEO::OSInterface *osInterface) {
const bool vmBindAvailable = drm->isVmBindAvailable();
const bool perContextVms = drm->isPerContextVMRequired();
auto &hwInfo = *drm->getHardwareInfo();
bool allowDebug = false;
if (drm->getRootDeviceEnvironment().executionEnvironment.getDebuggingMode() == DebuggingMode::online) {
allowDebug = drm->getRootDeviceEnvironment().getHelper<CompilerProductHelper>().isHeaplessModeEnabled() ? true : perContextVms;
allowDebug = drm->getRootDeviceEnvironment().getHelper<CompilerProductHelper>().isHeaplessModeEnabled(hwInfo) ? true : perContextVms;
} else if (drm->getRootDeviceEnvironment().executionEnvironment.getDebuggingMode() == DebuggingMode::offline) {
allowDebug = true;
}

View File

@@ -563,7 +563,7 @@ bool Device::initializeEngines() {
}
auto &compilerProductHelper = this->getCompilerProductHelper();
auto heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled();
auto heaplessEnabled = compilerProductHelper.isHeaplessModeEnabled(this->getHardwareInfo());
bool isHeaplessStateInit = engine.osContext->getIsPrimaryEngine() && compilerProductHelper.isHeaplessStateInitEnabled(heaplessEnabled);
bool initializeDevice = (engine.osContext->isPartOfContextGroup() || isHeaplessStateInit) && !firstSubmissionDone;
@@ -1181,7 +1181,7 @@ void Device::allocateRTDispatchGlobals(uint32_t maxBvhLevels) {
dispatchGlobalsAsArray[7] = 1;
if (releaseHelper) {
bool heaplessEnabled = this->getCompilerProductHelper().isHeaplessModeEnabled();
bool heaplessEnabled = this->getCompilerProductHelper().isHeaplessModeEnabled(this->getHardwareInfo());
releaseHelper->adjustRTDispatchGlobals(static_cast<void *>(&dispatchGlobals), rtStacksPerDss, heaplessEnabled, maxBvhLevels);
}

View File

@@ -79,7 +79,7 @@ DirectSubmissionHw<GfxFamily, Dispatcher>::DirectSubmissionHw(const DirectSubmis
miMemFenceRequired = debugManager.flags.DirectSubmissionInsertExtraMiMemFenceCommands.get();
}
if (miMemFenceRequired && compilerProductHelper.isHeaplessStateInitEnabled(compilerProductHelper.isHeaplessModeEnabled())) {
if (miMemFenceRequired && compilerProductHelper.isHeaplessStateInitEnabled(compilerProductHelper.isHeaplessModeEnabled(*hwInfo))) {
this->systemMemoryFenceAddressSet = true;
}

View File

@@ -75,7 +75,8 @@ Drm *Drm::create(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironm
drm->queryPageFaultSupport();
auto &compilerProductHelper = rootDeviceEnvironment.getHelper<CompilerProductHelper>();
if (rootDeviceEnvironment.executionEnvironment.isDebuggingEnabled() && !compilerProductHelper.isHeaplessModeEnabled()) {
auto &hwInfo = *rootDeviceEnvironment.getHardwareInfo();
if (rootDeviceEnvironment.executionEnvironment.isDebuggingEnabled() && !compilerProductHelper.isHeaplessModeEnabled(hwInfo)) {
if (drm->getRootDeviceEnvironment().executionEnvironment.getDebuggingMode() == DebuggingMode::offline) {
drm->setPerContextVMRequired(false);
} else {
@@ -94,7 +95,7 @@ Drm *Drm::create(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironm
drm->configureGpuFaultCheckThreshold();
if (!drm->isPerContextVMRequired()) {
if (!drm->createVirtualMemoryAddressSpace(GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) {
if (!drm->createVirtualMemoryAddressSpace(GfxCoreHelper::getSubDevicesCount(&hwInfo))) {
printDebugString(debugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n");
}
}

View File

@@ -79,14 +79,14 @@ class CompilerProductHelper {
virtual std::string getDeviceExtensions(const HardwareInfo &hwInfo, const ReleaseHelper *releaseHelper) const = 0;
virtual StackVec<OclCVersion, 5> getDeviceOpenCLCVersions(const HardwareInfo &hwInfo, OclCVersion max) const = 0;
virtual void adjustHwInfoForIgc(HardwareInfo &hwInfo) const = 0;
virtual bool isHeaplessModeEnabled() const = 0;
virtual bool isHeaplessModeEnabled(const HardwareInfo &hwInfo) const = 0;
virtual bool isHeaplessStateInitEnabled(bool heaplessModeEnabled) const = 0;
virtual void getKernelFp16AtomicCapabilities(const ReleaseHelper *releaseHelper, uint32_t &fp16Caps) const = 0;
virtual void getKernelFp32AtomicCapabilities(uint32_t &fp32Caps) const = 0;
virtual void getKernelFp64AtomicCapabilities(uint32_t &fp64Caps) const = 0;
virtual void getKernelCapabilitiesExtra(const ReleaseHelper *releaseHelper, uint32_t &extraCaps) const = 0;
virtual bool isBindlessAddressingDisabled(const ReleaseHelper *releaseHelper) const = 0;
virtual bool isForceBindlessRequired() const = 0;
virtual bool isForceBindlessRequired(const HardwareInfo &hwInfo) const = 0;
virtual const char *getCustomIgcLibraryName() const = 0;
virtual const char *getFinalizerLibraryName() const = 0;
@@ -133,14 +133,14 @@ class CompilerProductHelperHw : public CompilerProductHelper {
std::string getDeviceExtensions(const HardwareInfo &hwInfo, const ReleaseHelper *releaseHelper) const override;
StackVec<OclCVersion, 5> getDeviceOpenCLCVersions(const HardwareInfo &hwInfo, OclCVersion max) const override;
void adjustHwInfoForIgc(HardwareInfo &hwInfo) const override;
bool isHeaplessModeEnabled() const override;
bool isHeaplessModeEnabled(const HardwareInfo &hwInfo) const override;
bool isHeaplessStateInitEnabled(bool heaplessModeEnabled) const override;
void getKernelFp16AtomicCapabilities(const ReleaseHelper *releaseHelper, uint32_t &fp16Caps) const override;
void getKernelFp32AtomicCapabilities(uint32_t &fp32Caps) const override;
void getKernelFp64AtomicCapabilities(uint32_t &fp64Caps) const override;
void getKernelCapabilitiesExtra(const ReleaseHelper *releaseHelper, uint32_t &extraCaps) const override;
bool isBindlessAddressingDisabled(const ReleaseHelper *releaseHelper) const override;
bool isForceBindlessRequired() const override;
bool isForceBindlessRequired(const HardwareInfo &hwInfo) const override;
const char *getCustomIgcLibraryName() const override;
const char *getFinalizerLibraryName() const override;

View File

@@ -224,7 +224,7 @@ StackVec<OclCVersion, 5> CompilerProductHelperHw<gfxProduct>::getDeviceOpenCLCVe
}
template <PRODUCT_FAMILY gfxProduct>
bool CompilerProductHelperHw<gfxProduct>::isHeaplessModeEnabled() const {
bool CompilerProductHelperHw<gfxProduct>::isHeaplessModeEnabled(const HardwareInfo &hwInfo) const {
return false;
}
@@ -310,8 +310,8 @@ bool CompilerProductHelperHw<gfxProduct>::isBindlessAddressingDisabled(const Rel
}
template <PRODUCT_FAMILY gfxProduct>
bool CompilerProductHelperHw<gfxProduct>::isForceBindlessRequired() const {
return this->isHeaplessModeEnabled();
bool CompilerProductHelperHw<gfxProduct>::isForceBindlessRequired(const HardwareInfo &hwInfo) const {
return this->isHeaplessModeEnabled(hwInfo);
}
template <PRODUCT_FAMILY gfxProduct>

View File

@@ -70,7 +70,8 @@ struct FeatureTableBase {
uint32_t ftrXe2PlusTiling : 1;
uint32_t ftrL3TransientDataFlush : 1;
uint32_t ftrPml5Support : 1;
uint32_t reserved : 18;
uint32_t ftrHeaplessMode : 1;
uint32_t reserved : 17;
};
BcsInfoMask ftrBcsInfo = 1;