event.h 3.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
// Copyright (c) 2023 CINN Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>
#include <vector>

namespace cinn {
namespace utils {

/*
TODO(Aurelius84): For now, we don't implement EventLevel to
control or shield the event greater than specified level.
So EventType is not strictly a single-layer structure.
*/
enum class EventType {
  // kOrdinary is default type
  kOrdinary,
  // kGraph is frontend Graph process
  kGraph,
  // kProgram is fronted Program process
  kProgram,
  // kFusePass is Graph and Program pass process
  kFusePass,
  // kCompute is NetBuilder OpLower process in OpLowering
  kCompute,
  // kSchedule is applying Schedule process in OpLowering
  kSchedule,
  // kOptimize is applying Optimize process in OpLowering
  kOptimize,
  // kCodeGen is AstCodegen process
  kCodeGen,
  // kCompile is LLVM or CUDA NVTX compile process
  kCompile,
  // kInstruction is running instruction process
  kInstruction
};

inline std::string EventTypeToString(const EventType& type);

std::ostream& operator<<(std::ostream& os, const EventType& type);

struct HostEvent {
  std::string annotation_;
  double duration_;  // ms
  EventType type_;

  HostEvent(const std::string& annotation, double duration, EventType type)
      : annotation_(annotation), duration_(duration), type_(type) {}
};

class Summary {
 public:
70
  struct Ratio {
71
    double value;
72
    Ratio(double val) : value(val) {}  // NOLINT
73 74 75 76 77
    std::string ToStr() const { return std::to_string(value); }
  };

  struct Item {
    HostEvent info;
78 79
    Ratio sub_ratio{0.0};    // percentage of EventType
    Ratio total_ratio{0.0};  // precentage of total process
80

81
    explicit Item(const HostEvent& e) : info(e) {}
82
    bool operator<(const Item& other) const {
83
      return total_ratio.value > other.total_ratio.value;
84
    }
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
  };

  static std::string Format(const std::vector<HostEvent>& events);

  static std::string AsStr(const std::vector<Item>& itemsm, int data_width);
};

class HostEventRecorder {
 public:
  // singleton
  static HostEventRecorder& GetInstance() {
    static HostEventRecorder instance;
    return instance;
  }

  static std::string Table() { return Summary::Format(GetInstance().Events()); }

  void Clear() { events_.clear(); }

  std::vector<HostEvent>& Events() { return events_; }

106 107 108
  void RecordEvent(const std::string& annotation,
                   double duration,
                   EventType type) {
109 110 111 112 113 114 115 116 117
    GetInstance().Events().emplace_back(annotation, duration, type);
  }

 private:
  std::vector<HostEvent> events_;
};

}  // namespace utils
}  // namespace cinn