Project import generated by Copybara.
GitOrigin-RevId: 53a42bf7ad836321123cb7b6c80b0f2e13fbf83e
This commit is contained in:
@@ -57,21 +57,37 @@ namespace mediapipe {
|
||||
|
||||
namespace {
|
||||
|
||||
// For each event-type, whether packet details are logged.
|
||||
// The event-types are:
|
||||
// UNKNOWN, OPEN, PROCESS, CLOSE,
|
||||
// NOT_READY, READY_FOR_PROCESS, READY_FOR_CLOSE, THROTTLED, UNTHROTTLED
|
||||
// CPU_TASK_USER, CPU_TASK_SYSTEM, GPU_TASK, DSP_TASK, TPU_TASK
|
||||
constexpr bool kProfilerPacketEvents[] = { //
|
||||
false, true, true, true, //
|
||||
false, false, false, false, false, //
|
||||
true, true, true, true, true};
|
||||
void BasicTraceEventTypes(TraceEventRegistry* result) {
|
||||
// The initializer arguments below are: event_type, description,
|
||||
// is_packet_event, is_stream_event, id_event_data.
|
||||
std::vector<TraceEventType> basic_types = {
|
||||
{TraceEvent::UNKNOWN, "An uninitialized trace-event."},
|
||||
{TraceEvent::OPEN, "A call to Calculator::Open.", true, true},
|
||||
{TraceEvent::PROCESS, "A call to Calculator::Open.", true, true},
|
||||
{TraceEvent::CLOSE, "A call to Calculator::Close.", true, true},
|
||||
|
||||
// For each calculator method, whether StreamTraces are desired.
|
||||
constexpr bool kProfilerStreamEvents[] = { //
|
||||
false, true, true, true, //
|
||||
false, false, false, false, false, //
|
||||
true, true, false, false, false};
|
||||
{TraceEvent::NOT_READY, "A calculator cannot process packets yet."},
|
||||
{TraceEvent::READY_FOR_PROCESS, "A calculator can process packets."},
|
||||
{TraceEvent::READY_FOR_CLOSE, "A calculator is done processing packets."},
|
||||
{TraceEvent::THROTTLED, "Input is disabled due to max_queue_size."},
|
||||
{TraceEvent::UNTHROTTLED, "Input is enabled up to max_queue_size."},
|
||||
|
||||
{TraceEvent::CPU_TASK_USER, "User-time processing packets.", true, true},
|
||||
{TraceEvent::CPU_TASK_SYSTEM, "System-time processing packets.", true,
|
||||
true},
|
||||
{TraceEvent::GPU_TASK, "GPU-time processing packets.", true, false},
|
||||
{TraceEvent::DSP_TASK, "DSP-time processing packets.", true, false},
|
||||
{TraceEvent::TPU_TASK, "TPU-time processing packets.", true, false},
|
||||
|
||||
{TraceEvent::GPU_CALIBRATION,
|
||||
"A time measured by GPU clock and by CPU clock.", true, false},
|
||||
{TraceEvent::PACKET_QUEUED, "An input queue size when a packet arrives.",
|
||||
true, true, false},
|
||||
};
|
||||
for (TraceEventType t : basic_types) {
|
||||
(*result)[t.event_type()] = t;
|
||||
}
|
||||
}
|
||||
|
||||
// A map defining int32 identifiers for std::string object pointers.
|
||||
// Lookup is fast when the same std::string object is used frequently.
|
||||
@@ -106,7 +122,7 @@ class StringIdMap {
|
||||
// A map defining int32 identifiers for object pointers.
|
||||
class AddressIdMap {
|
||||
public:
|
||||
int32 operator[](const void* id) {
|
||||
int32 operator[](int64 id) {
|
||||
auto pointer_id = pointer_id_map_.find(id);
|
||||
if (pointer_id != pointer_id_map_.end()) {
|
||||
return pointer_id->second;
|
||||
@@ -114,12 +130,10 @@ class AddressIdMap {
|
||||
return pointer_id_map_[id] = next_id++;
|
||||
}
|
||||
void clear() { pointer_id_map_.clear(); }
|
||||
const std::unordered_map<const void*, int32>& map() {
|
||||
return pointer_id_map_;
|
||||
}
|
||||
const std::unordered_map<int64, int32>& map() { return pointer_id_map_; }
|
||||
|
||||
private:
|
||||
std::unordered_map<const void*, int32> pointer_id_map_;
|
||||
std::unordered_map<int64, int32> pointer_id_map_;
|
||||
int32 next_id = 0;
|
||||
};
|
||||
|
||||
@@ -147,8 +161,12 @@ class TraceBuilder::Impl {
|
||||
static std::string* empty_string = new std::string("");
|
||||
stream_id_map_[empty_string];
|
||||
packet_data_id_map_[0];
|
||||
BasicTraceEventTypes(&trace_event_registry_);
|
||||
}
|
||||
|
||||
// Returns the registry of trace event types.
|
||||
TraceEventRegistry* trace_event_registry() { return &trace_event_registry_; }
|
||||
|
||||
static Timestamp TimestampAfter(const TraceBuffer& buffer,
|
||||
absl::Time begin_time) {
|
||||
Timestamp max_ts = Timestamp::Min();
|
||||
@@ -176,7 +194,7 @@ class TraceBuilder::Impl {
|
||||
|
||||
// Index TraceEvents by task-id and stream-hop-id.
|
||||
for (const TraceEvent& event : snapshot) {
|
||||
if (!kProfilerPacketEvents[static_cast<int>(event.event_type)]) {
|
||||
if (!trace_event_registry_[event.event_type].is_packet_event()) {
|
||||
continue;
|
||||
}
|
||||
TaskId task_id{event.node_id, event.input_ts, event.event_type};
|
||||
@@ -195,7 +213,7 @@ class TraceBuilder::Impl {
|
||||
result->set_base_timestamp(base_ts_);
|
||||
std::unordered_set<TaskId> task_ids;
|
||||
for (const TraceEvent& event : snapshot) {
|
||||
if (!kProfilerPacketEvents[static_cast<int>(event.event_type)]) {
|
||||
if (!trace_event_registry_[event.event_type].is_packet_event()) {
|
||||
BuildEventLog(event, result->add_calculator_trace());
|
||||
continue;
|
||||
}
|
||||
@@ -280,18 +298,12 @@ class TraceBuilder::Impl {
|
||||
// Construct the StreamTrace for a TraceEvent.
|
||||
void BuildStreamTrace(const TraceEvent& event,
|
||||
GraphTrace::StreamTrace* result) {
|
||||
if (event.is_finish) {
|
||||
result->set_stream_id(stream_id_map_[event.stream_id]);
|
||||
result->set_packet_timestamp(LogTimestamp(event.packet_ts));
|
||||
return;
|
||||
}
|
||||
result->set_stream_id(stream_id_map_[event.stream_id]);
|
||||
result->set_packet_timestamp(LogTimestamp(event.packet_ts));
|
||||
result->set_finish_time(LogTime(event.event_time));
|
||||
result->set_packet_id(packet_data_id_map_[event.packet_data_id]);
|
||||
const TraceEvent* output_event = FindOutputEvent(event);
|
||||
if (output_event) {
|
||||
result->set_start_time(LogTime(output_event->event_time));
|
||||
if (trace_event_registry_[event.event_type].id_event_data()) {
|
||||
result->set_event_data(packet_data_id_map_[event.event_data]);
|
||||
} else {
|
||||
result->set_event_data(event.event_data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,10 +313,12 @@ class TraceBuilder::Impl {
|
||||
absl::Time start_time = absl::InfiniteFuture();
|
||||
absl::Time finish_time = absl::InfiniteFuture();
|
||||
for (const TraceEvent* event : task_events) {
|
||||
if (result->input_trace().size() + result->output_trace().size() == 0) {
|
||||
if (result->event_type() == TraceEvent::UNKNOWN) {
|
||||
result->set_node_id(event->node_id);
|
||||
result->set_event_type(event->event_type);
|
||||
result->set_input_timestamp(LogTimestamp(event->input_ts));
|
||||
if (event->input_ts != Timestamp::Unset()) {
|
||||
result->set_input_timestamp(LogTimestamp(event->input_ts));
|
||||
}
|
||||
result->set_thread_id(event->thread_id);
|
||||
}
|
||||
if (event->is_finish) {
|
||||
@@ -312,12 +326,21 @@ class TraceBuilder::Impl {
|
||||
} else {
|
||||
start_time = std::min(start_time, event->event_time);
|
||||
}
|
||||
if (kProfilerStreamEvents[static_cast<int>(event->event_type)]) {
|
||||
if (trace_event_registry_[event->event_type].is_stream_event()) {
|
||||
auto stream_trace = event->is_finish ? result->add_output_trace()
|
||||
: result->add_input_trace();
|
||||
if (event->is_finish) {
|
||||
BuildStreamTrace(*event, result->add_output_trace());
|
||||
auto s = result->output_trace(result->output_trace_size() - 1);
|
||||
// Log only the packet id for each output event.
|
||||
stream_trace->set_stream_id(stream_id_map_[event->stream_id]);
|
||||
stream_trace->set_packet_timestamp(LogTimestamp(event->packet_ts));
|
||||
} else {
|
||||
BuildStreamTrace(*event, result->add_input_trace());
|
||||
// Log the full stream trace for each input event.
|
||||
BuildStreamTrace(*event, stream_trace);
|
||||
stream_trace->set_finish_time(LogTime(event->event_time));
|
||||
const TraceEvent* output_event = FindOutputEvent(*event);
|
||||
if (output_event) {
|
||||
stream_trace->set_start_time(LogTime(output_event->event_time));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -343,13 +366,11 @@ class TraceBuilder::Impl {
|
||||
result->set_input_timestamp(LogTimestamp(event.input_ts));
|
||||
}
|
||||
result->set_thread_id(event.thread_id);
|
||||
if (kProfilerStreamEvents[static_cast<int>(event.event_type)]) {
|
||||
if (trace_event_registry_[event.event_type].is_stream_event()) {
|
||||
if (event.stream_id) {
|
||||
auto stream_trace = event.is_finish ? result->add_output_trace()
|
||||
: result->add_input_trace();
|
||||
stream_trace->set_stream_id(stream_id_map_[event.stream_id]);
|
||||
stream_trace->set_packet_timestamp(LogTimestamp(event.packet_ts));
|
||||
stream_trace->set_packet_id(packet_data_id_map_[event.packet_data_id]);
|
||||
BuildStreamTrace(event, stream_trace);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -366,11 +387,17 @@ class TraceBuilder::Impl {
|
||||
int64 base_ts_ = std::numeric_limits<int64>::max();
|
||||
// The time represented as 0 in the trace.
|
||||
int64 base_time_ = std::numeric_limits<int64>::max();
|
||||
// Indicates traits of each event type.
|
||||
TraceEventRegistry trace_event_registry_;
|
||||
};
|
||||
|
||||
TraceBuilder::TraceBuilder() : impl_(new Impl) {}
|
||||
TraceBuilder::~TraceBuilder() {}
|
||||
|
||||
TraceEventRegistry* TraceBuilder::trace_event_registry() {
|
||||
return impl_->trace_event_registry();
|
||||
}
|
||||
|
||||
Timestamp TraceBuilder::TimestampAfter(const TraceBuffer& buffer,
|
||||
absl::Time begin_time) {
|
||||
return Impl::TimestampAfter(buffer, begin_time);
|
||||
@@ -400,6 +427,8 @@ const TraceEvent::EventType //
|
||||
TraceEvent::CPU_TASK_SYSTEM, //
|
||||
TraceEvent::GPU_TASK, //
|
||||
TraceEvent::DSP_TASK, //
|
||||
TraceEvent::TPU_TASK;
|
||||
TraceEvent::TPU_TASK, //
|
||||
TraceEvent::GPU_CALIBRATION, //
|
||||
TraceEvent::PACKET_QUEUED;
|
||||
|
||||
} // namespace mediapipe
|
||||
|
||||
Reference in New Issue
Block a user