brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.1 KiB · 35673e0 Raw
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