blob: fcd8956203c9d2560ebad279883cba0cf9abb754 [file]
#include "InternalEvent.h"
#include <omp-tools.h>
#include <sstream>
#include "gtest/gtest.h"
using namespace omptest;
TEST(InternalEvent_toString, AssertionSyncPoint) {
internal::AssertionSyncPoint SP{/*Name=*/"Test Sync Point"};
EXPECT_EQ(SP.toString(), "Assertion SyncPoint: 'Test Sync Point'");
}
TEST(InternalEvent_toString, ThreadBegin) {
internal::ThreadBegin TB{/*ThreadType=*/ompt_thread_t::ompt_thread_initial};
EXPECT_EQ(TB.toString(), "OMPT Callback ThreadBegin: ThreadType=1");
}
TEST(InternalEvent_toString, ThreadEnd) {
internal::ThreadEnd TE{};
EXPECT_EQ(TE.toString(), "OMPT Callback ThreadEnd");
}
TEST(InternalEvent_toString, ParallelBegin) {
internal::ParallelBegin PB{/*NumThreads=*/31};
EXPECT_EQ(PB.toString(), "OMPT Callback ParallelBegin: NumThreads=31");
}
TEST(InternalEvent_toString, ParallelEnd) {
internal::ParallelEnd PE{/*ParallelData=*/(ompt_data_t *)0x11,
/*EncounteringTaskData=*/(ompt_data_t *)0x22,
/*Flags=*/31,
/*CodeptrRA=*/(const void *)0x33};
EXPECT_EQ(PE.toString(), "OMPT Callback ParallelEnd");
}
TEST(InternalEvent_toString, Work) {
internal::Work WK{/*WorkType=*/ompt_work_t::ompt_work_loop_dynamic,
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_beginend,
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Count=*/31,
/*CodeptrRA=*/(const void *)0x33};
EXPECT_EQ(WK.toString(),
"OMPT Callback Work: work_type=11 endpoint=3 parallel_data=0x11 "
"task_data=0x22 count=31 codeptr=0x33");
}
TEST(InternalEvent_toString, Dispatch_iteration) {
ompt_data_t DI{.value = 31};
internal::Dispatch D{/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_iteration,
/*Instance=*/DI};
EXPECT_EQ(D.toString(), "OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=1 instance=[it=31]");
}
TEST(InternalEvent_toString, Dispatch_section) {
ompt_data_t DI{.ptr = (void *)0x33};
internal::Dispatch D{/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_section,
/*Instance=*/DI};
EXPECT_EQ(D.toString(), "OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=2 instance=[ptr=0x33]");
}
TEST(InternalEvent_toString, Dispatch_chunks) {
ompt_dispatch_chunk_t DC{.start = 7, .iterations = 31};
ompt_data_t DI{.ptr = (void *)&DC};
internal::Dispatch DLoop{
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_ws_loop_chunk,
/*Instance=*/DI};
internal::Dispatch DTask{
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_taskloop_chunk,
/*Instance=*/DI};
internal::Dispatch DDist{
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_distribute_chunk,
/*Instance=*/DI};
ompt_data_t DINull{.ptr = nullptr};
internal::Dispatch DDistNull{
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*Kind=*/ompt_dispatch_t::ompt_dispatch_distribute_chunk,
/*Instance=*/DINull};
EXPECT_EQ(DLoop.toString(),
"OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=3 instance=[chunk=(start=7, iterations=31)]");
EXPECT_EQ(DTask.toString(),
"OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=4 instance=[chunk=(start=7, iterations=31)]");
EXPECT_EQ(DDist.toString(),
"OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=5 instance=[chunk=(start=7, iterations=31)]");
EXPECT_EQ(DDistNull.toString(), "OMPT Callback Dispatch: parallel_data=0x11 "
"task_data=0x22 kind=5");
}
TEST(InternalEvent_toString, TaskCreate) {
internal::TaskCreate TC{/*EncounteringTaskData=*/(ompt_data_t *)0x11,
/*EncounteringTaskFrame=*/(const ompt_frame_t *)0x22,
/*NewTaskData=*/(ompt_data_t *)0x33,
/*Flags=*/7,
/*HasDependences=*/31,
/*CodeptrRA=*/(const void *)0x44};
EXPECT_EQ(TC.toString(),
"OMPT Callback TaskCreate: encountering_task_data=0x11 "
"encountering_task_frame=0x22 new_task_data=0x33 flags=7 "
"has_dependences=31 codeptr=0x44");
}
TEST(InternalEvent_toString, ImplicitTask) {
internal::ImplicitTask IT{
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*ActualParallelism=*/7,
/*Index=*/31,
/*Flags=*/127};
EXPECT_EQ(IT.toString(),
"OMPT Callback ImplicitTask: endpoint=1 parallel_data=0x11 "
"task_data=0x22 actual_parallelism=7 index=31 flags=127");
}
TEST(InternalEvent_toString, SyncRegion) {
internal::SyncRegion SR{
/*Kind=*/ompt_sync_region_t::ompt_sync_region_taskwait,
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_end,
/*ParallelData=*/(ompt_data_t *)0x11,
/*TaskData=*/(ompt_data_t *)0x22,
/*CodeptrRA=*/(const void *)0x33};
EXPECT_EQ(SR.toString(), "OMPT Callback SyncRegion: kind=5 endpoint=2 "
"parallel_data=0x11 task_data=0x22 codeptr=0x33");
}
TEST(InternalEvent_toString, Target) {
internal::Target T{/*Kind=*/ompt_target_t::ompt_target_enter_data_nowait,
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_end,
/*DeviceNum=*/7,
/*TaskData=*/(ompt_data_t *)0x11,
/*TargetId=*/(ompt_id_t)31,
/*CodeptrRA=*/(const void *)0x22};
EXPECT_EQ(T.toString(), "Callback Target: target_id=31 kind=10 "
"endpoint=2 device_num=7 code=0x22");
}
TEST(InternalEvent_toString, TargetEmi) {
ompt_data_t TaskData{.value = 31};
ompt_data_t TargetTaskData{.value = 127};
ompt_data_t TargetData{.value = 8191};
internal::TargetEmi T{/*Kind=*/ompt_target_t::ompt_target_update,
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*DeviceNum=*/7,
/*TaskData=*/(ompt_data_t *)&TaskData,
/*TargetTaskData=*/(ompt_data_t *)&TargetTaskData,
/*TargetData=*/(ompt_data_t *)&TargetData,
/*CodeptrRA=*/(const void *)0x11};
internal::TargetEmi TDataNull{
/*Kind=*/ompt_target_t::ompt_target_update,
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*DeviceNum=*/7,
/*TaskData=*/(ompt_data_t *)&TaskData,
/*TargetTaskData=*/(ompt_data_t *)nullptr,
/*TargetData=*/(ompt_data_t *)&TargetData,
/*CodeptrRA=*/(const void *)0x11};
std::ostringstream StreamT1;
std::ostringstream StreamT2;
std::string CallBackPrefix{
"Callback Target EMI: kind=4 endpoint=1 device_num=7"};
StreamT1 << CallBackPrefix << std::showbase << std::hex;
StreamT1 << " task_data=" << &TaskData << " (0x1f)";
StreamT1 << " target_task_data=" << &TargetTaskData << " (0x7f)";
StreamT1 << " target_data=" << &TargetData << " (0x1fff)";
StreamT1 << " code=0x11";
StreamT2 << CallBackPrefix << std::showbase << std::hex;
StreamT2 << " task_data=" << &TaskData << " (0x1f)";
StreamT2 << " target_task_data=(nil) (0x0)";
StreamT2 << " target_data=" << &TargetData << " (0x1fff)";
StreamT2 << " code=0x11";
EXPECT_EQ(T.toString(), StreamT1.str());
EXPECT_EQ(TDataNull.toString(), StreamT2.str());
}
TEST(InternalEvent_toString, TargetDataOp) {
internal::TargetDataOp TDO{
/*TargetId=*/7,
/*HostOpId=*/31,
/*OpType=*/ompt_target_data_op_t::ompt_target_data_associate,
/*SrcAddr=*/(void *)0x11,
/*SrcDeviceNum=*/127,
/*DstAddr=*/(void *)0x22,
/*DstDeviceNum=*/8191,
/*Bytes=*/4096,
/*CodeptrRA=*/(const void *)0x33};
EXPECT_EQ(
TDO.toString(),
" Callback DataOp: target_id=7 host_op_id=31 optype=5 src=0x11 "
"src_device_num=127 dest=0x22 dest_device_num=8191 bytes=4096 code=0x33");
}
TEST(InternalEvent_toString, TargetDataOpEmi) {
ompt_data_t TargetTaskData{.value = 31};
ompt_data_t TargetData{.value = 127};
ompt_id_t HostOpId = 8191;
internal::TargetDataOpEmi TDO{
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*TargetTaskData=*/(ompt_data_t *)&TargetTaskData,
/*TargetData=*/(ompt_data_t *)&TargetData,
/*HostOpId=*/(ompt_id_t *)&HostOpId,
/*OpType=*/ompt_target_data_op_t::ompt_target_data_disassociate,
/*SrcAddr=*/(void *)0x11,
/*SrcDeviceNum=*/1,
/*DstAddr=*/(void *)0x22,
/*DstDeviceNum=*/2,
/*Bytes=*/4096,
/*CodeptrRA=*/(const void *)0x33};
// Set HostOpId=nullptr
internal::TargetDataOpEmi TDO_HostOpIdNull{
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*TargetTaskData=*/(ompt_data_t *)&TargetTaskData,
/*TargetData=*/(ompt_data_t *)&TargetData,
/*HostOpId=*/(ompt_id_t *)nullptr,
/*OpType=*/ompt_target_data_op_t::ompt_target_data_disassociate,
/*SrcAddr=*/(void *)0x11,
/*SrcDeviceNum=*/1,
/*DstAddr=*/(void *)0x22,
/*DstDeviceNum=*/2,
/*Bytes=*/4096,
/*CodeptrRA=*/(const void *)0x33};
std::ostringstream StreamTDO1;
std::ostringstream StreamTDO2;
std::string CallBackPrefix{" Callback DataOp EMI: endpoint=1 optype=6"};
std::string CallBackSuffix{
" src=0x11 src_device_num=1 dest=0x22 dest_device_num=2 "
"bytes=4096 code=0x33"};
StreamTDO1 << CallBackPrefix << std::showbase << std::hex;
StreamTDO1 << " target_task_data=" << &TargetTaskData << " (0x1f)";
StreamTDO1 << " target_data=" << &TargetData << " (0x7f)";
StreamTDO1 << " host_op_id=" << &HostOpId << " (0x1fff)";
StreamTDO1 << CallBackSuffix;
StreamTDO2 << CallBackPrefix << std::showbase << std::hex;
StreamTDO2 << " target_task_data=" << &TargetTaskData << " (0x1f)";
StreamTDO2 << " target_data=" << &TargetData << " (0x7f)";
StreamTDO2 << " host_op_id=(nil) (0x0)";
StreamTDO2 << CallBackSuffix;
EXPECT_EQ(TDO.toString(), StreamTDO1.str());
EXPECT_EQ(TDO_HostOpIdNull.toString(), StreamTDO2.str());
}
TEST(InternalEvent_toString, TargetSubmit) {
internal::TargetSubmit TS{/*TargetId=*/7,
/*HostOpId=*/31,
/*RequestedNumTeams=*/127};
EXPECT_EQ(TS.toString(),
" Callback Submit: target_id=7 host_op_id=31 req_num_teams=127");
}
TEST(InternalEvent_toString, TargetSubmitEmi) {
ompt_data_t TargetData{.value = 127};
ompt_id_t HostOpId = 8191;
internal::TargetSubmitEmi TS{
/*Endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*TargetData=*/(ompt_data_t *)&TargetData,
/*HostOpId=*/(ompt_id_t *)&HostOpId,
/*RequestedNumTeams=*/7};
std::ostringstream StreamTS;
std::string CallBackPrefix{
" Callback Submit EMI: endpoint=1 req_num_teams=7"};
StreamTS << CallBackPrefix << std::showbase << std::hex;
StreamTS << " target_data=" << &TargetData << " (0x7f)";
StreamTS << " host_op_id=" << &HostOpId << " (0x1fff)";
EXPECT_EQ(TS.toString(), StreamTS.str());
}
TEST(InternalEvent_toString, DeviceInitialize) {
const char *Type = "DeviceType";
const char *DocStr = "DocumentationString";
internal::DeviceInitialize DI{/*DeviceNum=*/7,
/*Type=*/Type,
/*Device=*/(ompt_device_t *)0x11,
/*LookupFn=*/(ompt_function_lookup_t)0x22,
/*DocStr=*/DocStr};
internal::DeviceInitialize DINull{/*DeviceNum=*/0,
/*Type=*/nullptr,
/*Device=*/nullptr,
/*LookupFn=*/(ompt_function_lookup_t)0x0,
/*DocStr=*/nullptr};
std::ostringstream StreamDI;
std::string CallBackPrefix{"Callback Init: device_num=7 type=DeviceType "
"device=0x11 lookup=0x22 doc="};
StreamDI << CallBackPrefix << std::showbase << std::hex;
StreamDI << (uint64_t)DocStr;
EXPECT_EQ(DI.toString(), StreamDI.str());
// TODO This looks inconsistent: (null) vs. (nil)
EXPECT_EQ(DINull.toString(), "Callback Init: device_num=0 type=(null) "
"device=(nil) lookup=(nil) doc=(nil)");
}
TEST(InternalEvent_toString, DeviceFinalize) {
internal::DeviceFinalize DF{/*DeviceNum=*/7};
EXPECT_EQ(DF.toString(), "Callback Fini: device_num=7");
}
TEST(InternalEvent_toString, DeviceLoad) {
const char *Filename = "FilenameToLoad";
internal::DeviceLoad DL{/*DeviceNum=*/7,
/*Filename=*/Filename,
/*OffsetInFile=*/31,
/*VmaInFile=*/(void *)0x11,
/*Bytes=*/127,
/*HostAddr=*/(void *)0x22,
/*DeviceAddr=*/(void *)0x33,
/*ModuleId=*/8191};
internal::DeviceLoad DLNull{/*DeviceNum=*/0,
/*Filename=*/nullptr,
/*OffsetInFile=*/0,
/*VmaInFile=*/nullptr,
/*Bytes=*/0,
/*HostAddr=*/nullptr,
/*DeviceAddr=*/nullptr,
/*ModuleId=*/0};
EXPECT_EQ(
DL.toString(),
"Callback Load: device_num:7 module_id:8191 "
"filename:FilenameToLoad host_addr:0x22 device_addr:0x33 bytes:127");
// TODO This looks inconsistent: (null) vs. (nil) and ':' instead of '='
EXPECT_EQ(DLNull.toString(),
"Callback Load: device_num:0 module_id:0 filename:(null) "
"host_addr:(nil) device_addr:(nil) bytes:0");
}
TEST(InternalEvent_toString, BufferRequest) {
size_t Bytes = 7;
ompt_buffer_t *Buffer = (void *)0x11;
internal::BufferRequest BR{/*DeviceNum=*/31,
/*Buffer=*/&Buffer,
/*Bytes=*/&Bytes};
internal::BufferRequest BRNull{/*DeviceNum=*/127,
/*Buffer=*/nullptr,
/*Bytes=*/nullptr};
EXPECT_EQ(BR.toString(),
"Allocated 7 bytes at 0x11 in buffer request callback");
EXPECT_EQ(BRNull.toString(),
"Allocated 0 bytes at (nil) in buffer request callback");
}
TEST(InternalEvent_toString, BufferComplete) {
ompt_buffer_t *Buffer = (void *)0x11;
internal::BufferComplete BC{/*DeviceNum=*/7,
/*Buffer=*/Buffer,
/*Bytes=*/127,
/*Begin=*/8191,
/*BufferOwned=*/1};
internal::BufferComplete BCNull{/*DeviceNum=*/0,
/*Buffer=*/nullptr,
/*Bytes=*/0,
/*Begin=*/0,
/*BufferOwned=*/0};
EXPECT_EQ(BC.toString(),
"Executing buffer complete callback: 7 0x11 127 0x1fff 1");
EXPECT_EQ(BCNull.toString(),
"Executing buffer complete callback: 0 (nil) 0 (nil) 0");
}
TEST(InternalEvent_toString, BufferRecordInvalid) {
ompt_record_ompt_t InvalidRecord{
/*type=*/ompt_callbacks_t::ompt_callback_parallel_begin,
/*time=*/7,
/*thread_id=*/31,
/*target_id=*/127,
/*record=*/{.parallel_begin = {}}};
internal::BufferRecord BRNull{/*RecordPtr=*/nullptr};
internal::BufferRecord BRInvalid{/*RecordPtr=*/&InvalidRecord};
std::ostringstream StreamBRInvalid;
StreamBRInvalid << "rec=" << std::showbase << std::hex << &InvalidRecord;
StreamBRInvalid << " type=3 (unsupported record type)";
EXPECT_EQ(BRNull.toString(), "rec=(nil) type=0 (unsupported record type)");
EXPECT_EQ(BRInvalid.toString(), StreamBRInvalid.str());
}
TEST(InternalEvent_toString, BufferRecordTarget) {
ompt_record_target_t SubRecordTarget{
/*kind=*/ompt_target_t::ompt_target_update,
/*endpoint=*/ompt_scope_endpoint_t::ompt_scope_begin,
/*device_num=*/2,
/*task_id=*/127,
/*target_id=*/31,
/*codeptr_ra=*/(const void *)0x11};
ompt_record_ompt_t TargetRecord{
/*type=*/ompt_callbacks_t::ompt_callback_target,
/*time=*/7,
/*thread_id=*/29,
/*target_id=*/31,
/*record*/ {.target = SubRecordTarget}};
internal::BufferRecord BR{/*RecordPtr=*/&TargetRecord};
std::ostringstream StreamBR;
StreamBR << "rec=" << std::showbase << std::hex << &TargetRecord;
StreamBR << " type=8 (Target task) time=7 thread_id=29 target_id=31 kind=4";
StreamBR << " endpoint=1 device=2 task_id=127 codeptr=0x11";
EXPECT_EQ(BR.toString(), StreamBR.str());
}
TEST(InternalEvent_toString, BufferRecordDataOp) {
ompt_record_target_data_op_t SubRecordTargetDataOp{
/*host_op_id=*/7,
/*optype=*/ompt_target_data_op_t::ompt_target_data_alloc_async,
/*src_addr=*/(void *)0x11,
/*src_device_num=*/1,
/*dest_addr=*/(void *)0x22,
/*dest_device_num=*/2,
/*bytes=*/127,
/*end_time=*/128,
/*codeptr_ra=*/(const void *)0x33,
};
ompt_record_ompt_t DataOpRecord{
/*type=*/ompt_callbacks_t::ompt_callback_target_data_op_emi,
/*time=*/8,
/*thread_id=*/3,
/*target_id=*/5,
/*record=*/{.target_data_op = SubRecordTargetDataOp}};
internal::BufferRecord BR{/*RecordPtr=*/&DataOpRecord};
std::ostringstream StreamBR;
StreamBR << "rec=" << std::showbase << std::hex << &DataOpRecord;
StreamBR << " type=34 (Target data op) time=8 thread_id=3 target_id=5";
StreamBR << " host_op_id=7 optype=17 src_addr=0x11 src_device=1";
StreamBR << " dest_addr=0x22 dest_device=2 bytes=127 end_time=128";
StreamBR << " duration=120 ns codeptr=0x33";
EXPECT_EQ(BR.toString(), StreamBR.str());
}
TEST(InternalEvent_toString, BufferRecordKernel) {
ompt_record_target_kernel_t SubRecordTargetKernel{
/*host_op_id=*/11,
/*requested_num_teams=*/127,
/*granted_num_teams=*/63,
/*end_time=*/8191,
};
ompt_record_ompt_t KernelRecord{
/*type=*/ompt_callbacks_t::ompt_callback_target_submit_emi,
/*time=*/9,
/*thread_id=*/19,
/*target_id=*/33,
/*record=*/{.target_kernel = SubRecordTargetKernel}};
internal::BufferRecord BR{/*RecordPtr=*/&KernelRecord};
std::ostringstream StreamBR;
StreamBR << "rec=" << std::showbase << std::hex << &KernelRecord;
StreamBR << " type=35 (Target kernel) time=9 thread_id=19 target_id=33";
StreamBR << " host_op_id=11 requested_num_teams=127 granted_num_teams=63";
StreamBR << " end_time=8191 duration=8182 ns";
EXPECT_EQ(BR.toString(), StreamBR.str());
}
TEST(InternalEvent_toString, BufferRecordDeallocation) {
internal::BufferRecordDeallocation BRD{/*Buffer=*/(ompt_record_ompt_t *)0x11};
internal::BufferRecordDeallocation BRDNull{/*Buffer=*/nullptr};
EXPECT_EQ(BRD.toString(), "Deallocated 0x11");
EXPECT_EQ(BRDNull.toString(), "Deallocated (nil)");
}