| //===- OmptCallbackHandler.cpp - OMPT Callback handling impl. ---*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file contains the OMPT callback handling implementations. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "OmptCallbackHandler.h" |
| |
| using namespace omptest; |
| |
| OmptCallbackHandler *Handler = nullptr; |
| |
| OmptCallbackHandler &OmptCallbackHandler::get() { |
| if (Handler == nullptr) |
| Handler = new OmptCallbackHandler(); |
| |
| return *Handler; |
| } |
| |
| void OmptCallbackHandler::subscribe(OmptListener *Listener) { |
| Subscribers.push_back(Listener); |
| } |
| |
| void OmptCallbackHandler::clearSubscribers() { |
| replay(); |
| |
| Subscribers.clear(); |
| } |
| |
| void OmptCallbackHandler::replay() { |
| if (!RecordAndReplay) |
| return; |
| |
| for (auto &E : RecordedEvents) |
| for (const auto &S : Subscribers) |
| S->notify(std::move(E)); |
| } |
| |
| void OmptCallbackHandler::handleThreadBegin(ompt_thread_t ThreadType, |
| ompt_data_t *ThreadData) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::ThreadBegin( |
| "Thread Begin", "", ObserveState::Generated, ThreadType)); |
| return; |
| } |
| |
| // Initial thread event likely to preceed assertion registration, so skip |
| if (ThreadType == ompt_thread_initial) |
| return; |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::ThreadBegin( |
| "Thread Begin", "", ObserveState::Generated, ThreadType)); |
| } |
| |
| void OmptCallbackHandler::handleThreadEnd(ompt_data_t *ThreadData) { |
| if (RecordAndReplay) { |
| recordEvent( |
| OmptAssertEvent::ThreadEnd("Thread End", "", ObserveState::Generated)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify( |
| OmptAssertEvent::ThreadEnd("Thread End", "", ObserveState::Generated)); |
| } |
| |
| void OmptCallbackHandler::handleTaskCreate( |
| ompt_data_t *EncounteringTaskData, |
| const ompt_frame_t *EncounteringTaskFrame, ompt_data_t *NewTaskData, |
| int Flags, int HasDependences, const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TaskCreate( |
| "Task Create", "", ObserveState::Generated, EncounteringTaskData, |
| EncounteringTaskFrame, NewTaskData, Flags, HasDependences, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TaskCreate( |
| "Task Create", "", ObserveState::Generated, EncounteringTaskData, |
| EncounteringTaskFrame, NewTaskData, Flags, HasDependences, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleTaskSchedule(ompt_data_t *PriorTaskData, |
| ompt_task_status_t PriorTaskStatus, |
| ompt_data_t *NextTaskData) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TaskSchedule("Task Schedule", "", |
| ObserveState::Generated)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TaskSchedule("Task Schedule", "", |
| ObserveState::Generated)); |
| } |
| |
| void OmptCallbackHandler::handleImplicitTask(ompt_scope_endpoint_t Endpoint, |
| ompt_data_t *ParallelData, |
| ompt_data_t *TaskData, |
| unsigned int ActualParallelism, |
| unsigned int Index, int Flags) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::ImplicitTask( |
| "Implicit Task", "", ObserveState::Generated, Endpoint, ParallelData, |
| TaskData, ActualParallelism, Index, Flags)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::ImplicitTask( |
| "Implicit Task", "", ObserveState::Generated, Endpoint, ParallelData, |
| TaskData, ActualParallelism, Index, Flags)); |
| } |
| |
| void OmptCallbackHandler::handleParallelBegin( |
| ompt_data_t *EncounteringTaskData, |
| const ompt_frame_t *EncounteringTaskFrame, ompt_data_t *ParallelData, |
| unsigned int RequestedParallelism, int Flags, const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::ParallelBegin( |
| "Parallel Begin", "", ObserveState::Generated, RequestedParallelism)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::ParallelBegin( |
| "Parallel Begin", "", ObserveState::Generated, RequestedParallelism)); |
| } |
| |
| void OmptCallbackHandler::handleParallelEnd(ompt_data_t *ParallelData, |
| ompt_data_t *EncounteringTaskData, |
| int Flags, const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::ParallelEnd("Parallel End", "", |
| ObserveState::Generated)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::ParallelEnd("Parallel End", "", |
| ObserveState::Generated)); |
| } |
| |
| void OmptCallbackHandler::handleDeviceInitialize( |
| int DeviceNum, const char *Type, ompt_device_t *Device, |
| ompt_function_lookup_t LookupFn, const char *DocumentationStr) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::DeviceInitialize( |
| "Device Inititalize", "", ObserveState::Generated, DeviceNum, Type, |
| Device, LookupFn, DocumentationStr)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::DeviceInitialize( |
| "Device Inititalize", "", ObserveState::Generated, DeviceNum, Type, |
| Device, LookupFn, DocumentationStr)); |
| } |
| |
| void OmptCallbackHandler::handleDeviceFinalize(int DeviceNum) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::DeviceFinalize( |
| "Device Finalize", "", ObserveState::Generated, DeviceNum)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::DeviceFinalize( |
| "Device Finalize", "", ObserveState::Generated, DeviceNum)); |
| } |
| |
| void OmptCallbackHandler::handleTarget(ompt_target_t Kind, |
| ompt_scope_endpoint_t Endpoint, |
| int DeviceNum, ompt_data_t *TaskData, |
| ompt_id_t TargetId, |
| const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::Target("Target", "", ObserveState::Generated, |
| Kind, Endpoint, DeviceNum, TaskData, |
| TargetId, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::Target("Target", "", ObserveState::Generated, |
| Kind, Endpoint, DeviceNum, TaskData, |
| TargetId, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleTargetEmi(ompt_target_t Kind, |
| ompt_scope_endpoint_t Endpoint, |
| int DeviceNum, ompt_data_t *TaskData, |
| ompt_data_t *TargetTaskData, |
| ompt_data_t *TargetData, |
| const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TargetEmi( |
| "Target EMI", "", ObserveState::Generated, Kind, Endpoint, DeviceNum, |
| TaskData, TargetTaskData, TargetData, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TargetEmi( |
| "Target EMI", "", ObserveState::Generated, Kind, Endpoint, DeviceNum, |
| TaskData, TargetTaskData, TargetData, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleTargetSubmit(ompt_id_t TargetId, |
| ompt_id_t HostOpId, |
| unsigned int RequestedNumTeams) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TargetSubmit("Target Submit", "", |
| ObserveState::Generated, TargetId, |
| HostOpId, RequestedNumTeams)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TargetSubmit("Target Submit", "", |
| ObserveState::Generated, TargetId, |
| HostOpId, RequestedNumTeams)); |
| } |
| |
| void OmptCallbackHandler::handleTargetSubmitEmi( |
| ompt_scope_endpoint_t Endpoint, ompt_data_t *TargetData, |
| ompt_id_t *HostOpId, unsigned int RequestedNumTeams) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TargetSubmitEmi( |
| "Target Submit EMI", "", ObserveState::Generated, Endpoint, TargetData, |
| HostOpId, RequestedNumTeams)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TargetSubmitEmi( |
| "Target Submit EMI", "", ObserveState::Generated, Endpoint, TargetData, |
| HostOpId, RequestedNumTeams)); |
| } |
| |
| void OmptCallbackHandler::handleTargetDataOp( |
| ompt_id_t TargetId, ompt_id_t HostOpId, ompt_target_data_op_t OpType, |
| void *SrcAddr, int SrcDeviceNum, void *DstAddr, int DstDeviceNum, |
| size_t Bytes, const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TargetDataOp( |
| "Target Data Op", "", ObserveState::Generated, TargetId, HostOpId, |
| OpType, SrcAddr, SrcDeviceNum, DstAddr, DstDeviceNum, Bytes, |
| CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TargetDataOp( |
| "Target Data Op", "", ObserveState::Generated, TargetId, HostOpId, |
| OpType, SrcAddr, SrcDeviceNum, DstAddr, DstDeviceNum, Bytes, |
| CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleTargetDataOpEmi( |
| ompt_scope_endpoint_t Endpoint, ompt_data_t *TargetTaskData, |
| ompt_data_t *TargetData, ompt_id_t *HostOpId, ompt_target_data_op_t OpType, |
| void *SrcAddr, int SrcDeviceNum, void *DstAddr, int DstDeviceNum, |
| size_t Bytes, const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::TargetDataOpEmi( |
| "Target Data Op EMI", "", ObserveState::Generated, Endpoint, |
| TargetTaskData, TargetData, HostOpId, OpType, SrcAddr, SrcDeviceNum, |
| DstAddr, DstDeviceNum, Bytes, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::TargetDataOpEmi( |
| "Target Data Op EMI", "", ObserveState::Generated, Endpoint, |
| TargetTaskData, TargetData, HostOpId, OpType, SrcAddr, SrcDeviceNum, |
| DstAddr, DstDeviceNum, Bytes, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleDeviceLoad(int DeviceNum, const char *Filename, |
| int64_t OffsetInFile, |
| void *VmaInFile, size_t Bytes, |
| void *HostAddr, void *DeviceAddr, |
| uint64_t ModuleId) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::DeviceLoad( |
| "Device Load", "", ObserveState::Generated, DeviceNum, Filename, |
| OffsetInFile, VmaInFile, Bytes, HostAddr, DeviceAddr, ModuleId)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::DeviceLoad( |
| "Device Load", "", ObserveState::Generated, DeviceNum, Filename, |
| OffsetInFile, VmaInFile, Bytes, HostAddr, DeviceAddr, ModuleId)); |
| } |
| |
| void OmptCallbackHandler::handleDeviceUnload(int DeviceNum, uint64_t ModuleId) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::DeviceUnload("Device Unload", "", |
| ObserveState::Generated)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::DeviceUnload("Device Unload", "", |
| ObserveState::Generated)); |
| } |
| |
| void OmptCallbackHandler::handleBufferRequest(int DeviceNum, |
| ompt_buffer_t **Buffer, |
| size_t *Bytes) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::BufferRequest("Buffer Request", "", |
| ObserveState::Generated, |
| DeviceNum, Buffer, Bytes)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::BufferRequest("Buffer Request", "", |
| ObserveState::Generated, DeviceNum, |
| Buffer, Bytes)); |
| } |
| |
| void OmptCallbackHandler::handleBufferComplete(int DeviceNum, |
| ompt_buffer_t *Buffer, |
| size_t Bytes, |
| ompt_buffer_cursor_t Begin, |
| int BufferOwned) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::BufferComplete( |
| "Buffer Complete", "", ObserveState::Generated, DeviceNum, Buffer, |
| Bytes, Begin, BufferOwned)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::BufferComplete( |
| "Buffer Complete", "", ObserveState::Generated, DeviceNum, Buffer, |
| Bytes, Begin, BufferOwned)); |
| } |
| |
| void OmptCallbackHandler::handleBufferRecord(ompt_record_ompt_t *Record) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::BufferRecord("Buffer Record", "", |
| ObserveState::Generated, Record)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::BufferRecord("Buffer Record", "", |
| ObserveState::Generated, Record)); |
| } |
| |
| void OmptCallbackHandler::handleBufferRecordDeallocation( |
| ompt_buffer_t *Buffer) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::BufferRecordDeallocation( |
| "Buffer Deallocation", "", ObserveState::Generated, Buffer)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::BufferRecordDeallocation( |
| "Buffer Deallocation", "", ObserveState::Generated, Buffer)); |
| } |
| |
| void OmptCallbackHandler::handleWork(ompt_work_t WorkType, |
| ompt_scope_endpoint_t Endpoint, |
| ompt_data_t *ParallelData, |
| ompt_data_t *TaskData, uint64_t Count, |
| const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::Work("Work", "", ObserveState::Generated, |
| WorkType, Endpoint, ParallelData, |
| TaskData, Count, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::Work("Work", "", ObserveState::Generated, |
| WorkType, Endpoint, ParallelData, TaskData, |
| Count, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleSyncRegion(ompt_sync_region_t Kind, |
| ompt_scope_endpoint_t Endpoint, |
| ompt_data_t *ParallelData, |
| ompt_data_t *TaskData, |
| const void *CodeptrRA) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::SyncRegion( |
| "SyncRegion", "", ObserveState::Generated, Kind, Endpoint, ParallelData, |
| TaskData, CodeptrRA)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::SyncRegion( |
| "SyncRegion", "", ObserveState::Generated, Kind, Endpoint, ParallelData, |
| TaskData, CodeptrRA)); |
| } |
| |
| void OmptCallbackHandler::handleDispatch(ompt_data_t *ParallelData, |
| ompt_data_t *TaskData, |
| ompt_dispatch_t Kind, |
| ompt_data_t Instance) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::Dispatch("Dispatch", "", |
| ObserveState::Generated, ParallelData, |
| TaskData, Kind, Instance)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::Dispatch("Dispatch", "", ObserveState::Generated, |
| ParallelData, TaskData, Kind, |
| Instance)); |
| } |
| |
| void OmptCallbackHandler::handleAssertionSyncPoint( |
| const std::string &SyncPointName) { |
| if (RecordAndReplay) { |
| recordEvent(OmptAssertEvent::AssertionSyncPoint( |
| "Assertion SyncPoint", "", ObserveState::Generated, SyncPointName)); |
| return; |
| } |
| |
| for (const auto &S : Subscribers) |
| S->notify(OmptAssertEvent::AssertionSyncPoint( |
| "Assertion SyncPoint", "", ObserveState::Generated, SyncPointName)); |
| } |
| |
| void OmptCallbackHandler::recordEvent(OmptAssertEvent &&Event) { |
| RecordedEvents.emplace_back(std::forward<OmptAssertEvent>(Event)); |
| } |