//===- OmptAssertEvent.h - Assertion event declarations ---------*- 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 /// Contains assertion event constructors, for generally all observable events. /// This includes user-generated events, like synchronization. /// //===----------------------------------------------------------------------===// #ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_OMPTASSERTEVENT_H #define OPENMP_TOOLS_OMPTEST_INCLUDE_OMPTASSERTEVENT_H #include "InternalEvent.h" #include "omp-tools.h" #include #include #include #include namespace omptest { enum class ObserveState { Generated, Always, Never }; /// Helper function, returning an ObserveState string representation const char *to_string(ObserveState State); /// Assertion event struct, provides statically callable CTORs. struct OmptAssertEvent { static OmptAssertEvent AssertionSyncPoint(const std::string &Name, const std::string &Group, const ObserveState &Expected, const std::string &SyncPointName); static OmptAssertEvent AssertionSuspend(const std::string &Name, const std::string &Group, const ObserveState &Expected); static OmptAssertEvent ThreadBegin(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_thread_t ThreadType); static OmptAssertEvent ThreadEnd(const std::string &Name, const std::string &Group, const ObserveState &Expected); static OmptAssertEvent ParallelBegin(const std::string &Name, const std::string &Group, const ObserveState &Expected, int NumThreads); static OmptAssertEvent ParallelEnd( const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_data_t *ParallelData = expectedDefault(ompt_data_t *), ompt_data_t *EncounteringTaskData = expectedDefault(ompt_data_t *), int Flags = expectedDefault(int), const void *CodeptrRA = expectedDefault(const void *)); static OmptAssertEvent Work(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_work_t WorkType, ompt_scope_endpoint_t Endpoint, ompt_data_t *ParallelData = expectedDefault(ompt_data_t *), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), uint64_t Count = expectedDefault(uint64_t), const void *CodeptrRA = expectedDefault(const void *)); static OmptAssertEvent Dispatch(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_data_t *ParallelData = expectedDefault(ompt_data_t *), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), ompt_dispatch_t Kind = expectedDefault(ompt_dispatch_t), ompt_data_t Instance = expectedDefault(ompt_data_t)); static OmptAssertEvent TaskCreate(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_data_t *EncounteringTaskData = expectedDefault(ompt_data_t *), const ompt_frame_t *EncounteringTaskFrame = expectedDefault(ompt_frame_t *), ompt_data_t *NewTaskData = expectedDefault(ompt_data_t *), int Flags = expectedDefault(int), int HasDependences = expectedDefault(int), const void *CodeptrRA = expectedDefault(const void *)); static OmptAssertEvent TaskSchedule(const std::string &Name, const std::string &Group, const ObserveState &Expected); static OmptAssertEvent ImplicitTask(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_scope_endpoint_t Endpoint, ompt_data_t *ParallelData = expectedDefault(ompt_data_t *), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), unsigned int ActualParallelism = expectedDefault(unsigned int), unsigned int Index = expectedDefault(unsigned int), int Flags = expectedDefault(int)); static OmptAssertEvent SyncRegion(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_sync_region_t Kind, ompt_scope_endpoint_t Endpoint, ompt_data_t *ParallelData = expectedDefault(ompt_data_t *), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), const void *CodeptrRA = expectedDefault(const void *)); static OmptAssertEvent Target(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_target_t Kind, ompt_scope_endpoint_t Endpoint, int DeviceNum = expectedDefault(int), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), ompt_id_t TargetId = expectedDefault(ompt_id_t), const void *CodeptrRA = expectedDefault(void *)); static OmptAssertEvent TargetEmi(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_target_t Kind, ompt_scope_endpoint_t Endpoint, int DeviceNum = expectedDefault(int), ompt_data_t *TaskData = expectedDefault(ompt_data_t *), ompt_data_t *TargetTaskData = expectedDefault(ompt_data_t *), ompt_data_t *TargetData = expectedDefault(ompt_data_t *), const void *CodeptrRA = expectedDefault(void *)); static OmptAssertEvent TargetDataOp(const std::string &Name, const std::string &Group, const ObserveState &Expected, 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); static OmptAssertEvent TargetDataOp(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_target_data_op_t OpType, size_t Bytes = expectedDefault(size_t), void *SrcAddr = expectedDefault(void *), void *DstAddr = expectedDefault(void *), int SrcDeviceNum = expectedDefault(int), int DstDeviceNum = expectedDefault(int), ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t), const void *CodeptrRA = expectedDefault(void *)); static OmptAssertEvent TargetDataOpEmi(const std::string &Name, const std::string &Group, const ObserveState &Expected, 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); static OmptAssertEvent TargetDataOpEmi(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_target_data_op_t OpType, ompt_scope_endpoint_t Endpoint, size_t Bytes = expectedDefault(size_t), void *SrcAddr = expectedDefault(void *), void *DstAddr = expectedDefault(void *), int SrcDeviceNum = expectedDefault(int), int DstDeviceNum = expectedDefault(int), ompt_data_t *TargetTaskData = expectedDefault(ompt_data_t *), ompt_data_t *TargetData = expectedDefault(ompt_data_t *), ompt_id_t *HostOpId = expectedDefault(ompt_id_t *), const void *CodeptrRA = expectedDefault(void *)); static OmptAssertEvent TargetSubmit(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_id_t TargetId, ompt_id_t HostOpId, unsigned int RequestedNumTeams); static OmptAssertEvent TargetSubmit(const std::string &Name, const std::string &Group, const ObserveState &Expected, unsigned int RequestedNumTeams, ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t)); static OmptAssertEvent TargetSubmitEmi(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_scope_endpoint_t Endpoint, ompt_data_t *TargetData, ompt_id_t *HostOpId, unsigned int RequestedNumTeams); static OmptAssertEvent TargetSubmitEmi(const std::string &Name, const std::string &Group, const ObserveState &Expected, unsigned int RequestedNumTeams, ompt_scope_endpoint_t Endpoint, ompt_data_t *TargetData = expectedDefault(ompt_data_t *), ompt_id_t *HostOpId = expectedDefault(ompt_id_t *)); static OmptAssertEvent ControlTool(const std::string &Name, const std::string &Group, const ObserveState &Expected); static OmptAssertEvent DeviceInitialize( const std::string &Name, const std::string &Group, const ObserveState &Expected, int DeviceNum, const char *Type = expectedDefault(const char *), ompt_device_t *Device = expectedDefault(ompt_device_t *), ompt_function_lookup_t LookupFn = expectedDefault(ompt_function_lookup_t), const char *DocumentationStr = expectedDefault(const char *)); static OmptAssertEvent DeviceFinalize(const std::string &Name, const std::string &Group, const ObserveState &Expected, int DeviceNum); static OmptAssertEvent DeviceLoad(const std::string &Name, const std::string &Group, const ObserveState &Expected, int DeviceNum, const char *Filename = expectedDefault(const char *), int64_t OffsetInFile = expectedDefault(int64_t), void *VmaInFile = expectedDefault(void *), size_t Bytes = expectedDefault(size_t), void *HostAddr = expectedDefault(void *), void *DeviceAddr = expectedDefault(void *), uint64_t ModuleId = expectedDefault(int64_t)); static OmptAssertEvent DeviceUnload(const std::string &Name, const std::string &Group, const ObserveState &Expected); static OmptAssertEvent BufferRequest(const std::string &Name, const std::string &Group, const ObserveState &Expected, int DeviceNum, ompt_buffer_t **Buffer, size_t *Bytes); static OmptAssertEvent BufferComplete(const std::string &Name, const std::string &Group, const ObserveState &Expected, int DeviceNum, ompt_buffer_t *Buffer, size_t Bytes, ompt_buffer_cursor_t Begin, int BufferOwned); static OmptAssertEvent BufferRecord(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_record_ompt_t *Record); /// Handle type = ompt_record_target_t static OmptAssertEvent BufferRecord(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_callbacks_t Type, ompt_target_t Kind, ompt_scope_endpoint_t Endpoint, int DeviceNum = expectedDefault(int), ompt_id_t TaskId = expectedDefault(ompt_id_t), ompt_id_t TargetId = expectedDefault(ompt_id_t), const void *CodeptrRA = expectedDefault(void *)); /// Handle type = ompt_callback_target_data_op static OmptAssertEvent BufferRecord(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_callbacks_t Type, ompt_target_data_op_t OpType, size_t Bytes, std::pair Timeframe, void *SrcAddr = expectedDefault(void *), void *DstAddr = expectedDefault(void *), int SrcDeviceNum = expectedDefault(int), int DstDeviceNum = expectedDefault(int), ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t), const void *CodeptrRA = expectedDefault(void *)); /// Handle type = ompt_callback_target_data_op static OmptAssertEvent BufferRecord( const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_callbacks_t Type, ompt_target_data_op_t OpType, size_t Bytes = expectedDefault(size_t), ompt_device_time_t MinimumTimeDelta = expectedDefault(ompt_device_time_t), void *SrcAddr = expectedDefault(void *), void *DstAddr = expectedDefault(void *), int SrcDeviceNum = expectedDefault(int), int DstDeviceNum = expectedDefault(int), ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t), const void *CodeptrRA = expectedDefault(void *)); /// Handle type = ompt_callback_target_submit static OmptAssertEvent BufferRecord(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_callbacks_t Type, std::pair Timeframe, unsigned int RequestedNumTeams = expectedDefault(unsigned int), unsigned int GrantedNumTeams = expectedDefault(unsigned int), ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t)); /// Handle type = ompt_callback_target_submit /// Note: This will also act as the simplest default CTOR static OmptAssertEvent BufferRecord( const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_callbacks_t Type, ompt_device_time_t MinimumTimeDelta = expectedDefault(ompt_device_time_t), unsigned int RequestedNumTeams = expectedDefault(unsigned int), unsigned int GrantedNumTeams = expectedDefault(unsigned int), ompt_id_t TargetId = expectedDefault(ompt_id_t), ompt_id_t HostOpId = expectedDefault(ompt_id_t)); static OmptAssertEvent BufferRecordDeallocation(const std::string &Name, const std::string &Group, const ObserveState &Expected, ompt_buffer_t *Buffer); /// Allow move construction (due to std::unique_ptr) OmptAssertEvent(OmptAssertEvent &&o) = default; OmptAssertEvent &operator=(OmptAssertEvent &&o) = default; /// Get the event's name std::string getEventName() const; /// Get the event's group name std::string getEventGroup() const; /// Get the event's expected observation state ObserveState getEventExpectedState() const; /// Return the actual event type enum value internal::EventTy getEventType() const; /// Get a pointer to the internal event internal::InternalEvent *getEvent() const; /// Make events comparable friend bool operator==(const OmptAssertEvent &A, const OmptAssertEvent &B); /// Returns the string representation of the event std::string toString(bool PrefixEventName = false) const; private: OmptAssertEvent(const std::string &Name, const std::string &Group, const ObserveState &Expected, internal::InternalEvent *IE); OmptAssertEvent(const OmptAssertEvent &o) = delete; /// Determine the event name. Either it is provided directly or determined /// from the calling function's name. static std::string getName(const std::string &Name, const char *Caller = __builtin_FUNCTION()) { std::string EName = Name; if (EName.empty()) EName.append(Caller).append(" (auto generated)"); return EName; } /// Determine the event name. Either it is provided directly or "default". static std::string getGroup(const std::string &Group) { if (Group.empty()) return "default"; return Group; } std::string Name; std::string Group; ObserveState ExpectedState; std::unique_ptr TheEvent; }; /// POD type, which holds the target region id, corresponding to an event group. struct AssertEventGroup { AssertEventGroup(uint64_t TargetRegion) : TargetRegion(TargetRegion) {} uint64_t TargetRegion; }; bool operator==(const OmptAssertEvent &A, const OmptAssertEvent &B); } // namespace omptest #endif