diff --git a/devtools/CMakeLists.txt b/devtools/CMakeLists.txt index 3970f74fe5..9dd38d3678 100644 --- a/devtools/CMakeLists.txt +++ b/devtools/CMakeLists.txt @@ -186,6 +186,8 @@ add_library( ${CMAKE_CURRENT_SOURCE_DIR}/etdump/emitter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/etdump/data_sinks/buffer_data_sink.cpp ${CMAKE_CURRENT_SOURCE_DIR}/etdump/data_sinks/buffer_data_sink.h + ${CMAKE_CURRENT_SOURCE_DIR}/etdump/data_sinks/file_data_sink.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/etdump/data_sinks/file_data_sink.h ) target_link_libraries( diff --git a/devtools/etdump/tests/etdump_test.cpp b/devtools/etdump/tests/etdump_test.cpp index 4a732335d3..8e93a54707 100644 --- a/devtools/etdump/tests/etdump_test.cpp +++ b/devtools/etdump/tests/etdump_test.cpp @@ -8,11 +8,14 @@ #include #include +#include #include +#include #include #include #include +#include #include #include #include @@ -24,6 +27,7 @@ using ::executorch::aten::ScalarType; using ::executorch::aten::Tensor; using ::executorch::etdump::ETDumpGen; using ::executorch::etdump::ETDumpResult; +using ::executorch::extension::testing::TempFile; using ::executorch::runtime::AllocatorID; using ::executorch::runtime::ArrayRef; using ::executorch::runtime::BoxedEvalueList; @@ -36,6 +40,7 @@ using ::executorch::runtime::Tag; using ::executorch::runtime::testing::TensorFactory; using ::executorch::etdump::BufferDataSink; +using ::executorch::etdump::FileDataSink; class ProfilerETDumpTest : public ::testing::Test { protected: @@ -45,6 +50,9 @@ class ProfilerETDumpTest : public ::testing::Test { const size_t buf_size = 512 * 1024; buf = (uint8_t*)malloc(buf_size * sizeof(uint8_t)); etdump_gen[1] = new ETDumpGen(Span(buf, buf_size)); + + temp_file = std::make_unique(std::string()); + dump_file_path = temp_file->path(); } void TearDown() override { @@ -55,6 +63,8 @@ class ProfilerETDumpTest : public ::testing::Test { ETDumpGen* etdump_gen[2]; uint8_t* buf = nullptr; + std::unique_ptr temp_file; + std::string dump_file_path; }; TEST_F(ProfilerETDumpTest, SingleProfileEvent) { @@ -177,7 +187,7 @@ TEST_F(ProfilerETDumpTest, AllocationEvents) { TEST_F(ProfilerETDumpTest, DebugEvent) { for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 2; j++) { + for (size_t j = 0; j < 3; j++) { etdump_gen[i]->create_event_block("test_block"); void* ptr = malloc(2048); @@ -199,16 +209,22 @@ TEST_F(ProfilerETDumpTest, DebugEvent) { // using span to record debug data Span buffer((uint8_t*)ptr, 2048); auto buffer_data_sink = BufferDataSink::create(ptr, 2048); + auto file_data_sink = FileDataSink::create(dump_file_path.c_str()); + if (j == 0) { ET_EXPECT_DEATH( etdump_gen[i]->log_evalue(evalue_tensor), "Must set data sink before writing tensor-like data"); etdump_gen[i]->set_debug_buffer(buffer); } - // using data sink to record debug data - else { + // using buffer data sink to record debug data + else if (j == 1) { etdump_gen[i]->set_data_sink(&buffer_data_sink.get()); } + // using file data sink to record debug data + else { + etdump_gen[i]->set_data_sink(&file_data_sink.get()); + } etdump_gen[i]->log_evalue(evalue_tensor); etdump_gen[i]->log_evalue( @@ -221,7 +237,7 @@ TEST_F(ProfilerETDumpTest, DebugEvent) { TEST_F(ProfilerETDumpTest, DebugEventTensorList) { for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 2; j++) { + for (size_t j = 0; j < 3; j++) { TensorFactory tf; executorch::aten::Tensor storage[2] = {tf.ones({3, 2}), tf.ones({3, 2})}; EValue evalue_1(storage[0]); @@ -238,15 +254,20 @@ TEST_F(ProfilerETDumpTest, DebugEventTensorList) { Span buffer((uint8_t*)ptr, 2048); auto buffer_data_sink = BufferDataSink::create(ptr, 2048); + auto file_data_sink = FileDataSink::create(dump_file_path.c_str()); // using span to record debug data if (j == 0) { etdump_gen[i]->set_debug_buffer(buffer); } - // using data sink to record debug data - else { + // using buffer data sink to record debug data + else if (j == 1) { etdump_gen[i]->set_data_sink(&buffer_data_sink.get()); } + // using file data sink to record debug dats + else { + etdump_gen[i]->set_data_sink(&file_data_sink.get()); + } etdump_gen[i]->log_evalue(evalue); @@ -267,15 +288,20 @@ TEST_F(ProfilerETDumpTest, VerifyLogging) { Span buffer((uint8_t*)ptr, 2048); auto buffer_data_sink = BufferDataSink::create(ptr, 2048); + auto file_data_sink = FileDataSink::create(dump_file_path.c_str()); // using span to record debug data if (j == 0) { etdump_gen[i]->set_debug_buffer(buffer); } - // using data sink to record debug data - else { + // using buffer data sink to record debug data + else if (j == 1) { etdump_gen[i]->set_data_sink(&buffer_data_sink.get()); } + // using buffer data sink to record debug data + else { + etdump_gen[i]->set_data_sink(&file_data_sink.get()); + } etdump_gen[i]->log_evalue(evalue); etdump_gen[i]->log_evalue(evalue, LoggedEValueType::kProgramOutput); @@ -473,11 +499,12 @@ TEST_F(ProfilerETDumpTest, VerifyData) { TEST_F(ProfilerETDumpTest, LogDelegateIntermediateOutput) { for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 2; j++) { + for (size_t j = 0; j < 3; j++) { void* ptr = malloc(2048); Span buffer((uint8_t*)ptr, 2048); auto buffer_data_sink = BufferDataSink::create(ptr, 2048); + auto file_data_sink = FileDataSink::create(dump_file_path.c_str()); etdump_gen[i]->create_event_block("test_block"); TensorFactory tf; @@ -493,10 +520,14 @@ TEST_F(ProfilerETDumpTest, LogDelegateIntermediateOutput) { "Must set data sink before writing tensor-like data"); etdump_gen[i]->set_debug_buffer(buffer); } - // using data sink to record debug data - else { + // using buffer data sink to record debug data + else if (j == 1) { etdump_gen[i]->set_data_sink(&buffer_data_sink.get()); } + // using file data sink to record debug data + else { + etdump_gen[i]->set_data_sink(&file_data_sink.get()); + } // Log a tensor etdump_gen[i]->log_intermediate_output_delegate( @@ -546,22 +577,27 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) { EValue evalue(tf.ones({3, 2})); for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 2; j++) { + for (size_t j = 0; j < 3; j++) { etdump_gen[i]->create_event_block("test_block"); void* ptr = malloc(2048); Span buffer((uint8_t*)ptr, 2048); ; auto buffer_data_sink = BufferDataSink::create(ptr, 2048); + auto file_data_sink = FileDataSink::create(dump_file_path.c_str()); // using span to record debug data if (j == 0) { etdump_gen[i]->set_debug_buffer(buffer); } - // using data sink to record debug data - else { + // using buffer data sink to record debug data + else if (j == 1) { etdump_gen[i]->set_data_sink(&buffer_data_sink.get()); } + // using file data sink to record debug data + else { + etdump_gen[i]->set_data_sink(&file_data_sink.get()); + } // Event 0 etdump_gen[i]->log_intermediate_output_delegate(