//===- InternalEventOperators.cpp - Operator implementations ----*- 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 /// Defines the internal event operators, like comparators. /// //===----------------------------------------------------------------------===// #include "InternalEvent.h" namespace omptest { namespace internal { bool operator==(const ParallelBegin &Expected, const ParallelBegin &Observed) { return Expected.NumThreads == Observed.NumThreads; } bool operator==(const Work &Expected, const Work &Observed) { bool isSameWorkType = (Expected.WorkType == Observed.WorkType); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameParallelData = (Expected.ParallelData == std::numeric_limits::min()) || (Expected.ParallelData == Observed.ParallelData); bool isSameTaskData = (Expected.TaskData == std::numeric_limits::min()) || (Expected.TaskData == Observed.TaskData); bool isSameCount = (Expected.Count == std::numeric_limits::min()) || (Expected.Count == Observed.Count); return isSameWorkType && isSameEndpoint && isSameParallelData && isSameTaskData && isSameCount; } bool operator==(const ImplicitTask &Expected, const ImplicitTask &Observed) { bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameActualParallelism = (Expected.ActualParallelism == std::numeric_limits::min()) || (Expected.ActualParallelism == Observed.ActualParallelism); bool isSameIndex = (Expected.Index == std::numeric_limits::min()) || (Expected.Index == Observed.Index); return isSameEndpoint && isSameActualParallelism && isSameIndex; } bool operator==(const SyncRegion &Expected, const SyncRegion &Observed) { bool isSameKind = (Expected.Kind == Observed.Kind); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameParallelData = (Expected.ParallelData == std::numeric_limits::min()) || (Expected.ParallelData == Observed.ParallelData); bool isSameTaskData = (Expected.TaskData == std::numeric_limits::min()) || (Expected.TaskData == Observed.TaskData); return isSameKind && isSameEndpoint && isSameParallelData && isSameTaskData; } bool operator==(const Target &Expected, const Target &Observed) { bool isSameKind = (Expected.Kind == Observed.Kind); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); return isSameKind && isSameEndpoint && isSameDeviceNum; } bool operator==(const TargetEmi &Expected, const TargetEmi &Observed) { bool isSameKind = (Expected.Kind == Observed.Kind); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); return isSameKind && isSameEndpoint && isSameDeviceNum; } bool operator==(const TargetDataOp &Expected, const TargetDataOp &Observed) { bool isSameOpType = (Expected.OpType == Observed.OpType); bool isSameSize = (Expected.Bytes == std::numeric_limits::min()) || (Expected.Bytes == Observed.Bytes); bool isSameSrcAddr = (Expected.SrcAddr == std::numeric_limits::min()) || (Expected.SrcAddr == Observed.SrcAddr); bool isSameDstAddr = (Expected.DstAddr == std::numeric_limits::min()) || (Expected.DstAddr == Observed.DstAddr); bool isSameSrcDeviceNum = (Expected.SrcDeviceNum == std::numeric_limits::min()) || (Expected.SrcDeviceNum == Observed.SrcDeviceNum); bool isSameDstDeviceNum = (Expected.DstDeviceNum == std::numeric_limits::min()) || (Expected.DstDeviceNum == Observed.DstDeviceNum); return isSameOpType && isSameSize && isSameSrcAddr && isSameDstAddr && isSameSrcDeviceNum && isSameDstDeviceNum; } bool operator==(const TargetDataOpEmi &Expected, const TargetDataOpEmi &Observed) { bool isSameOpType = (Expected.OpType == Observed.OpType); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); bool isSameSize = (Expected.Bytes == std::numeric_limits::min()) || (Expected.Bytes == Observed.Bytes); bool isSameSrcAddr = (Expected.SrcAddr == std::numeric_limits::min()) || (Expected.SrcAddr == Observed.SrcAddr); bool isSameDstAddr = (Expected.DstAddr == std::numeric_limits::min()) || (Expected.DstAddr == Observed.DstAddr); bool isSameSrcDeviceNum = (Expected.SrcDeviceNum == std::numeric_limits::min()) || (Expected.SrcDeviceNum == Observed.SrcDeviceNum); bool isSameDstDeviceNum = (Expected.DstDeviceNum == std::numeric_limits::min()) || (Expected.DstDeviceNum == Observed.DstDeviceNum); return isSameOpType && isSameEndpoint && isSameSize && isSameSrcAddr && isSameDstAddr && isSameSrcDeviceNum && isSameDstDeviceNum; } bool operator==(const TargetSubmit &Expected, const TargetSubmit &Observed) { bool isSameReqNumTeams = (Expected.RequestedNumTeams == Observed.RequestedNumTeams); return isSameReqNumTeams; } bool operator==(const TargetSubmitEmi &Expected, const TargetSubmitEmi &Observed) { bool isSameReqNumTeams = (Expected.RequestedNumTeams == Observed.RequestedNumTeams); bool isSameEndpoint = (Expected.Endpoint == Observed.Endpoint); return isSameReqNumTeams && isSameEndpoint; } bool operator==(const DeviceInitialize &Expected, const DeviceInitialize &Observed) { bool isSameDeviceNum = (Expected.DeviceNum == Observed.DeviceNum); bool isSameType = (Expected.Type == std::numeric_limits::min()) || ((Expected.Type == Observed.Type) || (strcmp(Expected.Type, Observed.Type) == 0)); bool isSameDevice = (Expected.Device == std::numeric_limits::min()) || (Expected.Device == Observed.Device); return isSameDeviceNum && isSameType && isSameDevice; } bool operator==(const DeviceFinalize &Expected, const DeviceFinalize &Observed) { bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); return isSameDeviceNum; } bool operator==(const DeviceLoad &Expected, const DeviceLoad &Observed) { bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); bool isSameSize = (Expected.Bytes == std::numeric_limits::min()) || (Expected.Bytes == Observed.Bytes); return isSameDeviceNum && isSameSize; } bool operator==(const BufferRequest &Expected, const BufferRequest &Observed) { bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); bool isSameSize = (Expected.Bytes == std::numeric_limits::min()) || (Expected.Bytes == Observed.Bytes); return isSameDeviceNum && isSameSize; } bool operator==(const BufferComplete &Expected, const BufferComplete &Observed) { bool isSameDeviceNum = (Expected.DeviceNum == std::numeric_limits::min()) || (Expected.DeviceNum == Observed.DeviceNum); bool isSameSize = (Expected.Bytes == std::numeric_limits::min()) || (Expected.Bytes == Observed.Bytes); return isSameDeviceNum && isSameSize; } bool operator==(const BufferRecord &Expected, const BufferRecord &Observed) { bool isSameType = (Expected.Record.type == Observed.Record.type); bool isSameTargetId = (Expected.Record.target_id == std::numeric_limits::min()) || (Expected.Record.target_id == Observed.Record.target_id); if (!(isSameType && isSameTargetId)) return false; bool isEqual = true; ompt_device_time_t ObservedDurationNs = Observed.Record.record.target_data_op.end_time - Observed.Record.time; switch (Expected.Record.type) { case ompt_callback_target: isEqual &= (Expected.Record.record.target.kind == std::numeric_limits::min()) || (Expected.Record.record.target.kind == Observed.Record.record.target.kind); isEqual &= (Expected.Record.record.target.endpoint == std::numeric_limits::min()) || (Expected.Record.record.target.endpoint == Observed.Record.record.target.endpoint); isEqual &= (Expected.Record.record.target.device_num == std::numeric_limits::min()) || (Expected.Record.record.target.device_num == Observed.Record.record.target.device_num); break; case ompt_callback_target_data_op: isEqual &= (Expected.Record.record.target_data_op.optype == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.optype == Observed.Record.record.target_data_op.optype); isEqual &= (Expected.Record.record.target_data_op.bytes == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.bytes == Observed.Record.record.target_data_op.bytes); isEqual &= (Expected.Record.record.target_data_op.src_addr == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.src_addr == Observed.Record.record.target_data_op.src_addr); isEqual &= (Expected.Record.record.target_data_op.dest_addr == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.dest_addr == Observed.Record.record.target_data_op.dest_addr); isEqual &= (Expected.Record.record.target_data_op.src_device_num == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.src_device_num == Observed.Record.record.target_data_op.src_device_num); isEqual &= (Expected.Record.record.target_data_op.dest_device_num == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.dest_device_num == Observed.Record.record.target_data_op.dest_device_num); isEqual &= (Expected.Record.record.target_data_op.host_op_id == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.host_op_id == Observed.Record.record.target_data_op.host_op_id); isEqual &= (Expected.Record.record.target_data_op.codeptr_ra == std::numeric_limits::min()) || (Expected.Record.record.target_data_op.codeptr_ra == Observed.Record.record.target_data_op.codeptr_ra); if (Expected.Record.record.target_data_op.end_time != std::numeric_limits::min()) { isEqual &= ObservedDurationNs <= Expected.Record.record.target_data_op.end_time; } isEqual &= ObservedDurationNs >= Expected.Record.time; break; case ompt_callback_target_submit: ObservedDurationNs = Observed.Record.record.target_kernel.end_time - Observed.Record.time; isEqual &= (Expected.Record.record.target_kernel.requested_num_teams == std::numeric_limits::min()) || (Expected.Record.record.target_kernel.requested_num_teams == Observed.Record.record.target_kernel.requested_num_teams); isEqual &= (Expected.Record.record.target_kernel.granted_num_teams == std::numeric_limits::min()) || (Expected.Record.record.target_kernel.granted_num_teams == Observed.Record.record.target_kernel.granted_num_teams); isEqual &= (Expected.Record.record.target_kernel.host_op_id == std::numeric_limits::min()) || (Expected.Record.record.target_kernel.host_op_id == Observed.Record.record.target_kernel.host_op_id); if (Expected.Record.record.target_kernel.end_time != std::numeric_limits::min()) { isEqual &= ObservedDurationNs <= Expected.Record.record.target_kernel.end_time; } isEqual &= ObservedDurationNs >= Expected.Record.time; break; default: assert(false && "Encountered invalid record type"); } return isEqual; } } // namespace internal } // namespace omptest