blob: 1348c48f720054779296c504aaafdf979869484d [file] [log] [blame]
//===- InternalEvent.h - Internal event representation ----------*- 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
/// Declares internal event representations along the default CTOR definition.
///
//===----------------------------------------------------------------------===//
#ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_INTERNALEVENT_H
#define OPENMP_TOOLS_OMPTEST_INCLUDE_INTERNALEVENT_H
#include "InternalEventCommon.h"
#include <cstring>
#include <limits>
#include <omp-tools.h>
#define expectedDefault(TypeName) std::numeric_limits<TypeName>::min()
namespace omptest {
namespace util {
/// String manipulation helper function. Takes up to 8 bytes of data and returns
/// their hexadecimal representation as string. The data can be expanded to the
/// given size in bytes and will by default be prefixed with '0x'.
std::string makeHexString(uint64_t Data, bool IsPointer = true,
size_t DataBytes = 0, bool ShowHexBase = true);
} // namespace util
namespace internal {
struct AssertionSyncPoint : public EventBase<AssertionSyncPoint> {
std::string toString() const override;
AssertionSyncPoint(const std::string &Name) : Name(Name) {}
const std::string Name;
};
struct AssertionSuspend : public EventBase<AssertionSuspend> {
AssertionSuspend() = default;
};
struct ThreadBegin : public EventBase<ThreadBegin> {
std::string toString() const override;
ThreadBegin(ompt_thread_t ThreadType) : ThreadType(ThreadType) {}
ompt_thread_t ThreadType;
};
struct ThreadEnd : public EventBase<ThreadEnd> {
std::string toString() const override;
ThreadEnd() = default;
};
struct ParallelBegin : public EventBase<ParallelBegin> {
std::string toString() const override;
ParallelBegin(int NumThreads) : NumThreads(NumThreads) {}
unsigned int NumThreads;
};
struct ParallelEnd : public EventBase<ParallelEnd> {
std::string toString() const override;
ParallelEnd(ompt_data_t *ParallelData, ompt_data_t *EncounteringTaskData,
int Flags, const void *CodeptrRA)
: ParallelData(ParallelData), EncounteringTaskData(EncounteringTaskData),
Flags(Flags), CodeptrRA(CodeptrRA) {}
ompt_data_t *ParallelData;
ompt_data_t *EncounteringTaskData;
int Flags;
const void *CodeptrRA;
};
struct Work : public EventBase<Work> {
std::string toString() const override;
Work(ompt_work_t WorkType, ompt_scope_endpoint_t Endpoint,
ompt_data_t *ParallelData, ompt_data_t *TaskData, uint64_t Count,
const void *CodeptrRA)
: WorkType(WorkType), Endpoint(Endpoint), ParallelData(ParallelData),
TaskData(TaskData), Count(Count), CodeptrRA(CodeptrRA) {}
ompt_work_t WorkType;
ompt_scope_endpoint_t Endpoint;
ompt_data_t *ParallelData;
ompt_data_t *TaskData;
uint64_t Count;
const void *CodeptrRA;
};
struct Dispatch : public EventBase<Dispatch> {
std::string toString() const override;
Dispatch(ompt_data_t *ParallelData, ompt_data_t *TaskData,
ompt_dispatch_t Kind, ompt_data_t Instance)
: ParallelData(ParallelData), TaskData(TaskData), Kind(Kind),
Instance(Instance) {}
ompt_data_t *ParallelData;
ompt_data_t *TaskData;
ompt_dispatch_t Kind;
ompt_data_t Instance;
};
struct TaskCreate : public EventBase<TaskCreate> {
std::string toString() const override;
TaskCreate(ompt_data_t *EncounteringTaskData,
const ompt_frame_t *EncounteringTaskFrame,
ompt_data_t *NewTaskData, int Flags, int HasDependences,
const void *CodeptrRA)
: EncounteringTaskData(EncounteringTaskData),
EncounteringTaskFrame(EncounteringTaskFrame), NewTaskData(NewTaskData),
Flags(Flags), HasDependences(HasDependences), CodeptrRA(CodeptrRA) {}
ompt_data_t *EncounteringTaskData;
const ompt_frame_t *EncounteringTaskFrame;
ompt_data_t *NewTaskData;
int Flags;
int HasDependences;
const void *CodeptrRA;
};
struct Dependences : public EventBase<Dependences> {
Dependences() = default;
};
struct TaskDependence : public EventBase<TaskDependence> {
TaskDependence() = default;
};
struct TaskSchedule : public EventBase<TaskSchedule> {
TaskSchedule() = default;
};
struct ImplicitTask : public EventBase<ImplicitTask> {
std::string toString() const override;
ImplicitTask(ompt_scope_endpoint_t Endpoint, ompt_data_t *ParallelData,
ompt_data_t *TaskData, unsigned int ActualParallelism,
unsigned int Index, int Flags)
: Endpoint(Endpoint), ParallelData(ParallelData), TaskData(TaskData),
ActualParallelism(ActualParallelism), Index(Index), Flags(Flags) {}
ompt_scope_endpoint_t Endpoint;
ompt_data_t *ParallelData;
ompt_data_t *TaskData;
unsigned int ActualParallelism;
unsigned int Index;
int Flags;
};
struct Masked : public EventBase<Masked> {
Masked() = default;
};
struct SyncRegion : public EventBase<SyncRegion> {
std::string toString() const override;
SyncRegion(ompt_sync_region_t Kind, ompt_scope_endpoint_t Endpoint,
ompt_data_t *ParallelData, ompt_data_t *TaskData,
const void *CodeptrRA)
: Kind(Kind), Endpoint(Endpoint), ParallelData(ParallelData),
TaskData(TaskData), CodeptrRA(CodeptrRA) {}
ompt_sync_region_t Kind;
ompt_scope_endpoint_t Endpoint;
ompt_data_t *ParallelData;
ompt_data_t *TaskData;
const void *CodeptrRA;
};
struct MutexAcquire : public EventBase<MutexAcquire> {
MutexAcquire() = default;
};
struct Mutex : public EventBase<Mutex> {
Mutex() = default;
};
struct NestLock : public EventBase<NestLock> {
NestLock() = default;
};
struct Flush : public EventBase<Flush> {
Flush() = default;
};
struct Cancel : public EventBase<Cancel> {
Cancel() = default;
};
struct Target : public EventBase<Target> {
std::string toString() const override;
Target(ompt_target_t Kind, ompt_scope_endpoint_t Endpoint, int DeviceNum,
ompt_data_t *TaskData, ompt_id_t TargetId, const void *CodeptrRA)
: Kind(Kind), Endpoint(Endpoint), DeviceNum(DeviceNum),
TaskData(TaskData), TargetId(TargetId), CodeptrRA(CodeptrRA) {}
ompt_target_t Kind;
ompt_scope_endpoint_t Endpoint;
int DeviceNum;
ompt_data_t *TaskData;
ompt_id_t TargetId;
const void *CodeptrRA;
};
struct TargetEmi : public EventBase<TargetEmi> {
std::string toString() const override;
TargetEmi(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)
: Kind(Kind), Endpoint(Endpoint), DeviceNum(DeviceNum),
TaskData(TaskData), TargetTaskData(TargetTaskData),
TargetData(TargetData), CodeptrRA(CodeptrRA) {}
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;
};
struct TargetDataOp : public EventBase<TargetDataOp> {
std::string toString() const override;
TargetDataOp(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)
: TargetId(TargetId), HostOpId(HostOpId), OpType(OpType),
SrcAddr(SrcAddr), SrcDeviceNum(SrcDeviceNum), DstAddr(DstAddr),
DstDeviceNum(DstDeviceNum), Bytes(Bytes), CodeptrRA(CodeptrRA) {}
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;
};
struct TargetDataOpEmi : public EventBase<TargetDataOpEmi> {
std::string toString() const override;
TargetDataOpEmi(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)
: Endpoint(Endpoint), TargetTaskData(TargetTaskData),
TargetData(TargetData), HostOpId(HostOpId), OpType(OpType),
SrcAddr(SrcAddr), SrcDeviceNum(SrcDeviceNum), DstAddr(DstAddr),
DstDeviceNum(DstDeviceNum), Bytes(Bytes), CodeptrRA(CodeptrRA) {}
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;
};
struct TargetSubmit : public EventBase<TargetSubmit> {
std::string toString() const override;
TargetSubmit(ompt_id_t TargetId, ompt_id_t HostOpId,
unsigned int RequestedNumTeams)
: TargetId(TargetId), HostOpId(HostOpId),
RequestedNumTeams(RequestedNumTeams) {}
ompt_id_t TargetId;
ompt_id_t HostOpId;
unsigned int RequestedNumTeams;
};
struct TargetSubmitEmi : public EventBase<TargetSubmitEmi> {
std::string toString() const override;
TargetSubmitEmi(ompt_scope_endpoint_t Endpoint, ompt_data_t *TargetData,
ompt_id_t *HostOpId, unsigned int RequestedNumTeams)
: Endpoint(Endpoint), TargetData(TargetData), HostOpId(HostOpId),
RequestedNumTeams(RequestedNumTeams) {}
ompt_scope_endpoint_t Endpoint;
ompt_data_t *TargetData;
ompt_id_t *HostOpId;
unsigned int RequestedNumTeams;
};
struct ControlTool : public EventBase<ControlTool> {
ControlTool() = default;
};
struct DeviceInitialize : public EventBase<DeviceInitialize> {
std::string toString() const override;
DeviceInitialize(int DeviceNum, const char *Type, ompt_device_t *Device,
ompt_function_lookup_t LookupFn, const char *DocStr)
: DeviceNum(DeviceNum), Type(Type), Device(Device), LookupFn(LookupFn),
DocStr(DocStr) {}
int DeviceNum;
const char *Type;
ompt_device_t *Device;
ompt_function_lookup_t LookupFn;
const char *DocStr;
};
struct DeviceFinalize : public EventBase<DeviceFinalize> {
std::string toString() const override;
DeviceFinalize(int DeviceNum) : DeviceNum(DeviceNum) {}
int DeviceNum;
};
struct DeviceLoad : public EventBase<DeviceLoad> {
std::string toString() const override;
DeviceLoad(int DeviceNum, const char *Filename, int64_t OffsetInFile,
void *VmaInFile, size_t Bytes, void *HostAddr, void *DeviceAddr,
uint64_t ModuleId)
: DeviceNum(DeviceNum), Filename(Filename), OffsetInFile(OffsetInFile),
VmaInFile(VmaInFile), Bytes(Bytes), HostAddr(HostAddr),
DeviceAddr(DeviceAddr), ModuleId(ModuleId) {}
int DeviceNum;
const char *Filename;
int64_t OffsetInFile;
void *VmaInFile;
size_t Bytes;
void *HostAddr;
void *DeviceAddr;
uint64_t ModuleId;
};
struct DeviceUnload : public EventBase<DeviceUnload> {
DeviceUnload() = default;
};
struct BufferRequest : public EventBase<BufferRequest> {
std::string toString() const override;
BufferRequest(int DeviceNum, ompt_buffer_t **Buffer, size_t *Bytes)
: DeviceNum(DeviceNum), Buffer(Buffer), Bytes(Bytes) {}
int DeviceNum;
ompt_buffer_t **Buffer;
size_t *Bytes;
};
struct BufferComplete : public EventBase<BufferComplete> {
std::string toString() const override;
BufferComplete(int DeviceNum, ompt_buffer_t *Buffer, size_t Bytes,
ompt_buffer_cursor_t Begin, int BufferOwned)
: DeviceNum(DeviceNum), Buffer(Buffer), Bytes(Bytes), Begin(Begin),
BufferOwned(BufferOwned) {}
int DeviceNum;
ompt_buffer_t *Buffer;
size_t Bytes;
ompt_buffer_cursor_t Begin;
int BufferOwned;
};
struct BufferRecord : public EventBase<BufferRecord> {
std::string toString() const override;
BufferRecord(ompt_record_ompt_t *RecordPtr) : RecordPtr(RecordPtr) {
if (RecordPtr != nullptr)
Record = *RecordPtr;
else
memset(&Record, 0, sizeof(ompt_record_ompt_t));
}
ompt_record_ompt_t Record;
ompt_record_ompt_t *RecordPtr;
};
struct BufferRecordDeallocation : public EventBase<BufferRecordDeallocation> {
std::string toString() const override;
BufferRecordDeallocation(ompt_buffer_t *Buffer) : Buffer(Buffer) {}
ompt_buffer_t *Buffer;
};
// Add specialized event equality operators here.
// Note: Placement of these forward declarations is important as they need to
// take precedence over the following default equality operator definition.
bool operator==(const ParallelBegin &, const ParallelBegin &);
bool operator==(const Work &, const Work &);
bool operator==(const ImplicitTask &, const ImplicitTask &);
bool operator==(const SyncRegion &, const SyncRegion &);
bool operator==(const Target &, const Target &);
bool operator==(const TargetEmi &, const TargetEmi &);
bool operator==(const TargetDataOp &, const TargetDataOp &);
bool operator==(const TargetDataOpEmi &, const TargetDataOpEmi &);
bool operator==(const TargetSubmit &, const TargetSubmit &);
bool operator==(const TargetSubmitEmi &, const TargetSubmitEmi &);
bool operator==(const DeviceInitialize &, const DeviceInitialize &);
bool operator==(const DeviceFinalize &, const DeviceFinalize &);
bool operator==(const DeviceLoad &, const DeviceLoad &);
bool operator==(const BufferRequest &, const BufferRequest &);
bool operator==(const BufferComplete &, const BufferComplete &);
bool operator==(const BufferRecord &, const BufferRecord &);
/// Default (fallback) event equality operator definition.
template <typename Event> bool operator==(const Event &, const Event &) {
return true;
}
// clang-format off
event_type_trait(AssertionSyncPoint)
event_type_trait(AssertionSuspend)
event_type_trait(ThreadBegin)
event_type_trait(ThreadEnd)
event_type_trait(ParallelBegin)
event_type_trait(ParallelEnd)
event_type_trait(Work)
event_type_trait(Dispatch)
event_type_trait(TaskCreate)
event_type_trait(Dependences)
event_type_trait(TaskDependence)
event_type_trait(TaskSchedule)
event_type_trait(ImplicitTask)
event_type_trait(Masked)
event_type_trait(SyncRegion)
event_type_trait(MutexAcquire)
event_type_trait(Mutex)
event_type_trait(NestLock)
event_type_trait(Flush)
event_type_trait(Cancel)
event_type_trait(Target)
event_type_trait(TargetEmi)
event_type_trait(TargetDataOp)
event_type_trait(TargetDataOpEmi)
event_type_trait(TargetSubmit)
event_type_trait(TargetSubmitEmi)
event_type_trait(ControlTool)
event_type_trait(DeviceInitialize)
event_type_trait(DeviceFinalize)
event_type_trait(DeviceLoad)
event_type_trait(DeviceUnload)
event_type_trait(BufferRequest)
event_type_trait(BufferComplete)
event_type_trait(BufferRecord)
event_type_trait(BufferRecordDeallocation)
// clang-format on
} // namespace internal
} // namespace omptest
#endif