blob: 1ec33d574381fefe09d0b9b89b5c3cd67dda0edd [file] [log] [blame]
//===- 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<ompt_data_t *>::min()) ||
(Expected.ParallelData == Observed.ParallelData);
bool isSameTaskData =
(Expected.TaskData == std::numeric_limits<ompt_data_t *>::min()) ||
(Expected.TaskData == Observed.TaskData);
bool isSameCount = (Expected.Count == std::numeric_limits<uint64_t>::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<unsigned int>::min()) ||
(Expected.ActualParallelism == Observed.ActualParallelism);
bool isSameIndex =
(Expected.Index == std::numeric_limits<unsigned int>::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<ompt_data_t *>::min()) ||
(Expected.ParallelData == Observed.ParallelData);
bool isSameTaskData =
(Expected.TaskData == std::numeric_limits<ompt_data_t *>::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<int>::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<int>::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<size_t>::min()) ||
(Expected.Bytes == Observed.Bytes);
bool isSameSrcAddr =
(Expected.SrcAddr == std::numeric_limits<void *>::min()) ||
(Expected.SrcAddr == Observed.SrcAddr);
bool isSameDstAddr =
(Expected.DstAddr == std::numeric_limits<void *>::min()) ||
(Expected.DstAddr == Observed.DstAddr);
bool isSameSrcDeviceNum =
(Expected.SrcDeviceNum == std::numeric_limits<int>::min()) ||
(Expected.SrcDeviceNum == Observed.SrcDeviceNum);
bool isSameDstDeviceNum =
(Expected.DstDeviceNum == std::numeric_limits<int>::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<size_t>::min()) ||
(Expected.Bytes == Observed.Bytes);
bool isSameSrcAddr =
(Expected.SrcAddr == std::numeric_limits<void *>::min()) ||
(Expected.SrcAddr == Observed.SrcAddr);
bool isSameDstAddr =
(Expected.DstAddr == std::numeric_limits<void *>::min()) ||
(Expected.DstAddr == Observed.DstAddr);
bool isSameSrcDeviceNum =
(Expected.SrcDeviceNum == std::numeric_limits<int>::min()) ||
(Expected.SrcDeviceNum == Observed.SrcDeviceNum);
bool isSameDstDeviceNum =
(Expected.DstDeviceNum == std::numeric_limits<int>::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<const char *>::min()) ||
((Expected.Type == Observed.Type) ||
(strcmp(Expected.Type, Observed.Type) == 0));
bool isSameDevice =
(Expected.Device == std::numeric_limits<ompt_device_t *>::min()) ||
(Expected.Device == Observed.Device);
return isSameDeviceNum && isSameType && isSameDevice;
}
bool operator==(const DeviceFinalize &Expected,
const DeviceFinalize &Observed) {
bool isSameDeviceNum =
(Expected.DeviceNum == std::numeric_limits<int>::min()) ||
(Expected.DeviceNum == Observed.DeviceNum);
return isSameDeviceNum;
}
bool operator==(const DeviceLoad &Expected, const DeviceLoad &Observed) {
bool isSameDeviceNum =
(Expected.DeviceNum == std::numeric_limits<int>::min()) ||
(Expected.DeviceNum == Observed.DeviceNum);
bool isSameSize = (Expected.Bytes == std::numeric_limits<size_t>::min()) ||
(Expected.Bytes == Observed.Bytes);
return isSameDeviceNum && isSameSize;
}
bool operator==(const BufferRequest &Expected, const BufferRequest &Observed) {
bool isSameDeviceNum =
(Expected.DeviceNum == std::numeric_limits<int>::min()) ||
(Expected.DeviceNum == Observed.DeviceNum);
bool isSameSize = (Expected.Bytes == std::numeric_limits<size_t *>::min()) ||
(Expected.Bytes == Observed.Bytes);
return isSameDeviceNum && isSameSize;
}
bool operator==(const BufferComplete &Expected,
const BufferComplete &Observed) {
bool isSameDeviceNum =
(Expected.DeviceNum == std::numeric_limits<int>::min()) ||
(Expected.DeviceNum == Observed.DeviceNum);
bool isSameSize = (Expected.Bytes == std::numeric_limits<size_t>::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<ompt_id_t>::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<ompt_target_t>::min()) ||
(Expected.Record.record.target.kind ==
Observed.Record.record.target.kind);
isEqual &= (Expected.Record.record.target.endpoint ==
std::numeric_limits<ompt_scope_endpoint_t>::min()) ||
(Expected.Record.record.target.endpoint ==
Observed.Record.record.target.endpoint);
isEqual &= (Expected.Record.record.target.device_num ==
std::numeric_limits<int>::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<ompt_target_data_op_t>::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<size_t>::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<void *>::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<void *>::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<int>::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<int>::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<ompt_id_t>::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<void *>::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<ompt_device_time_t>::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<unsigned int>::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<unsigned int>::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<ompt_id_t>::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<ompt_device_time_t>::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