368 lines · cpp
1//===- InternalEvent.cpp - Internal event implementation --------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Implements internal event representation methods and helper functions.11///12//===----------------------------------------------------------------------===//13 14#include "InternalEvent.h"15 16#include <iomanip>17#include <sstream>18 19using namespace omptest;20using namespace util;21 22std::string util::makeHexString(uint64_t Data, bool IsPointer, size_t MinBytes,23 bool ShowHexBase) {24 if (Data == 0 && IsPointer)25 return "(nil)";26 27 thread_local std::ostringstream os;28 // Clear the content of the stream29 os.str(std::string());30 31 // Manually prefixing "0x" will make the use of std::setfill more easy32 if (ShowHexBase)33 os << "0x";34 35 // Default to 32bit (8 hex digits) width, if exceeding 64bit or zero value36 size_t NumDigits = (MinBytes > 0 && MinBytes < 9) ? (MinBytes << 1) : 8;37 38 if (MinBytes > 0)39 os << std::setfill('0') << std::setw(NumDigits);40 41 os << std::hex << Data;42 return os.str();43}44 45std::string internal::AssertionSyncPoint::toString() const {46 std::string S{"Assertion SyncPoint: '"};47 S.append(Name).append(1, '\'');48 return S;49}50 51std::string internal::ThreadBegin::toString() const {52 std::string S{"OMPT Callback ThreadBegin: "};53 S.append("ThreadType=").append(std::to_string(ThreadType));54 return S;55}56 57std::string internal::ThreadEnd::toString() const {58 std::string S{"OMPT Callback ThreadEnd"};59 return S;60}61 62std::string internal::ParallelBegin::toString() const {63 std::string S{"OMPT Callback ParallelBegin: "};64 S.append("NumThreads=").append(std::to_string(NumThreads));65 return S;66}67 68std::string internal::ParallelEnd::toString() const {69 // TODO: Should we expose more detailed info here?70 std::string S{"OMPT Callback ParallelEnd"};71 return S;72}73 74std::string internal::Work::toString() const {75 std::string S{"OMPT Callback Work: "};76 S.append("work_type=").append(std::to_string(WorkType));77 S.append(" endpoint=").append(std::to_string(Endpoint));78 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));79 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));80 S.append(" count=").append(std::to_string(Count));81 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));82 return S;83}84 85std::string internal::Dispatch::toString() const {86 std::string S{"OMPT Callback Dispatch: "};87 S.append("parallel_data=").append(makeHexString((uint64_t)ParallelData));88 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));89 S.append(" kind=").append(std::to_string(Kind));90 // TODO Check what to print for instance in all different cases91 if (Kind == ompt_dispatch_iteration) {92 S.append(" instance=[it=")93 .append(std::to_string(Instance.value))94 .append(1, ']');95 } else if (Kind == ompt_dispatch_section) {96 S.append(" instance=[ptr=")97 .append(makeHexString((uint64_t)Instance.ptr))98 .append(1, ']');99 } else if ((Kind == ompt_dispatch_ws_loop_chunk ||100 Kind == ompt_dispatch_taskloop_chunk ||101 Kind == ompt_dispatch_distribute_chunk) &&102 Instance.ptr != nullptr) {103 auto Chunk = static_cast<ompt_dispatch_chunk_t *>(Instance.ptr);104 S.append(" instance=[chunk=(start=")105 .append(std::to_string(Chunk->start))106 .append(", iterations=")107 .append(std::to_string(Chunk->iterations))108 .append(")]");109 }110 return S;111}112 113std::string internal::TaskCreate::toString() const {114 std::string S{"OMPT Callback TaskCreate: "};115 S.append("encountering_task_data=")116 .append(makeHexString((uint64_t)EncounteringTaskData));117 S.append(" encountering_task_frame=")118 .append(makeHexString((uint64_t)EncounteringTaskFrame));119 S.append(" new_task_data=").append(makeHexString((uint64_t)NewTaskData));120 S.append(" flags=").append(std::to_string(Flags));121 S.append(" has_dependences=").append(std::to_string(HasDependences));122 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));123 return S;124}125 126std::string internal::ImplicitTask::toString() const {127 std::string S{"OMPT Callback ImplicitTask: "};128 S.append("endpoint=").append(std::to_string(Endpoint));129 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));130 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));131 S.append(" actual_parallelism=").append(std::to_string(ActualParallelism));132 S.append(" index=").append(std::to_string(Index));133 S.append(" flags=").append(std::to_string(Flags));134 return S;135}136 137std::string internal::SyncRegion::toString() const {138 std::string S{"OMPT Callback SyncRegion: "};139 S.append("kind=").append(std::to_string(Kind));140 S.append(" endpoint=").append(std::to_string(Endpoint));141 S.append(" parallel_data=").append(makeHexString((uint64_t)ParallelData));142 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));143 S.append(" codeptr=").append(makeHexString((uint64_t)CodeptrRA));144 return S;145}146 147std::string internal::Target::toString() const {148 // TODO Should we canonicalize the string prefix (use "OMPT ..." everywhere)?149 std::string S{"Callback Target: target_id="};150 S.append(std::to_string(TargetId));151 S.append(" kind=").append(std::to_string(Kind));152 S.append(" endpoint=").append(std::to_string(Endpoint));153 S.append(" device_num=").append(std::to_string(DeviceNum));154 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));155 return S;156}157 158std::string internal::TargetEmi::toString() const {159 // TODO Should we canonicalize the string prefix (use "OMPT ..." everywhere)?160 std::string S{"Callback Target EMI: kind="};161 S.append(std::to_string(Kind));162 S.append(" endpoint=").append(std::to_string(Endpoint));163 S.append(" device_num=").append(std::to_string(DeviceNum));164 S.append(" task_data=").append(makeHexString((uint64_t)TaskData));165 S.append(" (")166 .append(makeHexString((uint64_t)(TaskData) ? TaskData->value : 0,167 /*IsPointer=*/false))168 .append(1, ')');169 S.append(" target_task_data=")170 .append(makeHexString((uint64_t)TargetTaskData));171 S.append(" (")172 .append(173 makeHexString((uint64_t)(TargetTaskData) ? TargetTaskData->value : 0,174 /*IsPointer=*/false))175 .append(1, ')');176 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));177 S.append(" (")178 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,179 /*IsPointer=*/false))180 .append(1, ')');181 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));182 return S;183}184 185std::string internal::TargetDataOp::toString() const {186 std::string S{" Callback DataOp: target_id="};187 S.append(std::to_string(TargetId));188 S.append(" host_op_id=").append(std::to_string(HostOpId));189 S.append(" optype=").append(std::to_string(OpType));190 S.append(" src=").append(makeHexString((uint64_t)SrcAddr));191 S.append(" src_device_num=").append(std::to_string(SrcDeviceNum));192 S.append(" dest=").append(makeHexString((uint64_t)DstAddr));193 S.append(" dest_device_num=").append(std::to_string(DstDeviceNum));194 S.append(" bytes=").append(std::to_string(Bytes));195 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));196 return S;197}198 199std::string internal::TargetDataOpEmi::toString() const {200 std::string S{" Callback DataOp EMI: endpoint="};201 S.append(std::to_string(Endpoint));202 S.append(" optype=").append(std::to_string(OpType));203 S.append(" target_task_data=")204 .append(makeHexString((uint64_t)TargetTaskData));205 S.append(" (")206 .append(207 makeHexString((uint64_t)(TargetTaskData) ? TargetTaskData->value : 0,208 /*IsPointer=*/false))209 .append(1, ')');210 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));211 S.append(" (")212 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,213 /*IsPointer=*/false))214 .append(1, ')');215 S.append(" host_op_id=").append(makeHexString((uint64_t)HostOpId));216 S.append(" (")217 .append(makeHexString((uint64_t)(HostOpId) ? (*HostOpId) : 0,218 /*IsPointer=*/false))219 .append(1, ')');220 S.append(" src=").append(makeHexString((uint64_t)SrcAddr));221 S.append(" src_device_num=").append(std::to_string(SrcDeviceNum));222 S.append(" dest=").append(makeHexString((uint64_t)DstAddr));223 S.append(" dest_device_num=").append(std::to_string(DstDeviceNum));224 S.append(" bytes=").append(std::to_string(Bytes));225 S.append(" code=").append(makeHexString((uint64_t)CodeptrRA));226 return S;227}228 229std::string internal::TargetSubmit::toString() const {230 std::string S{" Callback Submit: target_id="};231 S.append(std::to_string(TargetId));232 S.append(" host_op_id=").append(std::to_string(HostOpId));233 S.append(" req_num_teams=").append(std::to_string(RequestedNumTeams));234 return S;235}236 237std::string internal::TargetSubmitEmi::toString() const {238 std::string S{" Callback Submit EMI: endpoint="};239 S.append(std::to_string(Endpoint));240 S.append(" req_num_teams=").append(std::to_string(RequestedNumTeams));241 S.append(" target_data=").append(makeHexString((uint64_t)TargetData));242 S.append(" (")243 .append(makeHexString((uint64_t)(TargetData) ? TargetData->value : 0,244 /*IsPointer=*/false))245 .append(1, ')');246 S.append(" host_op_id=").append(makeHexString((uint64_t)HostOpId));247 S.append(" (")248 .append(makeHexString((uint64_t)(HostOpId) ? (*HostOpId) : 0,249 /*IsPointer=*/false))250 .append(1, ')');251 return S;252}253 254std::string internal::DeviceInitialize::toString() const {255 std::string S{"Callback Init: device_num="};256 S.append(std::to_string(DeviceNum));257 S.append(" type=").append((Type) ? Type : "(null)");258 S.append(" device=").append(makeHexString((uint64_t)Device));259 S.append(" lookup=").append(makeHexString((uint64_t)LookupFn));260 S.append(" doc=").append(makeHexString((uint64_t)DocStr));261 return S;262}263 264std::string internal::DeviceFinalize::toString() const {265 std::string S{"Callback Fini: device_num="};266 S.append(std::to_string(DeviceNum));267 return S;268}269 270std::string internal::DeviceLoad::toString() const {271 std::string S{"Callback Load: device_num:"};272 S.append(std::to_string(DeviceNum));273 S.append(" module_id:").append(std::to_string(ModuleId));274 S.append(" filename:").append((Filename == nullptr) ? "(null)" : Filename);275 S.append(" host_addr:").append(makeHexString((uint64_t)HostAddr));276 S.append(" device_addr:").append(makeHexString((uint64_t)DeviceAddr));277 S.append(" bytes:").append(std::to_string(Bytes));278 return S;279}280 281std::string internal::BufferRequest::toString() const {282 std::string S{"Allocated "};283 S.append(std::to_string((Bytes != nullptr) ? *Bytes : 0))284 .append(" bytes at ");285 S.append(makeHexString((Buffer != nullptr) ? (uint64_t)*Buffer : 0));286 S.append(" in buffer request callback");287 return S;288}289 290std::string internal::BufferComplete::toString() const {291 std::string S{"Executing buffer complete callback: "};292 S.append(std::to_string(DeviceNum)).append(1, ' ');293 S.append(makeHexString((uint64_t)Buffer)).append(1, ' ');294 S.append(std::to_string(Bytes)).append(1, ' ');295 S.append(makeHexString((uint64_t)Begin)).append(1, ' ');296 S.append(std::to_string(BufferOwned));297 return S;298}299 300std::string internal::BufferRecord::toString() const {301 std::string S{""};302 std::string T{""};303 S.append("rec=").append(makeHexString((uint64_t)RecordPtr));304 S.append(" type=").append(std::to_string(Record.type));305 306 T.append("time=").append(std::to_string(Record.time));307 T.append(" thread_id=").append(std::to_string(Record.thread_id));308 T.append(" target_id=").append(std::to_string(Record.target_id));309 310 switch (Record.type) {311 case ompt_callback_target:312 case ompt_callback_target_emi: {313 // Handle Target Record314 ompt_record_target_t TR = Record.record.target;315 S.append(" (Target task) ").append(T);316 S.append(" kind=").append(std::to_string(TR.kind));317 S.append(" endpoint=").append(std::to_string(TR.endpoint));318 S.append(" device=").append(std::to_string(TR.device_num));319 S.append(" task_id=").append(std::to_string(TR.task_id));320 S.append(" codeptr=").append(makeHexString((uint64_t)TR.codeptr_ra));321 break;322 }323 case ompt_callback_target_data_op:324 case ompt_callback_target_data_op_emi: {325 // Handle Target DataOp Record326 ompt_record_target_data_op_t TDR = Record.record.target_data_op;327 S.append(" (Target data op) ").append(T);328 S.append(" host_op_id=").append(std::to_string(TDR.host_op_id));329 S.append(" optype=").append(std::to_string(TDR.optype));330 S.append(" src_addr=").append(makeHexString((uint64_t)TDR.src_addr));331 S.append(" src_device=").append(std::to_string(TDR.src_device_num));332 S.append(" dest_addr=").append(makeHexString((uint64_t)TDR.dest_addr));333 S.append(" dest_device=").append(std::to_string(TDR.dest_device_num));334 S.append(" bytes=").append(std::to_string(TDR.bytes));335 S.append(" end_time=").append(std::to_string(TDR.end_time));336 S.append(" duration=").append(std::to_string(TDR.end_time - Record.time));337 S.append(" ns codeptr=").append(makeHexString((uint64_t)TDR.codeptr_ra));338 break;339 }340 case ompt_callback_target_submit:341 case ompt_callback_target_submit_emi: {342 // Handle Target Kernel Record343 ompt_record_target_kernel_t TKR = Record.record.target_kernel;344 S.append(" (Target kernel) ").append(T);345 S.append(" host_op_id=").append(std::to_string(TKR.host_op_id));346 S.append(" requested_num_teams=")347 .append(std::to_string(TKR.requested_num_teams));348 S.append(" granted_num_teams=")349 .append(std::to_string(TKR.granted_num_teams));350 S.append(" end_time=").append(std::to_string(TKR.end_time));351 S.append(" duration=").append(std::to_string(TKR.end_time - Record.time));352 S.append(" ns");353 break;354 }355 default:356 S.append(" (unsupported record type)");357 break;358 }359 360 return S;361}362 363std::string internal::BufferRecordDeallocation::toString() const {364 std::string S{"Deallocated "};365 S.append(makeHexString((uint64_t)Buffer));366 return S;367}368