diff --git a/opencl/source/program/create.inl b/opencl/source/program/create.inl index 29d5f4a9f2..60ddd28744 100644 --- a/opencl/source/program/create.inl +++ b/opencl/source/program/create.inl @@ -78,6 +78,9 @@ T *Program::create( } program = new T(pContext, false, pContext->getDevices()); + if (ail && ail->isFallbackToPatchtokensRequired()) { + pContext->setContextAsNonZebin(); + } program->sourceCode.swap(combinedString); program->createdFrom = CreatedFrom::source; } diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index f0561f9f94..79fa0c1196 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -681,7 +681,7 @@ void MinimumProgramFixture::TearDown() { NEO::PlatformFixture::tearDown(); } -HWTEST2_F(MinimumProgramFixture, givenEmptyAilWhenCreateProgramWithSourcesThenSourcesDoNotChange, IsDG2) { +TEST_F(MinimumProgramFixture, givenEmptyAilWhenCreateProgramWithSourcesThenSourcesDoNotChange) { auto pDevice = pContext->getDevice(0); auto rootDeviceEnvironment = pDevice->getExecutionEnvironment()->rootDeviceEnvironments[rootDeviceIndex].get(); rootDeviceEnvironment->ailConfiguration.reset(nullptr); @@ -702,6 +702,38 @@ HWTEST2_F(MinimumProgramFixture, givenEmptyAilWhenCreateProgramWithSourcesThenSo pProgram->release(); } +TEST_F(MinimumProgramFixture, givenAILReturningTrueForFallbackRequirementWhenBuildingProgramThenMarkContextAsNonZebin) { + class MockAIL : public MockAILConfiguration { + public: + bool isFallbackToPatchtokensRequired() override { + return true; + } + }; + auto pDevice = pContext->getDevice(0); + auto rootDeviceEnvironment = pDevice->getExecutionEnvironment()->rootDeviceEnvironments[rootDeviceIndex].get(); + rootDeviceEnvironment->ailConfiguration.reset(new MockAIL()); + + ASSERT_FALSE(pContext->checkIfContextIsNonZebin()); + + const char *kernelSources[] = {"some source code"}; + size_t knownSourceSize = strlen(kernelSources[0]); + MockProgram *pProgram = nullptr; + pProgram = Program::create( + pContext, + 1, + kernelSources, + &knownSourceSize, + retVal); + + ASSERT_NE(nullptr, pProgram); + ASSERT_EQ(CL_SUCCESS, retVal); + + retVal = pProgram->build(pProgram->getDevices(), ""); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_TRUE(pContext->checkIfContextIsNonZebin()); + pProgram->release(); +} + TEST_F(MinimumProgramFixture, givenApplicationContextMarkedAsNonZebinWhenBuildingProgramThenInternalOptionsShouldContainDisableZebinOption) { const char *kernelSources[] = {"some source code"}; size_t knownSourceSize = strlen(kernelSources[0]); diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index 913d888ef6..0389e473e7 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -88,6 +88,8 @@ class AILConfiguration { virtual bool isRunAloneContextRequired() = 0; + virtual bool isFallbackToPatchtokensRequired() = 0; + protected: virtual void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) = 0; std::string processName; @@ -105,6 +107,7 @@ extern const std::set applicationsBufferPoolDisabledDg2; extern const std::set applicationsOverfetchDisabled; extern const std::set applicationsDrainHostptrsDisabled; extern const std::set applicationsDeviceUSMRecyclingLimited; +extern const std::set applicationsFallbackToPatchtokensRequiredDg2; template class AILConfigurationHw : public AILConfiguration { @@ -127,6 +130,7 @@ class AILConfigurationHw : public AILConfiguration { bool disableBindlessAddressing() override; bool limitAmountOfDeviceMemoryForRecycling() override; bool isRunAloneContextRequired() override; + bool isFallbackToPatchtokensRequired() override; bool shouldForceRcs = false; bool shouldHandleDivergentBarriers = false; diff --git a/shared/source/ail/ail_configuration_base.inl b/shared/source/ail/ail_configuration_base.inl index 5179d70311..2eec3b05c6 100644 --- a/shared/source/ail/ail_configuration_base.inl +++ b/shared/source/ail/ail_configuration_base.inl @@ -76,4 +76,9 @@ inline bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() return false; } +template +inline bool AILConfigurationHw::isFallbackToPatchtokensRequired() { + return false; +} + } // namespace NEO diff --git a/shared/source/ail/ail_configuration_extra.cpp b/shared/source/ail/ail_configuration_extra.cpp index 11021199bc..21a9591060 100644 --- a/shared/source/ail/ail_configuration_extra.cpp +++ b/shared/source/ail/ail_configuration_extra.cpp @@ -42,6 +42,8 @@ const std::set applicationsDrainHostptrsDisabled = {}; const std::set applicationsDeviceUSMRecyclingLimited = {}; +const std::set applicationsFallbackToPatchtokensRequiredDg2 = {}; + AILConfigurationCreateFunctionType ailConfigurationFactory[IGFX_MAX_PRODUCT]; void AILConfiguration::apply(RuntimeCapabilityTable &runtimeCapabilityTable) { diff --git a/shared/source/ail/xe_hpg_core/dg2/ail_configuration_dg2.cpp b/shared/source/ail/xe_hpg_core/dg2/ail_configuration_dg2.cpp index 51adca0d06..b5303552e1 100644 --- a/shared/source/ail/xe_hpg_core/dg2/ail_configuration_dg2.cpp +++ b/shared/source/ail/xe_hpg_core/dg2/ail_configuration_dg2.cpp @@ -70,6 +70,12 @@ bool AILConfigurationHw::isBufferPoolEnabled() { return iterator == applicationsBufferPoolDisabledDg2.end(); } +template <> +inline bool AILConfigurationHw::isFallbackToPatchtokensRequired() { + auto iterator = applicationsFallbackToPatchtokensRequiredDg2.find(processName); + return iterator != applicationsFallbackToPatchtokensRequiredDg2.end(); +} + template class AILConfigurationHw; } // namespace NEO diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index 184ba36da3..5e388b687c 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -72,6 +72,10 @@ class MockAILConfiguration : public AILConfiguration { return true; } + bool isFallbackToPatchtokensRequired() override { + return false; + } + protected: void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) override {} }; diff --git a/shared/test/unit_test/ail/ail_tests.cpp b/shared/test/unit_test/ail/ail_tests.cpp index 729ed1cf78..f86dcf5f60 100644 --- a/shared/test/unit_test/ail/ail_tests.cpp +++ b/shared/test/unit_test/ail/ail_tests.cpp @@ -112,22 +112,28 @@ HWTEST2_F(AILTests, whenModifyKernelIfRequiredIsCalledThenDontChangeKernelSource EXPECT_STREQ(copyKernel.c_str(), kernelSources.c_str()); } -HWTEST2_F(AILTests, GivenAilWhenCheckingContextSyncFlagRequiredThenExpectFalse, MatchAny) { +HWTEST2_F(AILTests, givenAilWhenCheckingContextSyncFlagRequiredThenExpectFalse, MatchAny) { AILWhitebox ail; ail.processName = "other"; EXPECT_FALSE(ail.isContextSyncFlagRequired()); } -HWTEST2_F(AILTests, GivenAilWhenCheckingOverfetchDisableRequiredThenExpectFalse, MatchAny) { +HWTEST2_F(AILTests, givenAilWhenCheckingOverfetchDisableRequiredThenExpectFalse, MatchAny) { AILWhitebox ail; ail.processName = "other"; EXPECT_FALSE(ail.is256BPrefetchDisableRequired()); } -HWTEST2_F(AILTests, GivenAilWhenCheckingDrainHostptrsRequiredThenExpectTrue, MatchAny) { +HWTEST2_F(AILTests, givenAilWhenCheckingDrainHostptrsRequiredThenExpectTrue, MatchAny) { AILWhitebox ail; ail.processName = "other"; EXPECT_TRUE(ail.drainHostptrs()); } +HWTEST2_F(AILTests, givenAilWhenCheckingIfPatchtokenFallbackIsRequiredThenExpectFalse, MatchAny) { + AILWhitebox ail; + ail.processName = "other"; + EXPECT_FALSE(ail.isFallbackToPatchtokensRequired()); +} + } // namespace NEO diff --git a/shared/test/unit_test/ail/ail_tests_base.cpp b/shared/test/unit_test/ail/ail_tests_base.cpp deleted file mode 100644 index 8423646c4a..0000000000 --- a/shared/test/unit_test/ail/ail_tests_base.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2023-2024 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/ail/ail_configuration.h" -#include "shared/test/common/test_macros/hw_test.h" - -namespace NEO { - -using AILBaseTests = ::testing::Test; - -HWTEST2_F(AILBaseTests, whenKernelSourceIsANGenDummyKernelThenDoEnforcePatchtokensFormat, MatchAny) { - std::string dummyKernelSource{"kernel void _(){}"}; - AILConfigurationHw ail; - EXPECT_TRUE(ail.isFallbackToPatchtokensRequired(dummyKernelSource)); -} - -HWTEST2_F(AILBaseTests, whenKernelSourceIsNotANGenDummyKernelThenDoNotEnforcePatchtokensFormat, MatchAny) { - std::string dummyKernelSource{"kernel void copybuffer(__global int* a, __global int* b){ //some code }"}; - AILConfigurationHw ail; - EXPECT_FALSE(ail.isFallbackToPatchtokensRequired(dummyKernelSource)); -} - -} // namespace NEO