From dc4a1e7cd5fed8d3adec9a71ca575a652189418e Mon Sep 17 00:00:00 2001 From: Zbigniew Zdanowicz Date: Wed, 20 Apr 2022 16:50:37 +0000 Subject: [PATCH] Add debug flag to select event field for event completion Related-To: NEO-6871 Signed-off-by: Zbigniew Zdanowicz --- level_zero/core/source/event/event_impl.inl | 8 +- .../unit_tests/sources/event/test_event.cpp | 74 +++++++++++++++++++ .../test/unit_test/test_files/igdrcl.config | 1 + .../debug_settings/debug_variables_base.inl | 1 + .../test_macros/header/common_matchers.h | 2 + shared/test/common/test_macros/test.h | 8 ++ 6 files changed, 93 insertions(+), 1 deletion(-) diff --git a/level_zero/core/source/event/event_impl.inl b/level_zero/core/source/event/event_impl.inl index 6669a2e998..636add0a05 100644 --- a/level_zero/core/source/event/event_impl.inl +++ b/level_zero/core/source/event/event_impl.inl @@ -5,6 +5,7 @@ * */ +#include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/memory_manager/internal_allocation_storage.h" #include "level_zero/core/source/event/event.h" @@ -30,7 +31,12 @@ Event *Event::create(EventPool *eventPool, const ze_event_desc_t *desc, Device * event->signalScope = desc->signal; event->waitScope = desc->wait; event->csr = neoDevice->getDefaultEngine().commandStreamReceiver; - event->setUsingContextEndOffset(L0HwHelper::get(neoDevice->getHardwareInfo().platform.eRenderCoreFamily).multiTileCapablePlatform()); + bool useContextEndOffset = L0HwHelper::get(neoDevice->getHardwareInfo().platform.eRenderCoreFamily).multiTileCapablePlatform(); + int32_t overrideUseContextEndOffset = NEO::DebugManager.flags.UseContextEndOffsetForEventCompletion.get(); + if (overrideUseContextEndOffset != -1) { + useContextEndOffset = !!overrideUseContextEndOffset; + } + event->setUsingContextEndOffset(useContextEndOffset); EventPoolImp *EventPoolImp = static_cast(eventPool); // do not reset even if it has been imported, since event pool diff --git a/level_zero/core/test/unit_tests/sources/event/test_event.cpp b/level_zero/core/test/unit_tests/sources/event/test_event.cpp index 577a00a22e..cdf05f9dca 100644 --- a/level_zero/core/test/unit_tests/sources/event/test_event.cpp +++ b/level_zero/core/test/unit_tests/sources/event/test_event.cpp @@ -603,6 +603,80 @@ TEST_F(EventCreate, givenAnEventCreateWithInvalidIndexUsingThisEventPoolThenErro ASSERT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, value); } +HWTEST2_F(EventCreate, givenPlatformSupportMultTileWhenDebugKeyIsSetToNotUseContextEndThenDoNotUseContextEndOffset, isXeHpOrXeHpcCore) { + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.UseContextEndOffsetForEventCompletion.set(0); + + bool useContextEndOffset = L0HwHelper::get(neoDevice->getHardwareInfo().platform.eRenderCoreFamily).multiTileCapablePlatform(); + EXPECT_TRUE(useContextEndOffset); + + ze_event_pool_desc_t eventPoolDesc = { + ZE_STRUCTURE_TYPE_EVENT_POOL_DESC, + nullptr, + 0, + 1}; + const ze_event_desc_t eventDesc = { + ZE_STRUCTURE_TYPE_EVENT_DESC, + nullptr, + 0, + 0, + 0}; + + ze_event_handle_t eventHandle = nullptr; + + ze_result_t result = ZE_RESULT_SUCCESS; + std::unique_ptr eventPool(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, result)); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + ASSERT_NE(nullptr, eventPool); + + ze_result_t value = eventPool->createEvent(&eventDesc, &eventHandle); + ASSERT_NE(nullptr, eventHandle); + EXPECT_EQ(ZE_RESULT_SUCCESS, value); + + auto event = Event::fromHandle(eventHandle); + EXPECT_FALSE(event->isEventTimestampFlagSet()); + EXPECT_FALSE(event->isUsingContextEndOffset()); + + event->destroy(); +} + +HWTEST2_F(EventCreate, givenPlatformNotSupportsMultTileWhenDebugKeyIsSetToUseContextEndThenUseContextEndOffset, isNotXeHpOrXeHpcCore) { + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.UseContextEndOffsetForEventCompletion.set(1); + + bool useContextEndOffset = L0HwHelper::get(neoDevice->getHardwareInfo().platform.eRenderCoreFamily).multiTileCapablePlatform(); + EXPECT_FALSE(useContextEndOffset); + + ze_event_pool_desc_t eventPoolDesc = { + ZE_STRUCTURE_TYPE_EVENT_POOL_DESC, + nullptr, + 0, + 1}; + const ze_event_desc_t eventDesc = { + ZE_STRUCTURE_TYPE_EVENT_DESC, + nullptr, + 0, + 0, + 0}; + + ze_event_handle_t eventHandle = nullptr; + + ze_result_t result = ZE_RESULT_SUCCESS; + std::unique_ptr eventPool(EventPool::create(driverHandle.get(), context, 0, nullptr, &eventPoolDesc, result)); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + ASSERT_NE(nullptr, eventPool); + + ze_result_t value = eventPool->createEvent(&eventDesc, &eventHandle); + ASSERT_NE(nullptr, eventHandle); + EXPECT_EQ(ZE_RESULT_SUCCESS, value); + + auto event = Event::fromHandle(eventHandle); + EXPECT_FALSE(event->isEventTimestampFlagSet()); + EXPECT_TRUE(event->isUsingContextEndOffset()); + + event->destroy(); +} + class EventSynchronizeTest : public Test { public: void SetUp() override { diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index 6f733f327a..ae81663e7e 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -411,5 +411,6 @@ DirectSubmissionReadBackCommandBuffer = -1 DirectSubmissionReadBackRingBuffer = -1 ReadBackCommandBufferAllocation = -1 PrintImageBlitBlockCopyCmdDetails = 0 +UseContextEndOffsetForEventCompletion = -1 DirectSubmissionInsertExtraMiMemFenceCommands = -1 DirectSubmissionInsertSfenceInstructionPriorToSubmission = -1 diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index a368442b2b..80a5ff1204 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -200,6 +200,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, ForcePreParserEnabledForMiArbCheck, -1, "-1: def DECLARE_DEBUG_VARIABLE(int32_t, BatchBufferStartPrepatchingWaEnabled, -1, "-1: default , 0: disabled, 1: enabled. WA applies valid VA pointing to 'self' instead of 0x0. This mitigates incorrect VA preparsing.") DECLARE_DEBUG_VARIABLE(int32_t, SetVmAdviseAtomicAttribute, -1, "-1: default - atomic system, 0: atomic none, 1: atomic device, 2: atomic system)") DECLARE_DEBUG_VARIABLE(int32_t, ReadBackCommandBufferAllocation, -1, "Read command buffer allocation back on the host side. -1: default, 0 - disabled, 1 - local memory only, 2 - local and system memory") +DECLARE_DEBUG_VARIABLE(int32_t, UseContextEndOffsetForEventCompletion, -1, "Use Context End or Context Start for event completion signalling. -1: default: platform dependent, 0 - Use Context Start, 1 - Use Context End") DECLARE_DEBUG_VARIABLE(bool, DisableScratchPages, false, "Disable scratch pages during VM creations") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level") diff --git a/shared/test/common/test_macros/header/common_matchers.h b/shared/test/common/test_macros/header/common_matchers.h index 86c5913412..d54259b78d 100644 --- a/shared/test/common/test_macros/header/common_matchers.h +++ b/shared/test/common/test_macros/header/common_matchers.h @@ -37,6 +37,8 @@ using IsAtMostXeHpcCore = IsAtMostGfxCore; using isXeHpOrXeHpcCore = IsAnyGfxCores; using isXeHpcOrXeHpgCore = IsAnyGfxCores; +using isNotXeHpOrXeHpcCore = IsNotAnyGfxCores; + using IsSKL = IsProduct; using IsKBL = IsProduct; using IsCFL = IsProduct; diff --git a/shared/test/common/test_macros/test.h b/shared/test/common/test_macros/test.h index 473e332905..38c2637980 100644 --- a/shared/test/common/test_macros/test.h +++ b/shared/test/common/test_macros/test.h @@ -830,6 +830,14 @@ struct IsAnyGfxCores { } }; +template +struct IsNotAnyGfxCores { + template + static constexpr bool isMatched() { + return (... && IsNotGfxCore::template isMatched()); + } +}; + template struct IsProduct { template