From 815122450148b953201ec35cda498f31e627a296 Mon Sep 17 00:00:00 2001 From: Maciej Plewka Date: Wed, 11 Dec 2024 10:18:07 +0000 Subject: [PATCH] fix: add microsecond resolution for timeout Related-To: NEO-13445 Signed-off-by: Maciej Plewka --- level_zero/core/source/cmdqueue/cmdqueue.cpp | 3 +- shared/source/ail/CMakeLists.txt | 3 +- shared/source/ail/ail_configuration.h | 10 +++++ shared/source/ail/ail_configuration_base.inl | 10 +++++ shared/source/ail/ail_configuration_extra.cpp | 4 ++ .../ail/ail_configuration_tgllp_and_later.inl | 17 +++++++ .../gen12lp/adln/ail_configuration_adln.cpp | 8 +++- .../gen12lp/adlp/ail_configuration_adlp.cpp | 8 +++- .../gen12lp/adls/ail_configuration_adls.cpp | 8 +++- .../ail/gen12lp/rkl/ail_configuration_rkl.cpp | 8 +++- .../gen12lp/tgllp/ail_configuration_tgllp.cpp | 8 +++- .../xe_hpg_core/mtl/ail_configuration_mtl.cpp | 18 +++++--- shared/source/device/device.cpp | 4 ++ shared/source/device/device.h | 4 ++ shared/source/os_interface/device_factory.cpp | 1 + .../common/mocks/mock_ail_configuration.h | 12 +++++ shared/test/common/mocks/mock_device.h | 1 + shared/test/unit_test/ail/ail_tests.cpp | 5 +++ .../unit_test/device/neo_device_tests.cpp | 7 +++ .../execution_environment_tests.cpp | 45 +++++++++++++++++++ 20 files changed, 165 insertions(+), 19 deletions(-) create mode 100644 shared/source/ail/ail_configuration_tgllp_and_later.inl diff --git a/level_zero/core/source/cmdqueue/cmdqueue.cpp b/level_zero/core/source/cmdqueue/cmdqueue.cpp index 85ad92e278..b62479578c 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue.cpp +++ b/level_zero/core/source/cmdqueue/cmdqueue.cpp @@ -171,7 +171,8 @@ ze_result_t CommandQueueImp::synchronizeByPollingForTaskCount(uint64_t timeoutNa auto taskCountToWait = getTaskCount(); bool enableTimeout = true; - int64_t timeoutMicroseconds = static_cast(timeoutNanoseconds / 1000); + auto microsecondResolution = device->getNEODevice()->getMicrosecondResolution(); + int64_t timeoutMicroseconds = static_cast(timeoutNanoseconds / microsecondResolution); if (timeoutNanoseconds == std::numeric_limits::max()) { enableTimeout = false; timeoutMicroseconds = NEO::TimeoutControls::maxTimeout; diff --git a/shared/source/ail/CMakeLists.txt b/shared/source/ail/CMakeLists.txt index 99a29a0cd4..ddcc7f413b 100644 --- a/shared/source/ail/CMakeLists.txt +++ b/shared/source/ail/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2021-2022 Intel Corporation +# Copyright (C) 2021-2024 Intel Corporation # # SPDX-License-Identifier: MIT # @@ -10,6 +10,7 @@ set(NEO_CORE_AIL ${CMAKE_CURRENT_SOURCE_DIR}/ail_configuration.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}ail_configuration_extra.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ail_configuration_base.inl + ${CMAKE_CURRENT_SOURCE_DIR}/ail_configuration_tgllp_and_later.inl ) set_property(GLOBAL PROPERTY NEO_CORE_AIL ${NEO_CORE_AIL}) diff --git a/shared/source/ail/ail_configuration.h b/shared/source/ail/ail_configuration.h index e6b733d9ce..bac17d4d46 100644 --- a/shared/source/ail/ail_configuration.h +++ b/shared/source/ail/ail_configuration.h @@ -90,6 +90,10 @@ class AILConfiguration { virtual bool isFallbackToPatchtokensRequired() = 0; + virtual bool isAdjustMicrosecondResolutionRequired() = 0; + + virtual uint32_t getMicrosecondResolution() = 0; + protected: virtual void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) = 0; std::string processName; @@ -108,6 +112,9 @@ extern const std::set applicationsOverfetchDisabled; extern const std::set applicationsDrainHostptrsDisabled; extern const std::set applicationsDeviceUSMRecyclingLimited; extern const std::set applicationsFallbackToPatchtokensRequiredDg2; +extern const std::set applicationsMicrosecontResolutionAdjustment; + +extern const uint32_t microsecondAdjustment; template class AILConfigurationHw : public AILConfiguration { @@ -131,10 +138,13 @@ class AILConfigurationHw : public AILConfiguration { bool limitAmountOfDeviceMemoryForRecycling() override; bool isRunAloneContextRequired() override; bool isFallbackToPatchtokensRequired() override; + bool isAdjustMicrosecondResolutionRequired() override; + uint32_t getMicrosecondResolution() override; bool shouldForceRcs = false; bool shouldHandleDivergentBarriers = false; bool shouldDisableBindlessAddressing = false; + bool shouldAdjustMicrosecondResolution = false; protected: void setHandleDivergentBarriers(bool val) override; diff --git a/shared/source/ail/ail_configuration_base.inl b/shared/source/ail/ail_configuration_base.inl index 2eec3b05c6..0ff8410575 100644 --- a/shared/source/ail/ail_configuration_base.inl +++ b/shared/source/ail/ail_configuration_base.inl @@ -81,4 +81,14 @@ inline bool AILConfigurationHw::isFallbackToPatchtokensRequired() { return false; } +template +inline bool AILConfigurationHw::isAdjustMicrosecondResolutionRequired() { + return shouldAdjustMicrosecondResolution; +} + +template +inline uint32_t AILConfigurationHw::getMicrosecondResolution() { + return microsecondAdjustment; +} + } // namespace NEO diff --git a/shared/source/ail/ail_configuration_extra.cpp b/shared/source/ail/ail_configuration_extra.cpp index 41d25ddc93..d2103a38df 100644 --- a/shared/source/ail/ail_configuration_extra.cpp +++ b/shared/source/ail/ail_configuration_extra.cpp @@ -44,6 +44,10 @@ const std::set applicationsDeviceUSMRecyclingLimited = {}; const std::set applicationsFallbackToPatchtokensRequiredDg2 = {}; +const std::set applicationsMicrosecontResolutionAdjustment = {}; + +const uint32_t microsecondAdjustment = 1000; + AILConfigurationCreateFunctionType ailConfigurationFactory[IGFX_MAX_PRODUCT]; void AILConfiguration::apply(RuntimeCapabilityTable &runtimeCapabilityTable) { diff --git a/shared/source/ail/ail_configuration_tgllp_and_later.inl b/shared/source/ail/ail_configuration_tgllp_and_later.inl new file mode 100644 index 0000000000..863fac7b3a --- /dev/null +++ b/shared/source/ail/ail_configuration_tgllp_and_later.inl @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/ail/ail_configuration.h" + +namespace NEO { + +template <> +inline bool AILConfigurationHw::isAdjustMicrosecondResolutionRequired() { + auto iterator = applicationsMicrosecontResolutionAdjustment.find(processName); + return iterator != applicationsMicrosecontResolutionAdjustment.end(); +} +} // namespace NEO \ No newline at end of file diff --git a/shared/source/ail/gen12lp/adln/ail_configuration_adln.cpp b/shared/source/ail/gen12lp/adln/ail_configuration_adln.cpp index a1556be506..f2e151714f 100644 --- a/shared/source/ail/gen12lp/adln/ail_configuration_adln.cpp +++ b/shared/source/ail/gen12lp/adln/ail_configuration_adln.cpp @@ -10,11 +10,15 @@ #include #include +constexpr static auto gfxProduct = IGFX_ALDERLAKE_N; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { -static EnableAIL enableAILADLN; +static EnableAIL enableAILADLN; std::map> applicationMapADLN = {}; -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/ail/gen12lp/adlp/ail_configuration_adlp.cpp b/shared/source/ail/gen12lp/adlp/ail_configuration_adlp.cpp index 0a300587fd..fdab30313c 100644 --- a/shared/source/ail/gen12lp/adlp/ail_configuration_adlp.cpp +++ b/shared/source/ail/gen12lp/adlp/ail_configuration_adlp.cpp @@ -10,11 +10,15 @@ #include #include +constexpr static auto gfxProduct = IGFX_ALDERLAKE_P; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { -static EnableAIL enableAILADLP; +static EnableAIL enableAILADLP; std::map> applicationMapADLP = {}; -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/ail/gen12lp/adls/ail_configuration_adls.cpp b/shared/source/ail/gen12lp/adls/ail_configuration_adls.cpp index f2906d9553..299453f3bb 100644 --- a/shared/source/ail/gen12lp/adls/ail_configuration_adls.cpp +++ b/shared/source/ail/gen12lp/adls/ail_configuration_adls.cpp @@ -10,11 +10,15 @@ #include #include +constexpr static auto gfxProduct = IGFX_ALDERLAKE_S; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { -static EnableAIL enableAILADLS; +static EnableAIL enableAILADLS; std::map> applicationMapADLS = {}; -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/ail/gen12lp/rkl/ail_configuration_rkl.cpp b/shared/source/ail/gen12lp/rkl/ail_configuration_rkl.cpp index f4e56b0d19..1db4bb9600 100644 --- a/shared/source/ail/gen12lp/rkl/ail_configuration_rkl.cpp +++ b/shared/source/ail/gen12lp/rkl/ail_configuration_rkl.cpp @@ -10,11 +10,15 @@ #include #include +constexpr static auto gfxProduct = IGFX_ROCKETLAKE; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { -static EnableAIL enableAILRKL; +static EnableAIL enableAILRKL; std::map> applicationMapRKL = {}; -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/ail/gen12lp/tgllp/ail_configuration_tgllp.cpp b/shared/source/ail/gen12lp/tgllp/ail_configuration_tgllp.cpp index 7b42eb807b..1c39c41eb1 100644 --- a/shared/source/ail/gen12lp/tgllp/ail_configuration_tgllp.cpp +++ b/shared/source/ail/gen12lp/tgllp/ail_configuration_tgllp.cpp @@ -10,11 +10,15 @@ #include #include +constexpr static auto gfxProduct = IGFX_TIGERLAKE_LP; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { -static EnableAIL enableAILTGLLP; +static EnableAIL enableAILTGLLP; std::map> applicationMapTGLLP = {}; -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp b/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp index d4656458a8..0139e84528 100644 --- a/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp +++ b/shared/source/ail/xe_hpg_core/mtl/ail_configuration_mtl.cpp @@ -14,17 +14,21 @@ #include #include +constexpr static auto gfxProduct = IGFX_METEORLAKE; + +#include "shared/source/ail/ail_configuration_tgllp_and_later.inl" + namespace NEO { extern std::map> applicationMapMTL; -static EnableAIL enableAILMTL; +static EnableAIL enableAILMTL; constexpr std::array applicationsLegacyValidationPathMtl = { "blender", "bforartists", "cycles"}; template <> -void AILConfigurationHw::applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) { +void AILConfigurationHw::applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) { auto search = applicationMapMTL.find(processName); if (search != applicationMapMTL.end()) { for (size_t i = 0; i < search->second.size(); ++i) { @@ -39,13 +43,13 @@ void AILConfigurationHw::applyExt(RuntimeCapabilityTable &runti } template <> -bool AILConfigurationHw::isContextSyncFlagRequired() { +bool AILConfigurationHw::isContextSyncFlagRequired() { auto iterator = applicationsContextSyncFlag.find(processName); return iterator != applicationsContextSyncFlag.end(); } template <> -bool AILConfigurationHw::useLegacyValidationLogic() { +bool AILConfigurationHw::useLegacyValidationLogic() { auto it = std::find_if(applicationsLegacyValidationPathMtl.begin(), applicationsLegacyValidationPathMtl.end(), [this](const auto &appName) { return this->processName == appName; }); @@ -53,17 +57,17 @@ bool AILConfigurationHw::useLegacyValidationLogic() { } template <> -bool AILConfigurationHw::isBufferPoolEnabled() { +bool AILConfigurationHw::isBufferPoolEnabled() { auto iterator = applicationsBufferPoolDisabled.find(processName); return iterator == applicationsBufferPoolDisabled.end(); } template <> -bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() { +bool AILConfigurationHw::limitAmountOfDeviceMemoryForRecycling() { auto iterator = applicationsDeviceUSMRecyclingLimited.find(processName); return iterator != applicationsDeviceUSMRecyclingLimited.end(); } -template class AILConfigurationHw; +template class AILConfigurationHw; } // namespace NEO diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index 253dad2e9e..7916cc333b 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -7,6 +7,7 @@ #include "shared/source/device/device.h" +#include "shared/source/ail/ail_configuration.h" #include "shared/source/built_ins/sip.h" #include "shared/source/command_stream/command_stream_receiver.h" #include "shared/source/command_stream/preemption.h" @@ -43,6 +44,9 @@ Device::Device(ExecutionEnvironment *executionEnvironment, const uint32_t rootDe : executionEnvironment(executionEnvironment), rootDeviceIndex(rootDeviceIndex), isaPoolAllocator(this) { this->executionEnvironment->incRefInternal(); this->executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->setDummyBlitProperties(rootDeviceIndex); + if (auto ailHelper = this->executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->getAILConfigurationHelper(); ailHelper && ailHelper->isAdjustMicrosecondResolutionRequired()) { + microsecondResolution = ailHelper->getMicrosecondResolution(); + } } Device::~Device() { diff --git a/shared/source/device/device.h b/shared/source/device/device.h index 5ff0e4fb85..63f5e270e4 100644 --- a/shared/source/device/device.h +++ b/shared/source/device/device.h @@ -233,6 +233,9 @@ class Device : public ReferenceTrackedObject { size_t getAllocationsSavedForReuseSize() const { return allocationsSavedForReuseSize; } + uint32_t getMicrosecondResolution() const { + return microsecondResolution; + } protected: Device() = delete; @@ -311,6 +314,7 @@ class Device : public ReferenceTrackedObject { std::unique_ptr deviceUsmMemAllocPoolsManager; size_t allocationsSavedForReuseSize = 0u; + uint32_t microsecondResolution = 1000u; mutable std::mutex allocationsReuseMtx; struct { diff --git a/shared/source/os_interface/device_factory.cpp b/shared/source/os_interface/device_factory.cpp index 777eee7429..6150c56e24 100644 --- a/shared/source/os_interface/device_factory.cpp +++ b/shared/source/os_interface/device_factory.cpp @@ -7,6 +7,7 @@ #include "shared/source/os_interface/device_factory.h" +#include "shared/source/ail/ail_configuration.h" #include "shared/source/aub/aub_center.h" #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/device/root_device.h" diff --git a/shared/test/common/mocks/mock_ail_configuration.h b/shared/test/common/mocks/mock_ail_configuration.h index 5e388b687c..d18b1bbe47 100644 --- a/shared/test/common/mocks/mock_ail_configuration.h +++ b/shared/test/common/mocks/mock_ail_configuration.h @@ -76,6 +76,18 @@ class MockAILConfiguration : public AILConfiguration { return false; } + bool isAdjustMicrosecondResolutionRequired() override { + return adjustMicrosecondResolution; + } + bool adjustMicrosecondResolution = false; + + uint32_t getMicrosecondResolution() override { + getMicrosecondResolutionCalledTimes++; + return mockMicrosecondResolution; + } + uint32_t getMicrosecondResolutionCalledTimes = 0u; + uint32_t mockMicrosecondResolution = 1000u; + protected: void applyExt(RuntimeCapabilityTable &runtimeCapabilityTable) override {} }; diff --git a/shared/test/common/mocks/mock_device.h b/shared/test/common/mocks/mock_device.h index c10e2b14e2..552221fefe 100644 --- a/shared/test/common/mocks/mock_device.h +++ b/shared/test/common/mocks/mock_device.h @@ -65,6 +65,7 @@ class MockDevice : public RootDevice { using Device::generateUuidFromPciBusInfo; using Device::getGlobalMemorySize; using Device::initializeCaps; + using Device::microsecondResolution; using Device::preemptionMode; using Device::regularEngineGroups; using Device::rootCsrCreated; diff --git a/shared/test/unit_test/ail/ail_tests.cpp b/shared/test/unit_test/ail/ail_tests.cpp index f86dcf5f60..2887b4da48 100644 --- a/shared/test/unit_test/ail/ail_tests.cpp +++ b/shared/test/unit_test/ail/ail_tests.cpp @@ -136,4 +136,9 @@ HWTEST2_F(AILTests, givenAilWhenCheckingIfPatchtokenFallbackIsRequiredThenExpect EXPECT_FALSE(ail.isFallbackToPatchtokensRequired()); } +HWTEST2_F(AILTests, givenAilWhenGetMicrosecondResolutionCalledThenCorrectValueReturned, MatchAny) { + AILWhitebox ail; + EXPECT_EQ(ail.getMicrosecondResolution(), microsecondAdjustment); +} + } // namespace NEO diff --git a/shared/test/unit_test/device/neo_device_tests.cpp b/shared/test/unit_test/device/neo_device_tests.cpp index f6646cf0b9..b2b8831bcc 100644 --- a/shared/test/unit_test/device/neo_device_tests.cpp +++ b/shared/test/unit_test/device/neo_device_tests.cpp @@ -1946,4 +1946,11 @@ HWTEST_F(DeviceTests, givenCopyInternalEngineWhenStopDirectSubmissionForCopyEngi regularUltCsr->blitterDirectSubmissionAvailable = true; device->stopDirectSubmissionForCopyEngine(); EXPECT_TRUE(regularUltCsr->stopDirectSubmissionCalled); +} + +TEST(Device, givenDeviceWhenGettingMicrosecondResolutionThenCorrectValueReturned) { + auto device = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(defaultHwInfo.get())); + uint32_t expectedMicrosecondResolution = 123; + device->microsecondResolution = expectedMicrosecondResolution; + EXPECT_EQ(device->getMicrosecondResolution(), expectedMicrosecondResolution); } \ No newline at end of file diff --git a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp index c387dba258..df97fd5865 100644 --- a/shared/test/unit_test/execution_environment/execution_environment_tests.cpp +++ b/shared/test/unit_test/execution_environment/execution_environment_tests.cpp @@ -56,6 +56,51 @@ TEST(ExecutionEnvironment, WhenCreatingDevicesThenThoseDevicesAddRefcountsToExec EXPECT_EQ(expectedRefCounts, executionEnvironment->getRefInternalCount()); } +TEST(ExecutionEnvironment, givenDeviceCreatorWhenIsMicrosecondAdjustmendRequiredByAilThenGetMicrosecondResolutionCalled) { + auto executionEnvironment = new ExecutionEnvironment(); + auto devices = DeviceFactory::createDevices(*executionEnvironment); + executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAIL = static_cast(executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.get()); + mockAIL->adjustMicrosecondResolution = true; + auto device = Device::create(executionEnvironment, 0u); + EXPECT_EQ(mockAIL->getMicrosecondResolutionCalledTimes, 1u); + delete device; +} + +TEST(ExecutionEnvironment, givenDeviceCreatorWhenIsMicrosecondAdjustmendRequiredByAilThenMicrosecondResolutionIsSameAsInMock) { + auto executionEnvironment = new ExecutionEnvironment(); + auto devices = DeviceFactory::createDevices(*executionEnvironment); + executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAIL = static_cast(executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.get()); + mockAIL->adjustMicrosecondResolution = true; + uint32_t expectedResolution = 3u; + mockAIL->mockMicrosecondResolution = expectedResolution; + auto device = Device::create(executionEnvironment, 0u); + EXPECT_EQ(device->getMicrosecondResolution(), expectedResolution); + delete device; +} +TEST(ExecutionEnvironment, givenDeviceCreatorWhenAilHelperIsNullThenDefaultValueReturned) { + auto executionEnvironment = new ExecutionEnvironment(); + auto devices = DeviceFactory::createDevices(*executionEnvironment); + executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.reset(); + uint32_t expectedResolution = 1000u; + auto device = Device::create(executionEnvironment, 0u); + EXPECT_EQ(device->getMicrosecondResolution(), expectedResolution); + delete device; +} + +TEST(ExecutionEnvironment, givenDeviceCreatorWhenIsMicrosecondAdjustmendIsNotRequiredByAilThenGetMicrosecondResolutionIsNotCalled) { + auto executionEnvironment = new ExecutionEnvironment(); + auto devices = DeviceFactory::createDevices(*executionEnvironment); + MockAILConfiguration mockAilConfigurationHelper; + executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.reset(new MockAILConfiguration()); + auto mockAIL = static_cast(executionEnvironment->rootDeviceEnvironments[0u]->ailConfiguration.get()); + mockAIL->adjustMicrosecondResolution = false; + auto device = Device::create(executionEnvironment, 0u); + EXPECT_EQ(mockAIL->getMicrosecondResolutionCalledTimes, 0u); + delete device; +} + TEST(ExecutionEnvironment, givenMemoryManagerIsNotInitializedInExecutionEnvironmentWhenCreatingDevicesThenEmptyDeviceVectorIsReturned) { class FailedInitializeMemoryManagerExecutionEnvironment : public MockExecutionEnvironment { bool initializeMemoryManager() override { return false; }