From c95a67b4209d58d103662b24cb9f0e6ebc149ad5 Mon Sep 17 00:00:00 2001 From: Damian Tomczak Date: Fri, 21 Mar 2025 09:02:27 +0000 Subject: [PATCH] feature: additional checkers to enable feature Resolves: NEO-13973 Signed-off-by: Damian Tomczak --- .../core/source/helpers/api_specific_config_l0.cpp | 7 ++++++- .../sources/helper/api_specific_config_l0_tests.cpp | 5 +++-- .../test/unit_tests/sources/module/test_module.cpp | 2 +- opencl/source/helpers/api_specific_config_ocl.cpp | 9 ++++++++- opencl/source/program/program.cpp | 2 +- opencl/test/unit_test/built_ins/built_in_tests.cpp | 8 ++++---- opencl/test/unit_test/program/program_tests.cpp | 13 +++++-------- shared/source/helpers/compiler_product_helper.h | 4 +++- .../source/helpers/compiler_product_helper_base.inl | 5 +++++ .../common/mocks/mock_compiler_product_helper.h | 3 ++- 10 files changed, 38 insertions(+), 20 deletions(-) diff --git a/level_zero/core/source/helpers/api_specific_config_l0.cpp b/level_zero/core/source/helpers/api_specific_config_l0.cpp index b67b8f4ade..a877f6b50d 100644 --- a/level_zero/core/source/helpers/api_specific_config_l0.cpp +++ b/level_zero/core/source/helpers/api_specific_config_l0.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -10,6 +10,7 @@ #include "shared/source/device/device.h" #include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/helpers/api_specific_config.h" +#include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/release_helper/release_helper.h" #include "level_zero/core/source/compiler_interface/l0_reg_path.h" @@ -33,6 +34,10 @@ bool ApiSpecificConfig::getGlobalBindlessHeapConfiguration(const ReleaseHelper * } bool ApiSpecificConfig::getBindlessMode(const Device &device) { + if (device.getCompilerProductHelper().isForceBindlessRequired()) { + return true; + } + if (debugManager.flags.UseBindlessMode.get() != -1) { return debugManager.flags.UseBindlessMode.get(); } diff --git a/level_zero/core/test/unit_tests/sources/helper/api_specific_config_l0_tests.cpp b/level_zero/core/test/unit_tests/sources/helper/api_specific_config_l0_tests.cpp index 4b2a51fae4..e69a9759c9 100644 --- a/level_zero/core/test/unit_tests/sources/helper/api_specific_config_l0_tests.cpp +++ b/level_zero/core/test/unit_tests/sources/helper/api_specific_config_l0_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Intel Corporation + * Copyright (C) 2021-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -7,6 +7,7 @@ #include "shared/source/command_container/implicit_scaling.h" #include "shared/source/helpers/api_specific_config.h" +#include "shared/source/helpers/compiler_product_helper.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/mocks/mock_ail_configuration.h" #include "shared/test/common/mocks/mock_device.h" @@ -109,7 +110,7 @@ TEST(ApiSpecificConfigL0Tests, WhenCheckingIfBindlessAddressingIsEnabledThenRetu EXPECT_TRUE(ApiSpecificConfig::getBindlessMode(mockDevice)); mockAilConfigurationHelper.setDisableBindlessAddressing(true); - EXPECT_FALSE(ApiSpecificConfig::getBindlessMode(mockDevice)); + EXPECT_EQ(mockDevice.getCompilerProductHelper().isHeaplessModeEnabled(), ApiSpecificConfig::getBindlessMode(mockDevice)); } } // namespace NEO diff --git a/level_zero/core/test/unit_tests/sources/module/test_module.cpp b/level_zero/core/test/unit_tests/sources/module/test_module.cpp index a5d9febb6b..1b5f85b41b 100644 --- a/level_zero/core/test/unit_tests/sources/module/test_module.cpp +++ b/level_zero/core/test/unit_tests/sources/module/test_module.cpp @@ -3887,7 +3887,7 @@ TEST_F(ModuleTest, givenInternalOptionsWhenBindlessDisabledThenBindlesOptionsNot module->createBuildOptions("", buildOptions, internalBuildOptions); - EXPECT_FALSE(NEO::CompilerOptions::contains(internalBuildOptions, NEO::CompilerOptions::bindlessMode)); + EXPECT_EQ(device->getCompilerProductHelper().isHeaplessModeEnabled(), NEO::CompilerOptions::contains(internalBuildOptions, NEO::CompilerOptions::bindlessMode)); } TEST_F(ModuleTest, givenSrcOptLevelInSrcNamesWhenMovingBuildOptionsThenOptionIsRemovedFromSrcNamesAndTranslatedOptionsStoredInDstNames) { diff --git a/opencl/source/helpers/api_specific_config_ocl.cpp b/opencl/source/helpers/api_specific_config_ocl.cpp index 6e5d3eed0b..7821a4b364 100644 --- a/opencl/source/helpers/api_specific_config_ocl.cpp +++ b/opencl/source/helpers/api_specific_config_ocl.cpp @@ -1,12 +1,15 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/debug_settings/debug_settings_manager.h" +#include "shared/source/device/device.h" #include "shared/source/helpers/api_specific_config.h" +#include "shared/source/helpers/compiler_product_helper.h" +#include "shared/source/release_helper/release_helper.h" #include "opencl/source/os_interface/ocl_reg_path.h" @@ -25,6 +28,10 @@ bool ApiSpecificConfig::getGlobalBindlessHeapConfiguration(const ReleaseHelper * } bool ApiSpecificConfig::getBindlessMode(const Device &device) { + if (device.getCompilerProductHelper().isForceBindlessRequired()) { + return true; + } + if (debugManager.flags.UseBindlessMode.get() != -1) { return debugManager.flags.UseBindlessMode.get(); } else { diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index 012e2fee91..eea8b60c64 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -80,7 +80,7 @@ std::string Program::getInternalOptions() const { CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::greaterThan4gbBuffersRequired); } - if (debugManager.flags.UseBindlessMode.get() == 1) { + if (NEO::ApiSpecificConfig::getBindlessMode(pClDevice->getDevice())) { CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::bindlessMode); } diff --git a/opencl/test/unit_test/built_ins/built_in_tests.cpp b/opencl/test/unit_test/built_ins/built_in_tests.cpp index 3bbefedf3f..e348d70ed0 100644 --- a/opencl/test/unit_test/built_ins/built_in_tests.cpp +++ b/opencl/test/unit_test/built_ins/built_in_tests.cpp @@ -1653,7 +1653,7 @@ TEST_F(BuiltInTests, WhenBuiltinsLibIsCreatedThenAllStoragesSizeIsTwo) { TEST_F(BuiltInTests, GivenTypeAnyWhenGettingBuiltinCodeThenCorrectBuiltinReturned) { auto builtinsLib = std::unique_ptr(new BuiltinsLib()); - BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::any, *pDevice); + BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::adjustBuiltinType(false, pDevice->getCompilerProductHelper().isHeaplessModeEnabled()), BuiltinCode::ECodeType::any, *pDevice); EXPECT_EQ(BuiltinCode::ECodeType::binary, code.type); EXPECT_NE(0u, code.resource.size()); EXPECT_EQ(pDevice, code.targetDevice); @@ -1661,7 +1661,7 @@ TEST_F(BuiltInTests, GivenTypeAnyWhenGettingBuiltinCodeThenCorrectBuiltinReturne TEST_F(BuiltInTests, GivenTypeBinaryWhenGettingBuiltinCodeThenCorrectBuiltinReturned) { auto builtinsLib = std::unique_ptr(new BuiltinsLib()); - BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); + BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::adjustBuiltinType(false, pDevice->getCompilerProductHelper().isHeaplessModeEnabled()), BuiltinCode::ECodeType::binary, *pDevice); EXPECT_EQ(BuiltinCode::ECodeType::binary, code.type); EXPECT_NE(0u, code.resource.size()); EXPECT_EQ(pDevice, code.targetDevice); @@ -1810,7 +1810,7 @@ TEST_F(BuiltInTests, GivenTypeIntermediateWhenCreatingProgramFromCodeThenNullPoi TEST_F(BuiltInTests, GivenTypeBinaryWhenCreatingProgramFromCodeThenValidPointerIsReturned) { auto builtinsLib = std::unique_ptr(new BuiltinsLib()); - const BuiltinCode bc = builtinsLib->getBuiltinCode(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); + const BuiltinCode bc = builtinsLib->getBuiltinCode(EBuiltInOps::adjustBuiltinType(false, pDevice->getCompilerProductHelper().isHeaplessModeEnabled()), BuiltinCode::ECodeType::binary, *pDevice); EXPECT_NE(0u, bc.resource.size()); auto program = std::unique_ptr(BuiltinDispatchInfoBuilder::createProgramFromCode(bc, toClDeviceVector(*pClDevice))); EXPECT_NE(nullptr, program.get()); @@ -1898,7 +1898,7 @@ TEST_F(BuiltInTests, givenSipKernelWhenAllocationFailsThenItHasNullptrGraphicsAl TEST_F(BuiltInTests, givenDebugFlagForceUseSourceWhenArgIsBinaryThenReturnBuiltinCodeBinary) { debugManager.flags.RebuildPrecompiledKernels.set(true); auto builtinsLib = std::unique_ptr(new BuiltinsLib()); - BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); + BuiltinCode code = builtinsLib->getBuiltinCode(EBuiltInOps::adjustBuiltinType(false, pDevice->getCompilerProductHelper().isHeaplessModeEnabled()), BuiltinCode::ECodeType::binary, *pDevice); EXPECT_EQ(BuiltinCode::ECodeType::binary, code.type); EXPECT_NE(0u, code.resource.size()); EXPECT_EQ(pDevice, code.targetDevice); diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index dd711885bd..31b7107312 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -1680,20 +1680,17 @@ TEST_F(ProgramTests, WhenCreatingProgramThenBindlessIsEnabledOnlyIfDebugFlagIsEn using namespace testing; DebugManagerStateRestore restorer; - { - + if (!pDevice->getCompilerProductHelper().isHeaplessModeEnabled()) { debugManager.flags.UseBindlessMode.set(0); MockProgram programNoBindless(pContext, false, toClDeviceVector(*pClDevice)); auto internalOptionsNoBindless = programNoBindless.getInternalOptions(); EXPECT_FALSE(CompilerOptions::contains(internalOptionsNoBindless, CompilerOptions::bindlessMode)) << internalOptionsNoBindless; } - { - debugManager.flags.UseBindlessMode.set(1); - MockProgram programBindless(pContext, false, toClDeviceVector(*pClDevice)); - auto internalOptionsBindless = programBindless.getInternalOptions(); - EXPECT_TRUE(CompilerOptions::contains(internalOptionsBindless, CompilerOptions::bindlessMode)) << internalOptionsBindless; - } + debugManager.flags.UseBindlessMode.set(1); + MockProgram programBindless(pContext, false, toClDeviceVector(*pClDevice)); + auto internalOptionsBindless = programBindless.getInternalOptions(); + EXPECT_TRUE(CompilerOptions::contains(internalOptionsBindless, CompilerOptions::bindlessMode)) << internalOptionsBindless; } TEST_F(ProgramTests, GivenForce32BitAddressesWhenProgramIsCreatedThenGreaterThan4gbBuffersRequiredIsCorrectlySet) { diff --git a/shared/source/helpers/compiler_product_helper.h b/shared/source/helpers/compiler_product_helper.h index dee683be07..4026047589 100644 --- a/shared/source/helpers/compiler_product_helper.h +++ b/shared/source/helpers/compiler_product_helper.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2024 Intel Corporation + * Copyright (C) 2021-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -86,6 +86,7 @@ class CompilerProductHelper { 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 const char *getCustomIgcLibraryName() const = 0; virtual const char *getFinalizerLibraryName() const = 0; @@ -139,6 +140,7 @@ class CompilerProductHelperHw : public CompilerProductHelper { 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; const char *getCustomIgcLibraryName() const override; const char *getFinalizerLibraryName() const override; diff --git a/shared/source/helpers/compiler_product_helper_base.inl b/shared/source/helpers/compiler_product_helper_base.inl index 949edd10b4..6982b2fd35 100644 --- a/shared/source/helpers/compiler_product_helper_base.inl +++ b/shared/source/helpers/compiler_product_helper_base.inl @@ -306,6 +306,11 @@ bool CompilerProductHelperHw::isBindlessAddressingDisabled(const Rel return true; } +template +bool CompilerProductHelperHw::isForceBindlessRequired() const { + return this->isHeaplessModeEnabled(); +} + template const char *CompilerProductHelperHw::getCustomIgcLibraryName() const { return nullptr; diff --git a/shared/test/common/mocks/mock_compiler_product_helper.h b/shared/test/common/mocks/mock_compiler_product_helper.h index 5774041b60..7b549346b3 100644 --- a/shared/test/common/mocks/mock_compiler_product_helper.h +++ b/shared/test/common/mocks/mock_compiler_product_helper.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 Intel Corporation + * Copyright (C) 2024-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -61,6 +61,7 @@ class MockCompilerProductHelper : public CompilerProductHelper { ADDMETHOD_CONST_NOBASE_VOIDRETURN(getKernelFp64AtomicCapabilities, (uint32_t & fp64Caps)); ADDMETHOD_CONST_NOBASE_VOIDRETURN(getKernelCapabilitiesExtra, (const ReleaseHelper *releaseHelper, uint32_t &extraCaps)); ADDMETHOD_CONST_NOBASE(isBindlessAddressingDisabled, bool, false, (const ReleaseHelper *releaseHelper)); + ADDMETHOD_CONST_NOBASE(isForceBindlessRequired, bool, false, ()); ADDMETHOD_CONST_NOBASE(getProductConfigFromHwInfo, uint32_t, 0, (const HardwareInfo &hwInfo)); ADDMETHOD_CONST_NOBASE(getCustomIgcLibraryName, const char *, nullptr, ()); ADDMETHOD_CONST_NOBASE(getFinalizerLibraryName, const char *, nullptr, ());