Add debug flag to select event field for event completion

Related-To: NEO-6871

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2022-04-20 16:50:37 +00:00
committed by Compute-Runtime-Automation
parent 0e2bfe92c4
commit dc4a1e7cd5
6 changed files with 93 additions and 1 deletions

View File

@ -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<struct EventPoolImp *>(eventPool);
// do not reset even if it has been imported, since event pool

View File

@ -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<L0::EventPool> 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<L0::EventPool> 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<DeviceFixture> {
public:
void SetUp() override {

View File

@ -411,5 +411,6 @@ DirectSubmissionReadBackCommandBuffer = -1
DirectSubmissionReadBackRingBuffer = -1
ReadBackCommandBufferAllocation = -1
PrintImageBlitBlockCopyCmdDetails = 0
UseContextEndOffsetForEventCompletion = -1
DirectSubmissionInsertExtraMiMemFenceCommands = -1
DirectSubmissionInsertSfenceInstructionPriorToSubmission = -1

View File

@ -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")

View File

@ -37,6 +37,8 @@ using IsAtMostXeHpcCore = IsAtMostGfxCore<IGFX_XE_HPC_CORE>;
using isXeHpOrXeHpcCore = IsAnyGfxCores<IGFX_XE_HP_CORE, IGFX_XE_HPC_CORE>;
using isXeHpcOrXeHpgCore = IsAnyGfxCores<IGFX_XE_HPC_CORE, IGFX_XE_HPG_CORE>;
using isNotXeHpOrXeHpcCore = IsNotAnyGfxCores<IGFX_XE_HP_CORE, IGFX_XE_HPC_CORE>;
using IsSKL = IsProduct<IGFX_SKYLAKE>;
using IsKBL = IsProduct<IGFX_KABYLAKE>;
using IsCFL = IsProduct<IGFX_COFFEELAKE>;

View File

@ -830,6 +830,14 @@ struct IsAnyGfxCores {
}
};
template <GFXCORE_FAMILY... args>
struct IsNotAnyGfxCores {
template <PRODUCT_FAMILY productFamily>
static constexpr bool isMatched() {
return (... && IsNotGfxCore<args>::template isMatched<productFamily>());
}
};
template <PRODUCT_FAMILY product>
struct IsProduct {
template <PRODUCT_FAMILY productFamily>