From d590172b6561c200ecbc8e289483975f90ea2312 Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Thu, 8 May 2025 15:02:10 +0000 Subject: [PATCH] refactor: Remove unused events tracker Signed-off-by: Lukasz Jobczyk --- opencl/source/event/CMakeLists.txt | 4 +- opencl/source/event/event.cpp | 11 - opencl/source/event/event_tracker.cpp | 254 ------- opencl/source/event/event_tracker.h | 60 -- opencl/test/unit_test/event/CMakeLists.txt | 3 +- .../unit_test/event/event_tracker_tests.cpp | 679 ------------------ .../debug_settings/debug_variables_base.inl | 1 - shared/test/common/test_files/igdrcl.config | 1 - 8 files changed, 2 insertions(+), 1011 deletions(-) delete mode 100644 opencl/source/event/event_tracker.cpp delete mode 100644 opencl/source/event/event_tracker.h delete mode 100644 opencl/test/unit_test/event/event_tracker_tests.cpp diff --git a/opencl/source/event/CMakeLists.txt b/opencl/source/event/CMakeLists.txt index 71527d6504..838d14390a 100644 --- a/opencl/source/event/CMakeLists.txt +++ b/opencl/source/event/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2018-2021 Intel Corporation +# Copyright (C) 2018-2025 Intel Corporation # # SPDX-License-Identifier: MIT # @@ -12,8 +12,6 @@ set(RUNTIME_SRCS_EVENT ${CMAKE_CURRENT_SOURCE_DIR}/event.h ${CMAKE_CURRENT_SOURCE_DIR}/event_builder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/event_builder.h - ${CMAKE_CURRENT_SOURCE_DIR}/event_tracker.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/event_tracker.h ${CMAKE_CURRENT_SOURCE_DIR}/user_event.cpp ${CMAKE_CURRENT_SOURCE_DIR}/user_event.h ) diff --git a/opencl/source/event/event.cpp b/opencl/source/event/event.cpp index e1edd90210..567dd25894 100644 --- a/opencl/source/event/event.cpp +++ b/opencl/source/event/event.cpp @@ -29,7 +29,6 @@ #include "opencl/source/command_queue/command_queue.h" #include "opencl/source/context/context.h" #include "opencl/source/event/async_events_handler.h" -#include "opencl/source/event/event_tracker.h" #include "opencl/source/helpers/get_info_status_mapper.h" #include "opencl/source/helpers/hardware_commands_helper.h" #include "opencl/source/helpers/task_information.h" @@ -49,9 +48,6 @@ Event::Event( cmdQueue(cmdQueue), cmdType(cmdType), taskCount(taskCount) { - if (NEO::debugManager.flags.EventsTrackerEnable.get()) { - EventsTracker::getEventsTracker().notifyCreation(this); - } flushStamp.reset(new FlushStampTracker(true)); DBG_LOG(EventsDebugEnable, "Event()", this); @@ -91,10 +87,6 @@ Event::Event( } Event::~Event() { - if (NEO::debugManager.flags.EventsTrackerEnable.get()) { - EventsTracker::getEventsTracker().notifyDestruction(this); - } - DBG_LOG(EventsDebugEnable, "~Event()", this); // no commands should be registred DEBUG_BREAK_IF(this->cmdToSubmit.load()); @@ -648,9 +640,6 @@ void Event::transitionExecutionStatus(int32_t newExecutionStatus) const { break; } } - if (NEO::debugManager.flags.EventsTrackerEnable.get()) { - EventsTracker::getEventsTracker().notifyTransitionedExecutionStatus(); - } } void Event::submitCommand(bool abortTasks) { diff --git a/opencl/source/event/event_tracker.cpp b/opencl/source/event/event_tracker.cpp deleted file mode 100644 index ddf9548f83..0000000000 --- a/opencl/source/event/event_tracker.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (C) 2018-2025 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "opencl/source/event/event_tracker.h" - -#include "opencl/source/command_queue/command_queue.h" -#include "opencl/source/helpers/cl_helper.h" - -#include -#include - -namespace NEO { - -std::unique_ptr EventsTracker::globalEvTracker = nullptr; - -EventsTracker &EventsTracker::getEventsTracker() { - static std::mutex initMutex; - std::lock_guard autolock(initMutex); - - if (!EventsTracker::globalEvTracker) { - EventsTracker::globalEvTracker = std::unique_ptr{new EventsTracker()}; - } - UNRECOVERABLE_IF(EventsTracker::globalEvTracker == nullptr); - return *EventsTracker::globalEvTracker; -} - -std::string EventsTracker::label(Event *node, const EventIdMap &eventsIdMapping) { - std::string retLabel("e"); - - auto eventTag = eventsIdMapping.find(node); - if (eventTag != eventsIdMapping.end()) { - auto id = eventTag->second; - retLabel += std::to_string(id); - } - return retLabel; -} - -std::string EventsTracker::label(CommandQueue *cmdQ) { - return "cq" + std::to_string(reinterpret_cast(cmdQ)); -} - -void EventsTracker::dumpQueue(CommandQueue *cmdQ, std::ostream &out, CmdqSet &dumpedCmdQs) { - if ((cmdQ == nullptr) || (dumpedCmdQs.find(cmdQ) != dumpedCmdQs.end())) { - return; - } - - out << label(cmdQ) << "[label=\"{------CmdQueue, ptr=" << cmdQ << "------|task count="; - auto taskCount = cmdQ->taskCount; - auto taskLevel = cmdQ->taskLevel; - if (taskCount == CompletionStamp::notReady) { - out << "NOT_READY"; - } else { - out << taskCount; - } - - out << ", level="; - if (taskLevel == CompletionStamp::notReady) { - out << "NOT_READY"; - } else { - out << taskLevel; - } - out << "}\",color=blue];\n"; - dumpedCmdQs.insert(cmdQ); -} - -void EventsTracker::dumpNode(Event *node, std::ostream &out, const EventIdMap &eventsIdMapping) { - if (node == nullptr) { - out << "eNULL[label=\"{ptr=nullptr}\",color=red];\n"; - return; - } - - bool isUserEvent = node->isUserEvent(); - - uint32_t statusId = static_cast(node->peekExecutionStatus()); - // clamp to aborted - statusId = (statusId > CL_QUEUED) ? (CL_QUEUED + 1) : statusId; - - const char *color = ((statusId == CL_COMPLETE) || (statusId > CL_QUEUED)) ? "green" : (((statusId == CL_SUBMITTED) && (isUserEvent == false)) ? "yellow" : "red"); - - std::string eventType = isUserEvent ? "USER_EVENT" : (node->isCurrentCmdQVirtualEvent() ? "---V_EVENT " : "-----EVENT "); - std::string commandType = ""; - if (isUserEvent == false) { - commandType = NEO::cmdTypetoString(node->getCommandType()); - } - - static const char *status[] = { - "CL_COMPLETE", - "CL_RUNNING", - "CL_SUBMITTED", - "CL_QUEUED", - "ABORTED"}; - - auto taskCount = node->peekTaskCount(); - auto taskLevel = node->taskLevel.load(); - - out << label(node, eventsIdMapping) << "[label=\"{------" << eventType << " ptr=" << node << "------" - "|" - << commandType << "|" << status[statusId] << "|" - "task count="; - if (taskCount == CompletionStamp::notReady) { - out << "NOT_READY"; - } else { - out << taskCount; - } - - out << ", level="; - if (taskLevel == CompletionStamp::notReady) { - out << "NOT_READY"; - } else { - out << taskLevel; - } - - out << "|CALLBACKS=" << (node->peekHasCallbacks() ? "TRUE" : "FALSE") << "}\",color=" << color << "];\n"; - - if (node->isCurrentCmdQVirtualEvent()) { - out << label(node->getCommandQueue()) << "->" << label(node, eventsIdMapping); - out << "[label=\"VIRTUAL_EVENT\"]"; - out << ";\n"; - } -} - -void EventsTracker::dumpEdge(Event *leftNode, Event *rightNode, std::ostream &out, const EventIdMap &eventsIdMapping) { - out << label(leftNode, eventsIdMapping) << "->" << label(rightNode, eventsIdMapping) << ";\n"; -} - -// walk in DFS manner -void EventsTracker::dumpGraph(Event *node, std::ostream &out, CmdqSet &dumpedCmdQs, std::set &dumpedEvents, - const EventIdMap &eventsIdMapping) { - if ((node == nullptr) || (dumpedEvents.find(node) != dumpedEvents.end())) { - return; - } - - dumpedEvents.insert(node); - - if (node->getCommandQueue() != nullptr) { - dumpQueue(node->getCommandQueue(), out, dumpedCmdQs); - } - dumpNode(node, out, eventsIdMapping); - - auto *childNode = node->peekChildEvents(); - while (childNode != nullptr) { - dumpGraph(childNode->ref, out, dumpedCmdQs, dumpedEvents, eventsIdMapping); - dumpEdge(node, childNode->ref, out, eventsIdMapping); - childNode = childNode->next; - } -} - -TrackedEvent *EventsTracker::getNodes() { - return trackedEvents.detachNodes(); -} - -void EventsTracker::dump() { - static std::mutex mutex; - std::lock_guard lock(mutex); - auto time = std::chrono::system_clock::now(); - std::string dumpFileName = "eg_" - "reg" + - std::to_string(reinterpret_cast(this)) + "_" + std::to_string(time.time_since_epoch().count()) + ".gv"; - auto out = createDumpStream(dumpFileName); - - *out << "digraph events_registry_" << this << " {\n"; - *out << "node [shape=record]\n"; - *out << "//pragma: somePragmaData" - << "\n"; - auto allNodes = getNodes(); - EventIdMap deadNodeTags; - auto curr = allNodes; - TrackedEvent *prev = nullptr; - EventIdMap eventsIdMapping; - - while (curr != nullptr) { - auto next = curr->next; - bool eraseNode = false; - if (curr->eventId < 0) { - auto prevTag = deadNodeTags.find(curr->ev); - if (prevTag == deadNodeTags.end()) { - deadNodeTags[curr->ev] = -curr->eventId; - } - eraseNode = true; - } else if ((deadNodeTags.find(curr->ev) != deadNodeTags.end()) && (deadNodeTags[curr->ev] > curr->eventId)) { - eraseNode = true; - } - - if (eraseNode) { - if (prev != nullptr) { - prev->next = next; - } - if (allNodes == curr) { - allNodes = nullptr; - } - delete curr; - } else { - if (allNodes == nullptr) { - allNodes = curr; - } - prev = curr; - eventsIdMapping[curr->ev] = curr->eventId; - } - curr = next; - } - - auto node = allNodes; - CmdqSet dumpedCmdQs; - std::set dumpedEvents; - while (node != nullptr) { - if (node->ev->peekNumEventsBlockingThis() != 0) { - node = node->next; - continue; - } - dumpGraph(node->ev, *out, dumpedCmdQs, dumpedEvents, eventsIdMapping); - node = node->next; - } - *out << "\n}\n"; - - if (allNodes == nullptr) { - return; - } - - if (trackedEvents.peekHead() != nullptr) { - trackedEvents.peekHead()->getTail()->insertAllNext(*allNodes); - } else { - auto rest = allNodes->next; - trackedEvents.pushFrontOne(*allNodes); - if (rest != nullptr) { - allNodes->insertAllNext(*rest); - } - } -} - -void EventsTracker::notifyCreation(Event *eventToTrack) { - dump(); - auto trackedE = new TrackedEvent{eventToTrack, eventId++}; - trackedEvents.pushFrontOne(*trackedE); -} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks), NEO-14033 - -void EventsTracker::notifyDestruction(Event *eventToDestroy) { - auto trackedE = new TrackedEvent{eventToDestroy, -(eventId++)}; - trackedEvents.pushFrontOne(*trackedE); - dump(); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks), NEO-14033 -} - -void EventsTracker::notifyTransitionedExecutionStatus() { - dump(); -} - -std::unique_ptr EventsTracker::createDumpStream(const std::string &filename) { - return std::make_unique(filename, std::ios::binary | std::ios::out); -} - -} // namespace NEO diff --git a/opencl/source/event/event_tracker.h b/opencl/source/event/event_tracker.h deleted file mode 100644 index 109473f2fb..0000000000 --- a/opencl/source/event/event_tracker.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2018-2025 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#pragma once -#include "shared/source/utilities/iflist.h" - -#include "opencl/source/event/event.h" - -#include -#include - -namespace NEO { - -class CommandQueue; - -struct TrackedEvent : IFNode { - TrackedEvent(Event *ev, int64_t eventId) - : ev(ev), eventId(eventId) { - } - Event *ev = nullptr; - int64_t eventId = 1; -}; -static_assert(NEO::NonCopyableAndNonMovable>); - -class EventsTracker { - - using EventIdMap = std::unordered_map; - using CmdqSet = std::set; - - protected: - std::atomic eventId{0}; - static std::unique_ptr globalEvTracker; - IFList trackedEvents; - EventsTracker() = default; - - public: - void dump(); - void notifyCreation(Event *eventToTrack); - void notifyDestruction(Event *eventToDestroy); - void notifyTransitionedExecutionStatus(); - - MOCKABLE_VIRTUAL ~EventsTracker() = default; - MOCKABLE_VIRTUAL TrackedEvent *getNodes(); - MOCKABLE_VIRTUAL std::unique_ptr createDumpStream(const std::string &filename); - - static EventsTracker &getEventsTracker(); - static std::string label(Event *node, const EventIdMap &eventsIdMapping); - static std::string label(CommandQueue *cmdQ); - static void dumpQueue(CommandQueue *cmdQ, std::ostream &out, CmdqSet &dumpedCmdQs); - static void dumpEdge(Event *leftNode, Event *rightNode, std::ostream &out, const EventIdMap &eventsIdMapping); - static void dumpNode(Event *node, std::ostream &out, const EventIdMap &eventsIdMapping); - static void dumpGraph(Event *node, std::ostream &out, CmdqSet &dumpedCmdQs, std::set &dumpedEvents, - const EventIdMap &eventsIdMapping); -}; - -} // namespace NEO diff --git a/opencl/test/unit_test/event/CMakeLists.txt b/opencl/test/unit_test/event/CMakeLists.txt index 8001c7afce..94f15eb4eb 100644 --- a/opencl/test/unit_test/event/CMakeLists.txt +++ b/opencl/test/unit_test/event/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2018-2021 Intel Corporation +# Copyright (C) 2018-2025 Intel Corporation # # SPDX-License-Identifier: MIT # @@ -11,7 +11,6 @@ set(IGDRCL_SRCS_tests_event ${CMAKE_CURRENT_SOURCE_DIR}/event_callbacks_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/event_fixture.h ${CMAKE_CURRENT_SOURCE_DIR}/event_tests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/event_tracker_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/user_events_tests.cpp ) target_sources(igdrcl_tests PRIVATE ${IGDRCL_SRCS_tests_event}) diff --git a/opencl/test/unit_test/event/event_tracker_tests.cpp b/opencl/test/unit_test/event/event_tracker_tests.cpp deleted file mode 100644 index 779a75fa56..0000000000 --- a/opencl/test/unit_test/event/event_tracker_tests.cpp +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Copyright (C) 2018-2025 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/helpers/file_io.h" -#include "shared/test/common/helpers/debug_manager_state_restore.h" - -#include "opencl/source/event/event.h" -#include "opencl/source/event/event_tracker.h" -#include "opencl/test/unit_test/mocks/mock_command_queue.h" - -#include "event_fixture.h" - -#include -#include -#include - -struct ClonedStream : std::stringstream { - ClonedStream(std::string &clonedOutput) - : clonedOutput(clonedOutput) { - } - - ~ClonedStream() override { - clonedOutput = this->str(); - } - - std::string &clonedOutput; -}; - -class EventsTrackerMock : public EventsTracker { - public: - std::unique_ptr createDumpStream(const std::string &filename) override { - return std::make_unique(streamMock); - } - void overrideGlobal() { - originGlobal.swap(EventsTracker::globalEvTracker); - EventsTracker::globalEvTracker = std::unique_ptr{new EventsTrackerMock()}; - } - void restoreGlobal() { - EventsTrackerMock::shutdownGlobalEvTracker(); - EventsTracker::globalEvTracker.swap(originGlobal); - } - static void shutdownGlobalEvTracker() { - EventsTracker::globalEvTracker.reset(); - } - IFList *getList() { - return &trackedEvents; - } - std::string streamMock; - std::unique_ptr originGlobal; -}; - -TEST(EventsTracker, whenCallingGetEventsTrackerThenGetGlobalEventsTrackerInstance) { - auto &evTracker1 = EventsTracker::getEventsTracker(); - auto &evTracker2 = EventsTracker::getEventsTracker(); - - EXPECT_EQ(&evTracker1, &evTracker2); - - EventsTrackerMock::shutdownGlobalEvTracker(); -} - -TEST(EventsTracker, whenCallLabelFunctionThenGetStringWithProperEventId) { - UserEvent uEvent; - - std::unordered_map map; - map[&uEvent] = 0; - - EXPECT_STREQ("e0", EventsTracker::label(&uEvent, map).c_str()); -} - -TEST(EventsTracker, whenCallLabelFunctionWhenEventIsNotInMapThenGetStringWithoutId) { - UserEvent uEvent; - - std::unordered_map map; - - EXPECT_STREQ("e", EventsTracker::label(&uEvent, map).c_str()); -} - -TEST(EventsTracker, whenCallLabelFunctionThenGetStringWithProperCmdqId) { - MockCommandQueue cmdq; - - std::string expect = "cq" + std::to_string(reinterpret_cast(&cmdq)); - - EXPECT_STREQ(expect.c_str(), EventsTracker::label(&cmdq).c_str()); -} - -TEST(EventsTracker, givenNullptrCmdqThenNotDumping) { - MockCommandQueue *cmdqPtr = nullptr; - - std::stringstream stream; - std::set dumped; - - EventsTracker::dumpQueue(cmdqPtr, stream, dumped); - - EXPECT_STREQ("", stream.str().c_str()); -} - -TEST(EventsTracker, givenAlreadyDumpedCmdqThenNotDumping) { - MockCommandQueue cmdq; - - std::stringstream stream; - std::set dumped; - dumped.insert(&cmdq); - - EventsTracker::dumpQueue(&cmdq, stream, dumped); - - EXPECT_STREQ("", stream.str().c_str()); -} - -TEST(EventsTracker, givenCmqdWithTaskCountAndLevelNotReadyThenDumpingCmdqWithNotReadyLabels) { - MockCommandQueue cmdq; - cmdq.taskCount = CompletionStamp::notReady; - cmdq.taskLevel = CompletionStamp::notReady; - - std::stringstream stream; - std::set dumped; - - EventsTracker::dumpQueue(&cmdq, stream, dumped); - - std::stringstream expected; - expected << EventsTracker::label(&cmdq) << "[label=\"{------CmdQueue, ptr=" << &cmdq << "------|task count=NOT_READY, level=NOT_READY}\",color=blue];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, whenCallDumpQueueThenDumpingCmdqWithProperCountTaskAndLevelValues) { - MockCommandQueue cmdq; - cmdq.taskCount = 3; - cmdq.taskLevel = 1; - - std::stringstream stream; - std::set dumped; - - EventsTracker::dumpQueue(&cmdq, stream, dumped); - - std::stringstream expected; - expected << EventsTracker::label(&cmdq) << "[label=\"{------CmdQueue, ptr=" << &cmdq << "------|task count=3, level=1}\",color=blue];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, whenCallDumpEdgeThenGetStringWithProperLabelOfDumpedEdge) { - UserEvent uEvent1; - UserEvent uEvent2; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent1] = 0; - map[&uEvent2] = 1; - - EventsTracker::dumpEdge(&uEvent1, &uEvent2, stream, map); - - EXPECT_STREQ("e0->e1;\n", stream.str().c_str()); -} - -TEST(EventsTracker, givenEventWithTaskLevelAndCountNotReadyThenDumpingNodeWithNotReadyLabels) { - UserEvent uEvent; - uEvent.taskLevel = CompletionStamp::notReady; - uEvent.updateTaskCount(CompletionStamp::notReady, 0); - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - - EventsTracker::dumpNode(&uEvent, stream, map); - - std::stringstream expected; - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, whenCallDumpNodeFunctionThenDumpingNodeWithProperTaskLevelAndCountValues) { - UserEvent uEvent; - uEvent.taskLevel = 1; - uEvent.updateTaskCount(1, 0); - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - - EventsTracker::dumpNode(&uEvent, stream, map); - - std::stringstream expected; - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_QUEUED|task count=1, level=1|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenNullptrEventThenNotDumpingNode) { - UserEvent *uEvent = nullptr; - - std::stringstream stream; - std::unordered_map map; - map[uEvent] = 0; - - EventsTracker::dumpNode(uEvent, stream, map); - - EXPECT_STREQ("eNULL[label=\"{ptr=nullptr}\",color=red];\n", stream.str().c_str()); -} - -TEST(EventsTracker, givenEventAndUserEventThenDumpingNodeWithProperLabels) { - UserEvent uEvent; - Event event(nullptr, CL_COMMAND_NDRANGE_KERNEL, CompletionStamp::notReady, CompletionStamp::notReady); - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - map[&event] = 1; - - EventsTracker::dumpNode(&uEvent, stream, map); - - std::stringstream expecteduEvent; - expecteduEvent << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expecteduEvent.str().c_str(), stream.str().c_str()); - - stream.str(std::string()); - EventsTracker::dumpNode(&event, stream, map); - - std::stringstream expectedEvent; - expectedEvent << "e1[label=\"{-----------EVENT ptr=" << &event - << "------|CL_COMMAND_NDRANGE_KERNEL|CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expectedEvent.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenCmdqAndItsVirtualEventThenDumpingWithProperLabels) { - MockContext ctx; - MockCommandQueue cmdq; - VirtualEvent vEvent(&cmdq, &ctx); - vEvent.setCurrentCmdQVirtualEvent(true); - vEvent.updateTaskCount(1, 0); - - std::stringstream stream; - std::unordered_map map; - map[&vEvent] = 0; - - EventsTracker::dumpNode(&vEvent, stream, map); - - std::stringstream expected; - expected << "e0[label=\"{---------V_EVENT ptr=" << &vEvent << "------|CMD_UNKNOWN:" << (cl_command_type)-1 - << "|CL_QUEUED|task count=1, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n" - << EventsTracker::label(&cmdq) << "->e0[label=\"VIRTUAL_EVENT\"];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenEventWithCallbackThenDumpingWithProperLabel) { - Event::Callback::ClbFuncT func = [](cl_event ev, cl_int i, void *data) {}; - UserEvent uEvent; - uEvent.addCallback(func, 0, nullptr); - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - - EventsTracker::dumpNode(&uEvent, stream, map); - - std::stringstream expected; - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=TRUE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenSubmittedEventThenDumpingWithProperLabel) { - Event event(nullptr, CL_COMMAND_NDRANGE_KERNEL, CompletionStamp::notReady, CompletionStamp::notReady); - - std::stringstream stream; - std::unordered_map map; - map[&event] = 0; - std::stringstream expected; - - event.setStatus(CL_SUBMITTED); - EventsTracker::dumpNode(&event, stream, map); - - expected << "e0[label=\"{-----------EVENT ptr=" << &event - << "------|CL_COMMAND_NDRANGE_KERNEL|CL_SUBMITTED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=yellow];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenSubmittedUserEventThenDumpingWithProperLabel) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::stringstream expected; - - uEvent.setStatus(CL_SUBMITTED); - EventsTracker::dumpNode(&uEvent, stream, map); - - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent - << "------||CL_SUBMITTED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenUserEventWithUnproperStatusThenDumpingWithProperLabel) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::stringstream expected; - - uEvent.setStatus(-1); - EventsTracker::dumpNode(&uEvent, stream, map); - - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent - << "------||ABORTED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=green];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenRunningEventThenDumpingWithProperLabel) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::stringstream expected; - - uEvent.setStatus(CL_RUNNING); - EventsTracker::dumpNode(&uEvent, stream, map); - - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_RUNNING|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} -TEST(EventsTracker, givenQueuedEventThenDumpingWithProperLabel) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::stringstream expected; - - uEvent.setStatus(CL_QUEUED); - EventsTracker::dumpNode(&uEvent, stream, map); - - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} -TEST(EventsTracker, givenCompleteEventThenDumpingWithProperLabel) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::stringstream expected; - - uEvent.setStatus(CL_COMPLETE); - EventsTracker::dumpNode(&uEvent, stream, map); - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent << "------||CL_COMPLETE|task count=NOT_READY, level=0|CALLBACKS=FALSE}\",color=green];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenNullptrEventThenNotDumpingGraph) { - Event *ev = nullptr; - - std::stringstream stream; - std::unordered_map map; - map[ev] = 0; - std::set dumpedCmdQs; - std::set dumpedEvents; - - EventsTracker::dumpGraph(ev, stream, dumpedCmdQs, dumpedEvents, map); - - EXPECT_STREQ("", stream.str().c_str()); -} - -TEST(EventsTracker, givenAlreadyDumpedEventThenNotDumpingGraph) { - UserEvent uEvent; - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - std::set dumpedCmdQs; - std::set dumpedEvents; - - dumpedEvents.insert(&uEvent); - EventsTracker::dumpGraph(&uEvent, stream, dumpedCmdQs, dumpedEvents, map); - - EXPECT_STREQ("", stream.str().c_str()); -} - -TEST(EventsTracker, givenCmdqAndItsVirtualEventThenDumpingProperGraph) { - MockContext ctx; - MockCommandQueue cmdq; - VirtualEvent vEvent(&cmdq, &ctx); - vEvent.setCurrentCmdQVirtualEvent(true); - vEvent.updateTaskCount(1, 0); - - std::stringstream stream; - std::unordered_map map; - map[&vEvent] = 0; - std::set dumpedCmdQs; - std::set dumpedEvents; - - EventsTracker::dumpGraph(&vEvent, stream, dumpedCmdQs, dumpedEvents, map); - std::stringstream expected; - expected << EventsTracker::label(&cmdq) << "[label=\"{------CmdQueue, ptr=" << &cmdq << "------|task count=0, level=0}\",color=blue];\ne0[label=\"{---------V_EVENT ptr=" << &vEvent - << "------|CMD_UNKNOWN:4294967295|CL_QUEUED|task count=1, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n" - << EventsTracker::label(&cmdq) << "->e0[label=\"VIRTUAL_EVENT\"];\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); -} - -TEST(EventsTracker, givenTwoEventsWithCommonParentEventThenDumpingProperGraph) { - UserEvent uEvent, uEventChild1, uEventChild2; - uEvent.addChild(uEventChild1); - uEvent.addChild(uEventChild2); - - std::stringstream stream; - std::unordered_map map; - map[&uEvent] = 0; - map[&uEventChild1] = 1; - map[&uEventChild2] = 2; - std::set dumpedCmdQs; - std::set dumpedEvents; - - EventsTracker::dumpGraph(&uEvent, stream, dumpedCmdQs, dumpedEvents, map); - std::stringstream expected; - expected << "e0[label=\"{------USER_EVENT ptr=" << &uEvent - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne2[label=\"{------USER_EVENT ptr=" << &uEventChild2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e2;\ne1[label=\"{------USER_EVENT ptr=" << &uEventChild1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e1;\n"; - - EXPECT_STREQ(expected.str().c_str(), stream.str().c_str()); - - uEventChild1.updateCompletionStamp(0, 0, 0, 0); - uEventChild2.updateCompletionStamp(0, 0, 0, 0); - uEvent.updateCompletionStamp(0, 0, 0, 0); - uEvent.setStatus(0); -} - -TEST(EventsTracker, DISABLED_whenCalingCreateDumpStreamThenGettingValidFstreamInstance) { - std::string testFileName("EventsTracker_testfile.gv"); - std::shared_ptr stream = EventsTracker::getEventsTracker().createDumpStream(testFileName); - - EXPECT_TRUE(stream->good()); - - static_cast(stream.get())->close(); - remove(testFileName.c_str()); - EventsTrackerMock::shutdownGlobalEvTracker(); -} - -TEST(EventsTracker, whenDeletingEventTwoTimesThenDeletingIsProper) { - UserEvent uEvent1; - EventsTrackerMock evTrackerMock; - - std::stringstream expected; - - evTrackerMock.getList()->pushFrontOne(*new TrackedEvent{&uEvent1, 1}); - evTrackerMock.getList()->pushFrontOne(*new TrackedEvent{&uEvent1, -2}); - evTrackerMock.getList()->pushFrontOne(*new TrackedEvent{&uEvent1, -3}); - evTrackerMock.dump(); - - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); -} - -TEST(EventsTracker, givenTwoEventsWithSamePtrWhenFirstOneIsDeletedThenDumpingFirstProperly) { - UserEvent uEvent; - EventsTrackerMock evTrackerMock; - - std::stringstream expected; - - evTrackerMock.getList()->pushFrontOne(*new TrackedEvent{&uEvent, 2}); - evTrackerMock.getList()->pushFrontOne(*new TrackedEvent{&uEvent, -1}); - evTrackerMock.dump(); - - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne2[label=\"{------USER_EVENT ptr=" - << &uEvent << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); -} - -TEST(EventsTracker, whenNotifyCreationOfEventThenEventIsDumped) { - Event event(nullptr, CL_COMMAND_USER, CompletionStamp::notReady, CompletionStamp::notReady); - EventsTrackerMock evTrackerMock; - - std::stringstream expected; - - evTrackerMock.notifyCreation(&event); - - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); -} - -TEST(EventsTracker, whenNotifyTransitionedExecutionStatusOfEventThenEventIsDumpedWithProperDescription) { - UserEvent uEvent; - EventsTrackerMock evTrackerMock; - - evTrackerMock.notifyCreation(&uEvent); - evTrackerMock.notifyTransitionedExecutionStatus(); - - std::stringstream expected; - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne0[label=\"{------USER_EVENT ptr=" << &uEvent - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); -} - -TEST(EventsTracker, whenNotifyDestructionOfEventThenEventIsDumped) { - UserEvent *uEvent = new UserEvent(); - EventsTrackerMock evTrackerMock; - - evTrackerMock.notifyCreation(uEvent); - evTrackerMock.notifyDestruction(uEvent); - delete uEvent; - - std::stringstream stream; - stream << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(stream.str().c_str(), evTrackerMock.streamMock.c_str()); -} - -TEST(EventsTracker, givenSeveralEventsWhenOneIsCompleteThenDumpingWithProperLabels) { - UserEvent *uEvent1 = new UserEvent(); - UserEvent *uEvent2 = new UserEvent(); - UserEvent *uEvent3 = new UserEvent(); - EventsTrackerMock evTrackerMock; - - evTrackerMock.notifyCreation(uEvent1); - evTrackerMock.notifyCreation(uEvent2); - evTrackerMock.notifyCreation(uEvent3); - uEvent2->setStatus(CL_COMPLETE); - evTrackerMock.notifyTransitionedExecutionStatus(); - evTrackerMock.notifyDestruction(uEvent2); - delete uEvent2; - - std::stringstream stream; - stream << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne2[label=\"{------USER_EVENT ptr=" << uEvent3 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0[label=\"{------USER_EVENT ptr=" << uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(stream.str().c_str(), evTrackerMock.streamMock.c_str()); - delete uEvent1; - delete uEvent3; -} - -TEST(EventsTracker, givenEventsWithDependenciesBetweenThemThenDumpingProperGraph) { - EventsTrackerMock evTrackerMock; - - UserEvent uEvent1; - evTrackerMock.notifyCreation(&uEvent1); - evTrackerMock.dump(); - - std::stringstream expected; - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne0[label=\"{------USER_EVENT ptr=" << &uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); - - UserEvent uEvent2; - evTrackerMock.notifyCreation(&uEvent2); - evTrackerMock.dump(); - - expected.str(std::string()); - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne1[label=\"{------USER_EVENT ptr=" << &uEvent2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0[label=\"{------USER_EVENT ptr=" << &uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); - - UserEvent uEventChild1; - evTrackerMock.notifyCreation(&uEventChild1); - uEvent1.addChild(uEventChild1); - evTrackerMock.dump(); - - expected.str(std::string()); - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne1[label=\"{------USER_EVENT ptr=" << &uEvent2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0[label=\"{------USER_EVENT ptr=" << &uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne2[label=\"{------USER_EVENT ptr=" << &uEventChild1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e2;\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); - - UserEvent uEventChild2; - evTrackerMock.notifyCreation(&uEventChild2); - uEvent1.addChild(uEventChild2); - evTrackerMock.dump(); - - expected.str(std::string()); - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne1[label=\"{------USER_EVENT ptr=" << &uEvent2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0[label=\"{------USER_EVENT ptr=" << &uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne3[label=\"{------USER_EVENT ptr=" << &uEventChild2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e3;\ne2[label=\"{------USER_EVENT ptr=" << &uEventChild1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e2;\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); - - uEvent2.addChild(uEvent1); - evTrackerMock.dump(); - - expected.str(std::string()); - expected << "digraph events_registry_" << &evTrackerMock << " {\nnode [shape=record]\n//pragma: somePragmaData\ne1[label=\"{------USER_EVENT ptr=" << &uEvent2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0[label=\"{------USER_EVENT ptr=" << &uEvent1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne3[label=\"{------USER_EVENT ptr=" << &uEventChild2 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e3;\ne2[label=\"{------USER_EVENT ptr=" << &uEventChild1 - << "------||CL_QUEUED|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\ne0->e2;\ne1->e0;\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMock.streamMock.c_str()); - - uEventChild1.updateCompletionStamp(0, 0, 0, 0); - uEventChild2.updateCompletionStamp(0, 0, 0, 0); - uEvent2.updateCompletionStamp(0, 0, 0, 0); - uEvent1.updateCompletionStamp(0, 0, 0, 0); - uEvent2.setStatus(0); - uEvent1.setStatus(0); -} - -TEST(EventsTracker, whenEventsDebugEnableFlagIsTrueAndCreateOrChangeStatusOrDestroyEventThenDumpingGraph) { - DebugManagerStateRestore dbRestore; - debugManager.flags.EventsTrackerEnable.set(true); - - EventsTrackerMock evTrackerMock; - evTrackerMock.overrideGlobal(); - - Event *ev = new Event(nullptr, CL_COMMAND_NDRANGE_KERNEL, CompletionStamp::notReady, CompletionStamp::notReady); - - std::stringstream expected; - expected << "digraph events_registry_" << &EventsTracker::getEventsTracker() << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), static_cast(&EventsTracker::getEventsTracker())->streamMock.c_str()); - - ev->setStatus(1); - - expected.str(std::string()); - expected << "digraph events_registry_" << &EventsTracker::getEventsTracker() << " {\nnode [shape=record]\n//pragma: somePragmaData\ne0[label=\"{-----------EVENT ptr=" << ev - << "------|CL_COMMAND_NDRANGE_KERNEL|CL_RUNNING|task count=NOT_READY, level=NOT_READY|CALLBACKS=FALSE}\",color=red];\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), static_cast(&EventsTracker::getEventsTracker())->streamMock.c_str()); - - delete ev; - - expected.str(std::string()); - expected << "digraph events_registry_" << &EventsTracker::getEventsTracker() << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), static_cast(&EventsTracker::getEventsTracker())->streamMock.c_str()); - - evTrackerMock.restoreGlobal(); -} - -TEST(EventsTracker, givenEventsFromDifferentThreadsThenDumpingProperly) { - - class EventsTrackerMockMT : public EventsTrackerMock { - public: - TrackedEvent *getNodes() override { - auto trackedEventsMock = std::shared_ptr>{new IFList}; - return trackedEventsMock->detachNodes(); - } - std::shared_ptr> *trackedEventsMock; - }; - - auto evTrackerMockMT = std::shared_ptr{new EventsTrackerMockMT()}; - UserEvent uEvent1; - UserEvent uEvent2; - - evTrackerMockMT->getList()->pushFrontOne(*new TrackedEvent{&uEvent1, 2}); - evTrackerMockMT->getList()->pushFrontOne(*new TrackedEvent{&uEvent2, 3}); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks), NEO-14033 - evTrackerMockMT->dump(); // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks), NEO-14033 - - std::stringstream expected; - expected << "digraph events_registry_" << evTrackerMockMT - << " {\nnode [shape=record]\n//pragma: somePragmaData\n\n}\n"; - - EXPECT_STREQ(expected.str().c_str(), evTrackerMockMT->streamMock.c_str()); -} diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 0e34c2e79d..a1c4f3ae53 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -341,7 +341,6 @@ DECLARE_DEBUG_VARIABLE(bool, LogWaitingForCompletion, false, "Logs waiting for c DECLARE_DEBUG_VARIABLE(bool, LogUsmReuse, false, "Logs operations of usm reuse to csv file") DECLARE_DEBUG_VARIABLE(bool, ResidencyDebugEnable, false, "enables debug messages and checks for Residency Model") DECLARE_DEBUG_VARIABLE(bool, EventsDebugEnable, false, "enables debug messages for events, virtual events, blocked enqueues, events trees etc.") -DECLARE_DEBUG_VARIABLE(bool, EventsTrackerEnable, false, "enables event graphs dumping") DECLARE_DEBUG_VARIABLE(bool, PrintLWSSizes, false, "prints driver chosen local workgroup sizes") DECLARE_DEBUG_VARIABLE(bool, PrintDispatchParameters, false, "prints dispatch parameters of kernels passed to clEnqueueNDRangeKernel") DECLARE_DEBUG_VARIABLE(bool, PrintProgramBinaryProcessingTime, false, "prints execution time of Program::processGenBinary() method during program building") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index d1f7f2af55..b102ff5e06 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -95,7 +95,6 @@ LogAllocationMemoryPool = 0 LogMemoryObject = 0 ResidencyDebugEnable = 0 EventsDebugEnable = 0 -EventsTrackerEnable = 0 PrintLWSSizes = 0 PrintDispatchParameters = 0 PrintProgramBinaryProcessingTime = 0