From 1c8a503ca4a90666a83336da676483c331bafc57 Mon Sep 17 00:00:00 2001 From: Fabian Zwolinski Date: Wed, 10 Nov 2021 12:09:53 +0100 Subject: [PATCH] Add initial AIL implementation Related-To: NEO-6390 Signed-off-by: Fabian Zwolinski --- shared/source/ail/ail_configuration.cpp | 23 +++++++++++++++++- shared/source/ail/ail_configuration.h | 14 +++++++++++ .../ail/linux/ail_configuration_linux.cpp | 2 ++ .../ail/windows/ail_configuration_windows.cpp | 2 ++ shared/test/unit_test/ail/ail_tests.cpp | 24 +++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/shared/source/ail/ail_configuration.cpp b/shared/source/ail/ail_configuration.cpp index d7cb165ad3..6afa237b33 100644 --- a/shared/source/ail/ail_configuration.cpp +++ b/shared/source/ail/ail_configuration.cpp @@ -11,7 +11,14 @@ #include namespace NEO { -std::map> applicationMap = {}; +/* + * fp64 support is unavailable on some Intel GPUs, and the SW emulation in IGC should not be enabled by default. + * For Blender, fp64 is not performance-critical - SW emulation is good enough for the application to be usable + * (some versions would not function correctly without it). + * + */ + +std::map> applicationMap = {{"blender", {AILEnumeration::ENABLE_FP64}}}; AILConfiguration *ailConfigurationTable[IGFX_MAX_PRODUCT] = {}; @@ -20,6 +27,20 @@ AILConfiguration *AILConfiguration::get(PRODUCT_FAMILY productFamily) { } void AILConfiguration::apply(RuntimeCapabilityTable &runtimeCapabilityTable) { + auto search = applicationMap.find(processName); + + if (search != applicationMap.end()) { + for (size_t i = 0; i < search->second.size(); ++i) { + switch (search->second[i]) { + case AILEnumeration::ENABLE_FP64: + runtimeCapabilityTable.ftrSupportsFP64 = true; + break; + default: + break; + } + } + } + applyExt(runtimeCapabilityTable); } diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index 17554c69d7..b8409ccdc5 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -11,6 +11,20 @@ #pragma once +/* + * AIL (Application Intelligence Layer) is a set of per-application controls that influence driver behavior. + * The primary goal is to improve user experience and/or performance. + * + * AIL provides application detection mechanism based on running processes in the system. + * Mechanism works on Windows and Linux, is flexible and easily extendable to new applications. + * + * E.g. AIL can detect running Blender application and enable fp64 emulation on hardware + * that does not support native fp64. + * + * Disclaimer: we should never use this for benchmarking or conformance purposes - this would be cheating. + * + */ + namespace NEO { enum class AILEnumeration : uint32_t { diff --git a/shared/source/ail/linux/ail_configuration_linux.cpp b/shared/source/ail/linux/ail_configuration_linux.cpp index cf2582e29d..7e40ccd559 100644 --- a/shared/source/ail/linux/ail_configuration_linux.cpp +++ b/shared/source/ail/linux/ail_configuration_linux.cpp @@ -10,6 +10,8 @@ #include +// Application detection is performed using the process name of the given application. + namespace NEO { bool AILConfiguration::initProcessExecutableName() { char path[512] = {0}; diff --git a/shared/source/ail/windows/ail_configuration_windows.cpp b/shared/source/ail/windows/ail_configuration_windows.cpp index 42bdff710d..7591e753dc 100644 --- a/shared/source/ail/windows/ail_configuration_windows.cpp +++ b/shared/source/ail/windows/ail_configuration_windows.cpp @@ -8,6 +8,8 @@ #include "shared/source/ail/ail_configuration.h" #include "shared/source/os_interface/windows/sys_calls.h" +// Application detection is performed using the process name of the given application. + namespace NEO { bool AILConfiguration::initProcessExecutableName() { const DWORD length = MAX_PATH; diff --git a/shared/test/unit_test/ail/ail_tests.cpp b/shared/test/unit_test/ail/ail_tests.cpp index 890fe9fa59..994b364a4c 100644 --- a/shared/test/unit_test/ail/ail_tests.cpp +++ b/shared/test/unit_test/ail/ail_tests.cpp @@ -7,6 +7,7 @@ #include "shared/source/ail/ail_configuration.h" #include "shared/test/common/helpers/unit_test_helper.h" +#include "shared/test/common/helpers/variable_backup.h" #include "test.h" @@ -14,10 +15,33 @@ namespace NEO { using IsSKL = IsProduct; using AILTests = ::testing::Test; +template +class AILMock : public AILConfigurationHw { + public: + using AILConfiguration::processName; +}; HWTEST2_F(AILTests, givenUninitializedTemplateWhenGetAILConfigurationThenNullptrIsReturned, IsSKL) { auto ailConfiguration = AILConfiguration::get(productFamily); ASSERT_EQ(nullptr, ailConfiguration); } + +HWTEST2_F(AILTests, givenInitilizedTemplateWhenApplyWithBlenderIsCalledThenFP64SupportIsEnabled, IsAtLeastGen12lp) { + VariableBackup ailConfigurationBackup(&ailConfigurationTable[productFamily]); + + AILMock ailTemp; + ailTemp.processName = "blender"; + ailConfigurationTable[productFamily] = &ailTemp; + + auto ailConfiguration = AILConfiguration::get(productFamily); + ASSERT_NE(nullptr, ailConfiguration); + + NEO::RuntimeCapabilityTable rtTable = {}; + rtTable.ftrSupportsFP64 = false; + + ailConfiguration->apply(rtTable); + + EXPECT_EQ(rtTable.ftrSupportsFP64, true); +} } // namespace NEO \ No newline at end of file