diff options
Diffstat (limited to 'openmp/tools/omptest/test/unittests/internal-event-tostring-test.cpp')
-rw-r--r-- | openmp/tools/omptest/test/unittests/internal-event-tostring-test.cpp | 530 |
1 files changed, 530 insertions, 0 deletions
diff --git a/openmp/tools/omptest/test/unittests/internal-event-tostring-test.cpp b/openmp/tools/omptest/test/unittests/internal-event-tostring-test.cpp new file mode 100644 index 0000000..fcd8956 --- /dev/null +++ b/openmp/tools/omptest/test/unittests/internal-event-tostring-test.cpp @@ -0,0 +1,530 @@ +#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)"); +} |