Skip to content

Commit 559b057

Browse files
committed
[devtool] make ETDumpGen use datasink
This diff enables customized debug data pipeline by making ETDumpGen leverage user-provided datasink. Details can be found in https://docs.google.com/document/d/1y_m32mKdj-OgLcLUz9TKhBW3PC3bBDYSBbeAH544EfM/edit?tab=t.0#heading=h.jlkcrurw482r Differential Revision: [D69647096](https://our.internmc.facebook.com/intern/diff/D69647096/) ghstack-source-id: 266455642 Pull Request resolved: #8499
1 parent fc82d82 commit 559b057

File tree

5 files changed

+292
-225
lines changed

5 files changed

+292
-225
lines changed

devtools/etdump/data_sink.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@ namespace etdump {
1111

1212
class DataSink : public DataSinkBase {
1313
public:
14-
explicit DataSink(::executorch::runtime::Span<uint8_t> buffer)
14+
/// Construct an empty DataSink.
15+
/* implicit */ constexpr DataSink() noexcept
16+
: debug_buffer_({}), offset_(0) {}
17+
18+
DataSink(::executorch::runtime::Span<uint8_t> buffer)
1519
: debug_buffer_(buffer), offset_(0) {}
1620

21+
DataSink(void* ptr, size_t size)
22+
: debug_buffer_((uint8_t*)ptr, size), offset_(0) {}
23+
1724
size_t write_tensor(const executorch::aten::Tensor& tensor) override;
1825
size_t get_storage_size() const override;
1926
size_t get_used_bytes() const override;

devtools/etdump/etdump_flatcc.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <cstring>
1212

13+
#include <executorch/devtools/etdump/data_sink.h>
1314
#include <executorch/devtools/etdump/emitter.h>
1415
#include <executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
1516
#include <executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
@@ -347,10 +348,10 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
347348
ET_CHECK_MSG(
348349
(name == nullptr) ^ (delegate_debug_index == -1),
349350
"Only name or delegate_debug_index can be valid. Check DelegateMappingBuilder documentation for more details.");
350-
if (debug_buffer_.empty()) {
351-
ET_CHECK_MSG(0, "Must pre-set debug buffer with set_debug_buffer()\n");
352-
return;
353-
}
351+
352+
ET_CHECK_MSG(
353+
data_sink_,
354+
"Must pre-set data sink before logging evalue with set_data_sink() or set_debug_buffer()\n");
354355

355356
check_ready_to_add_events();
356357
int64_t string_id = name != nullptr ? create_string_entry(name) : -1;
@@ -367,7 +368,7 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
367368

368369
// Check the type of `output` then call the corresponding logging functions
369370
if constexpr (std::is_same<T, Tensor>::value) {
370-
long offset = copy_tensor_to_debug_buffer(output);
371+
long offset = data_sink_->write_tensor(output);
371372
etdump_Tensor_ref_t tensor_ref = add_tensor_entry(builder_, output, offset);
372373

373374
etdump_Value_start(builder_);
@@ -377,7 +378,7 @@ void ETDumpGen::log_intermediate_output_delegate_helper(
377378
} else if constexpr (std::is_same<T, ArrayRef<Tensor>>::value) {
378379
etdump_Tensor_vec_start(builder_);
379380
for (size_t i = 0; i < output.size(); ++i) {
380-
long offset = copy_tensor_to_debug_buffer(output[i]);
381+
long offset = data_sink_->write_tensor(output[i]);
381382
etdump_Tensor_vec_push(
382383
builder_, add_tensor_entry(builder_, output[i], offset));
383384
}
@@ -497,27 +498,15 @@ ETDumpResult ETDumpGen::get_etdump_data() {
497498
}
498499

499500
void ETDumpGen::set_debug_buffer(Span<uint8_t> buffer) {
500-
debug_buffer_ = buffer;
501+
data_sink_ = std::make_shared<DataSink>(buffer);
501502
}
502503

503-
size_t ETDumpGen::copy_tensor_to_debug_buffer(executorch::aten::Tensor tensor) {
504-
if (tensor.nbytes() == 0) {
505-
return static_cast<size_t>(-1);
506-
}
507-
uint8_t* offset_ptr =
508-
internal::alignPointer(debug_buffer_.data() + debug_buffer_offset_, 64);
509-
debug_buffer_offset_ = (offset_ptr - debug_buffer_.data()) + tensor.nbytes();
510-
ET_CHECK_MSG(
511-
debug_buffer_offset_ <= debug_buffer_.size(),
512-
"Ran out of space to store intermediate outputs.");
513-
memcpy(offset_ptr, tensor.const_data_ptr(), tensor.nbytes());
514-
return (size_t)(offset_ptr - debug_buffer_.data());
504+
void ETDumpGen::set_data_sink(std::shared_ptr<DataSinkBase> data_sink) {
505+
data_sink_ = data_sink;
515506
}
516507

517508
void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
518-
if (debug_buffer_.empty()) {
519-
return;
520-
}
509+
ET_CHECK_MSG(data_sink_, "Must set data sink before logging evalue\n");
521510

522511
check_ready_to_add_events();
523512

@@ -529,7 +518,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
529518
switch (evalue.tag) {
530519
case Tag::Tensor: {
531520
executorch::aten::Tensor tensor = evalue.toTensor();
532-
long offset = copy_tensor_to_debug_buffer(tensor);
521+
long offset = data_sink_->write_tensor(tensor);
533522
etdump_Tensor_ref_t tensor_ref =
534523
add_tensor_entry(builder_, tensor, offset);
535524

@@ -551,7 +540,7 @@ void ETDumpGen::log_evalue(const EValue& evalue, LoggedEValueType evalue_type) {
551540
evalue.toTensorList();
552541
etdump_Tensor_vec_start(builder_);
553542
for (size_t i = 0; i < tensors.size(); ++i) {
554-
long offset = copy_tensor_to_debug_buffer(tensors[i]);
543+
long offset = data_sink_->write_tensor(tensors[i]);
555544
etdump_Tensor_vec_push(
556545
builder_, add_tensor_entry(builder_, tensors[i], offset));
557546
}
@@ -636,7 +625,13 @@ bool ETDumpGen::is_static_etdump() {
636625
}
637626

638627
size_t ETDumpGen::get_debug_buffer_size() const {
639-
return debug_buffer_.size();
628+
ET_CHECK_MSG(data_sink_, "Must set data sink before checking its size\n");
629+
return data_sink_->get_storage_size();
630+
}
631+
632+
size_t ETDumpGen::get_data_sink_size() const {
633+
ET_CHECK_MSG(data_sink_, "Must set data sink before checking its size\n");
634+
return data_sink_->get_storage_size();
640635
}
641636

642637
} // namespace etdump

devtools/etdump/etdump_flatcc.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
#pragma once
1010

1111
#include <cstdint>
12+
#include <memory>
1213

14+
#include <executorch/devtools/etdump/data_sink_base.h>
1315
#include <executorch/runtime/core/event_tracer.h>
1416
#include <executorch/runtime/core/span.h>
1517
#include <executorch/runtime/platform/platform.h>
@@ -141,8 +143,10 @@ class ETDumpGen : public ::executorch::runtime::EventTracer {
141143
::executorch::runtime::DebugHandle delegate_debug_index,
142144
const double& output) override;
143145
void set_debug_buffer(::executorch::runtime::Span<uint8_t> buffer);
146+
void set_data_sink(std::shared_ptr<DataSinkBase> data_sink);
144147
ETDumpResult get_etdump_data();
145148
size_t get_debug_buffer_size() const;
149+
size_t get_data_sink_size() const;
146150
size_t get_num_blocks();
147151
bool is_static_etdump();
148152
void reset();
@@ -158,7 +162,6 @@ class ETDumpGen : public ::executorch::runtime::EventTracer {
158162

159163
void check_ready_to_add_events();
160164
int64_t create_string_entry(const char* name);
161-
size_t copy_tensor_to_debug_buffer(executorch::aten::Tensor tensor);
162165

163166
/**
164167
* Templated helper function used to log various types of intermediate output.
@@ -172,8 +175,7 @@ class ETDumpGen : public ::executorch::runtime::EventTracer {
172175

173176
struct flatcc_builder* builder_;
174177
size_t num_blocks_ = 0;
175-
::executorch::runtime::Span<uint8_t> debug_buffer_;
176-
size_t debug_buffer_offset_ = 0;
178+
std::shared_ptr<DataSinkBase> data_sink_;
177179
int bundled_input_index_ = -1;
178180
State state_ = State::Init;
179181
struct internal::ETDumpStaticAllocator alloc_;

devtools/etdump/targets.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ def define_common_targets():
154154
exported_deps = [
155155
":etdump_schema_flatcc",
156156
":utils",
157+
":data_sink_base" + aten_suffix,
158+
":data_sink" + aten_suffix,
157159
"//executorch/runtime/core:event_tracer" + aten_suffix,
158160
"//executorch/runtime/core/exec_aten/util:scalar_type_util" + aten_suffix,
159161
],

0 commit comments

Comments
 (0)