refactor: add debug flag to synchronize Event before reset

Signed-off-by: Dunajski, Bartosz <bartosz.dunajski@intel.com>
This commit is contained in:
Dunajski, Bartosz
2023-06-26 14:25:35 +00:00
committed by Compute-Runtime-Automation
parent 82db3eda90
commit 7ac825e74b
4 changed files with 88 additions and 0 deletions

View File

@@ -392,6 +392,13 @@ ze_result_t EventImp<TagSizeT>::hostSynchronize(uint64_t timeout) {
template <typename TagSizeT>
ze_result_t EventImp<TagSizeT>::reset() {
if (NEO::DebugManager.flags.SynchronizeEventBeforeReset.get() != -1) {
if (NEO::DebugManager.flags.SynchronizeEventBeforeReset.get() == 2 && queryStatus() != ZE_RESULT_SUCCESS) {
printf("\nzeEventHostReset: Event %p not ready. Calling zeEventHostSynchronize.", this);
}
hostSynchronize(std::numeric_limits<uint64_t>::max());
}
if (inOrderExecEvent) {
inOrderExecEvent = false;
inOrderExecDataAllocation = nullptr;

View File

@@ -3218,6 +3218,7 @@ HWTEST_F(EventTests, GivenCsrTbxModeWhenEventCreatedAndSignaledThenEventAllocati
struct MockEventCompletion : public L0::EventImp<uint32_t> {
using EventImp<uint32_t>::gpuStartTimestamp;
using EventImp<uint32_t>::gpuEndTimestamp;
using EventImp<uint32_t>::hostAddress;
MockEventCompletion(L0::EventPool *eventPool, int index, L0::Device *device) : EventImp(eventPool, index, device, false) {
auto neoDevice = device->getNEODevice();
@@ -3249,8 +3250,24 @@ struct MockEventCompletion : public L0::EventImp<uint32_t> {
return EventImp<uint32_t>::hostEventSetValue(eventValue);
}
ze_result_t hostSynchronize(uint64_t timeout) override {
hostSynchronizeCalled++;
return L0::EventImp<uint32_t>::hostSynchronize(timeout);
}
ze_result_t queryStatus() override {
if (failOnNextQueryStatus) {
failOnNextQueryStatus = false;
return ZE_RESULT_NOT_READY;
}
return L0::EventImp<uint32_t>::queryStatus();
}
bool shouldHostEventSetValueFail = false;
bool failOnNextQueryStatus = false;
uint32_t assignKernelEventCompletionDataCounter = 0u;
uint32_t hostSynchronizeCalled = 0;
};
TEST_F(EventTests, WhenQueryingStatusAfterHostSignalThenDontAccessMemoryAndReturnSuccess) {
@@ -3261,6 +3278,68 @@ TEST_F(EventTests, WhenQueryingStatusAfterHostSignalThenDontAccessMemoryAndRetur
EXPECT_EQ(event->assignKernelEventCompletionDataCounter, 0u);
}
TEST_F(EventTests, givenDebugFlagSetWhenCallingResetThenSynchronizeBeforeReset) {
DebugManager.flags.SynchronizeEventBeforeReset.set(1);
auto event = std::make_unique<MockEventCompletion>(eventPool.get(), 1u, device);
event->failOnNextQueryStatus = true;
*reinterpret_cast<uint32_t *>(event->hostAddress) = Event::STATE_SIGNALED;
testing::internal::CaptureStdout();
EXPECT_EQ(0u, event->hostSynchronizeCalled);
event->reset();
EXPECT_EQ(1u, event->hostSynchronizeCalled);
std::string output = testing::internal::GetCapturedStdout();
std::string expectedOutput("");
EXPECT_EQ(expectedOutput, output);
}
TEST_F(EventTests, givenDebugFlagSetWhenCallingResetThenPrintLogAndSynchronizeBeforeReset) {
DebugManager.flags.SynchronizeEventBeforeReset.set(2);
auto event = std::make_unique<MockEventCompletion>(eventPool.get(), 1u, device);
*reinterpret_cast<uint32_t *>(event->hostAddress) = Event::STATE_SIGNALED;
{
event->failOnNextQueryStatus = false;
testing::internal::CaptureStdout();
EXPECT_EQ(0u, event->hostSynchronizeCalled);
event->reset();
EXPECT_EQ(1u, event->hostSynchronizeCalled);
std::string output = testing::internal::GetCapturedStdout();
std::string expectedOutput("");
EXPECT_EQ(expectedOutput, output);
}
{
event->failOnNextQueryStatus = true;
testing::internal::CaptureStdout();
EXPECT_EQ(1u, event->hostSynchronizeCalled);
event->reset();
EXPECT_EQ(2u, event->hostSynchronizeCalled);
std::string output = testing::internal::GetCapturedStdout();
char expectedStr[128] = {};
snprintf(expectedStr, 128, "\nzeEventHostReset: Event %p not ready. Calling zeEventHostSynchronize.", event.get());
EXPECT_EQ(std::string(expectedStr), output);
}
}
TEST_F(EventTests, whenAppendAdditionalCsrThenStoreUniqueCsr) {
auto csr1 = reinterpret_cast<NEO::CommandStreamReceiver *>(0x1234);
auto csr2 = reinterpret_cast<NEO::CommandStreamReceiver *>(0x5678);

View File

@@ -245,6 +245,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, DebugSetMemoryDiagnosticsDelay, -1, "-1: default
DECLARE_DEBUG_VARIABLE(int32_t, EnableDeviceStateVerification, -1, "-1: default, 0: disable, 1: enable check of device state before submit on Windows")
DECLARE_DEBUG_VARIABLE(int32_t, EnableDynamicPostSyncAllocLayout, -1, "-1: default, 0: Keep Timestamp size layout, 1: Use write immediate layout (qword) and switch dynamically to TS for profiling")
DECLARE_DEBUG_VARIABLE(int32_t, PrintTimestampPacketUsage, -1, "-1: default, 0: Disabled, 1: Print when TSP is allocated, initialized, returned to pool, etc.")
DECLARE_DEBUG_VARIABLE(int32_t, SynchronizeEventBeforeReset, -1, "-1: default, 0: Disabled, 1: Synchronize Event completion on host before calling reset. 2: Synchronize + print extra logs.")
DECLARE_DEBUG_VARIABLE(int32_t, TrackNumCsrClientsOnSyncPoints, -1, "-1: default, 0: Disabled, 1: If set, synchronization points like zeEventHostSynchronize will unregister CmdQ from CSR clients")
/*LOGGING FLAGS*/

View File

@@ -537,5 +537,6 @@ EnableDynamicPostSyncAllocLayout = -1
PrintTimestampPacketUsage = -1
TrackNumCsrClientsOnSyncPoints = -1
CommandListTimestampRefreshIntervalInMilliSec = -1
SynchronizeEventBeforeReset = -1
RemoveRestrictionsOnNumberOfThreadsInGpgpuThreadGroup = 0
# Please don't edit below this line