diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index c8eac8ff60..f61351a169 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -1,10 +1,11 @@ /* - * Copyright (C) 2018-2023 Intel Corporation + * Copyright (C) 2018-2024 Intel Corporation * * SPDX-License-Identifier: MIT * */ +#include "shared/source/ail/ail_configuration.h" #include "shared/source/compiler_interface/compiler_interface.h" #include "shared/source/compiler_interface/compiler_options.h" #include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h" @@ -12,6 +13,7 @@ #include "shared/source/device/device.h" #include "shared/source/device_binary_format/device_binary_formats.h" #include "shared/source/execution_environment/execution_environment.h" +#include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/helpers/addressing_mode_helper.h" #include "shared/source/helpers/compiler_options_parser.h" #include "shared/source/program/kernel_info.h" @@ -95,6 +97,10 @@ cl_int Program::build( appendAdditionalExtensions(extensions, options, internalOptions); CompilerOptions::concatenateAppend(internalOptions, extensions); + if (defaultDevice.getRootDeviceEnvironment().getAILConfigurationHelper()->handleDivergentBarriers()) { + CompilerOptions::concatenateAppend(internalOptions, CompilerOptions::enableDivergentBarriers); + } + if (!this->getIsBuiltIn() && debugManager.flags.InjectInternalBuildOptions.get() != "unk") { NEO::CompilerOptions::concatenateAppend(internalOptions, NEO::debugManager.flags.InjectInternalBuildOptions.get()); } diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index 1fff10a20f..1a21436251 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -36,6 +36,7 @@ #include "shared/test/common/helpers/test_files.h" #include "shared/test/common/libult/global_environment.h" #include "shared/test/common/libult/ult_command_stream_receiver.h" +#include "shared/test/common/mocks/mock_ail_configuration.h" #include "shared/test/common/mocks/mock_allocation_properties.h" #include "shared/test/common/mocks/mock_compiler_interface.h" #include "shared/test/common/mocks/mock_elf.h" @@ -2731,6 +2732,40 @@ TEST_F(ProgramTests, GivenInjectInternalBuildOptionsWhenBuildingBuiltInProgramTh EXPECT_FALSE(CompilerOptions::contains(cip->buildInternalOptions, "-abc")) << cip->buildInternalOptions; } +TEST_F(ProgramTests, GivenAilWithHandleDivergentBarriersSetTrueOptionsWhenCompilingProgramThenInternalOptionsWereAppended) { + auto cip = new MockCompilerInterfaceCaptureBuildOptions(); + auto pDevice = pContext->getDevice(0); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAIL = static_cast(pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->ailConfiguration.get()); + mockAIL->setHandleDivergentBarriers(true); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->compilerInterface.reset(cip); + auto program = std::make_unique(toClDeviceVector(*pDevice)); + program->sourceCode = "__kernel mock() {}"; + program->createdFrom = Program::CreatedFrom::source; + + cl_int retVal = program->build(program->getDevices(), ""); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_TRUE(CompilerOptions::contains(cip->buildInternalOptions, CompilerOptions::enableDivergentBarriers)) << cip->buildInternalOptions; +} + +TEST_F(ProgramTests, GivenAilWithHandleDivergentBarriersSetFalseOptionsWhenCompilingProgramThenInternalOptionsWereAppended) { + auto cip = new MockCompilerInterfaceCaptureBuildOptions(); + auto pDevice = pContext->getDevice(0); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAIL = static_cast(pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->ailConfiguration.get()); + mockAIL->setHandleDivergentBarriers(false); + pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->compilerInterface.reset(cip); + auto program = std::make_unique(toClDeviceVector(*pDevice)); + program->sourceCode = "__kernel mock() {}"; + program->createdFrom = Program::CreatedFrom::source; + + cl_int retVal = program->build(program->getDevices(), ""); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_FALSE(CompilerOptions::contains(cip->buildInternalOptions, CompilerOptions::enableDivergentBarriers)) << cip->buildInternalOptions; +} + TEST_F(ProgramTests, GivenInjectInternalBuildOptionsWhenCompilingProgramThenInternalOptionsWereAppended) { DebugManagerStateRestore dbgRestorer; debugManager.flags.InjectInternalBuildOptions.set("-abc"); diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index cea79ffced..dfcd561f79 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -40,6 +40,7 @@ enum class AILEnumeration : uint32_t { disableHostPtrTracking, enableLegacyPlatformName, disableDirectSubmission, + handleDivergentBarriers, }; class AILConfiguration; @@ -76,12 +77,15 @@ class AILConfiguration { virtual bool forceRcs() = 0; + virtual bool handleDivergentBarriers() = 0; + protected: virtual void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) = 0; std::string processName; bool sourcesContain(const std::string &sources, std::string_view contentToFind) const; MOCKABLE_VIRTUAL bool isKernelHashCorrect(const std::string &kernelSources, uint64_t expectedHash) const; + virtual void setHandleDivergentBarriers(bool val) = 0; }; extern const std::set applicationsContextSyncFlag; @@ -104,8 +108,13 @@ class AILConfigurationHw : public AILConfiguration { bool isBufferPoolEnabled() override; bool useLegacyValidationLogic() override; bool forceRcs() override; + bool handleDivergentBarriers() override; bool shouldForceRcs = false; + bool shouldHandleDivergentBarriers = false; + + protected: + void setHandleDivergentBarriers(bool val) override; }; template diff --git a/shared/source/ail/ail_configuration_base.inl b/shared/source/ail/ail_configuration_base.inl index c4ccafe60f..7d0fa83ae0 100644 --- a/shared/source/ail/ail_configuration_base.inl +++ b/shared/source/ail/ail_configuration_base.inl @@ -60,4 +60,13 @@ inline bool AILConfigurationHw::forceRcs() { return shouldForceRcs; } +template +inline bool AILConfigurationHw::handleDivergentBarriers() { + return shouldHandleDivergentBarriers; +} +template +inline void AILConfigurationHw::setHandleDivergentBarriers(bool val) { + shouldHandleDivergentBarriers = val; +} + } // namespace NEO diff --git a/shared/source/compiler_interface/compiler_options.h b/shared/source/compiler_interface/compiler_options.h index 7853e77d03..5365977307 100644 --- a/shared/source/compiler_interface/compiler_options.h +++ b/shared/source/compiler_interface/compiler_options.h @@ -44,6 +44,7 @@ inline constexpr ConstStringRef autoGrf = "-cl-intel-enable-auto-large-GRF-mode" inline constexpr ConstStringRef numThreadsPerEu = "-cl-intel-reqd-eu-thread-count"; inline constexpr ConstStringRef useCMCompiler = "-cmc"; inline constexpr ConstStringRef enableFP64GenEmu = "-cl-fp64-gen-emu"; +inline constexpr ConstStringRef enableDivergentBarriers = "-cl-intel-enable-divergent-barrier-handling"; inline constexpr size_t nullterminateSize = 1U; inline constexpr size_t spaceSeparatorSize = 1U; diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index 09213ca387..ac244dcec8 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -41,6 +41,14 @@ class MockAILConfiguration : public AILConfiguration { return forceRcsValue; } + bool handleDivergentBarriers() override { + return handleDivergentBarriersValue; + } + void setHandleDivergentBarriers(bool val) override { + handleDivergentBarriersValue = val; + } + bool handleDivergentBarriersValue = false; + protected: void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) override {} };