8
8
9
9
#include < gtest/gtest.h>
10
10
#include < cstdio>
11
+ #include < memory>
11
12
12
13
#include < executorch/devtools/etdump/data_sinks/buffer_data_sink.h>
14
+ #include < executorch/devtools/etdump/data_sinks/file_data_sink.h>
13
15
#include < executorch/devtools/etdump/etdump_flatcc.h>
14
16
#include < executorch/devtools/etdump/etdump_schema_flatcc_builder.h>
15
17
#include < executorch/devtools/etdump/etdump_schema_flatcc_reader.h>
18
+ #include < executorch/extension/testing_util/temp_file.h>
16
19
#include < executorch/runtime/core/exec_aten/testing_util/tensor_factory.h>
17
20
#include < executorch/runtime/core/span.h>
18
21
#include < executorch/runtime/platform/runtime.h>
@@ -24,6 +27,7 @@ using ::executorch::aten::ScalarType;
24
27
using ::executorch::aten::Tensor;
25
28
using ::executorch::etdump::ETDumpGen;
26
29
using ::executorch::etdump::ETDumpResult;
30
+ using ::executorch::extension::testing::TempFile;
27
31
using ::executorch::runtime::AllocatorID;
28
32
using ::executorch::runtime::ArrayRef;
29
33
using ::executorch::runtime::BoxedEvalueList;
@@ -36,6 +40,7 @@ using ::executorch::runtime::Tag;
36
40
using ::executorch::runtime::testing::TensorFactory;
37
41
38
42
using ::executorch::etdump::BufferDataSink;
43
+ using ::executorch::etdump::FileDataSink;
39
44
40
45
class ProfilerETDumpTest : public ::testing::Test {
41
46
protected:
@@ -45,6 +50,9 @@ class ProfilerETDumpTest : public ::testing::Test {
45
50
const size_t buf_size = 512 * 1024 ;
46
51
buf = (uint8_t *)malloc (buf_size * sizeof (uint8_t ));
47
52
etdump_gen[1 ] = new ETDumpGen (Span<uint8_t >(buf, buf_size));
53
+
54
+ temp_file = std::make_unique<TempFile>(std::string ());
55
+ dump_file_path = temp_file->path ();
48
56
}
49
57
50
58
void TearDown () override {
@@ -55,6 +63,8 @@ class ProfilerETDumpTest : public ::testing::Test {
55
63
56
64
ETDumpGen* etdump_gen[2 ];
57
65
uint8_t * buf = nullptr ;
66
+ std::unique_ptr<TempFile> temp_file;
67
+ std::string dump_file_path;
58
68
};
59
69
60
70
TEST_F (ProfilerETDumpTest, SingleProfileEvent) {
@@ -177,7 +187,7 @@ TEST_F(ProfilerETDumpTest, AllocationEvents) {
177
187
178
188
TEST_F (ProfilerETDumpTest, DebugEvent) {
179
189
for (size_t i = 0 ; i < 2 ; i++) {
180
- for (size_t j = 0 ; j < 2 ; j++) {
190
+ for (size_t j = 0 ; j < 3 ; j++) {
181
191
etdump_gen[i]->create_event_block (" test_block" );
182
192
183
193
void * ptr = malloc (2048 );
@@ -199,16 +209,22 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
199
209
// using span to record debug data
200
210
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
201
211
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
212
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
213
+
202
214
if (j == 0 ) {
203
215
ET_EXPECT_DEATH (
204
216
etdump_gen[i]->log_evalue (evalue_tensor),
205
217
" Must set data sink before writing tensor-like data" );
206
218
etdump_gen[i]->set_debug_buffer (buffer);
207
219
}
208
- // using data sink to record debug data
209
- else {
220
+ // using buffer data sink to record debug data
221
+ else if (j == 1 ) {
210
222
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
211
223
}
224
+ // using file data sink to record debug data
225
+ else {
226
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
227
+ }
212
228
213
229
etdump_gen[i]->log_evalue (evalue_tensor);
214
230
etdump_gen[i]->log_evalue (
@@ -221,7 +237,7 @@ TEST_F(ProfilerETDumpTest, DebugEvent) {
221
237
222
238
TEST_F (ProfilerETDumpTest, DebugEventTensorList) {
223
239
for (size_t i = 0 ; i < 2 ; i++) {
224
- for (size_t j = 0 ; j < 2 ; j++) {
240
+ for (size_t j = 0 ; j < 3 ; j++) {
225
241
TensorFactory<ScalarType::Int> tf;
226
242
executorch::aten::Tensor storage[2 ] = {tf.ones ({3 , 2 }), tf.ones ({3 , 2 })};
227
243
EValue evalue_1 (storage[0 ]);
@@ -238,15 +254,20 @@ TEST_F(ProfilerETDumpTest, DebugEventTensorList) {
238
254
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
239
255
240
256
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
257
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
241
258
242
259
// using span to record debug data
243
260
if (j == 0 ) {
244
261
etdump_gen[i]->set_debug_buffer (buffer);
245
262
}
246
- // using data sink to record debug data
247
- else {
263
+ // using buffer data sink to record debug data
264
+ else if (j == 1 ) {
248
265
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
249
266
}
267
+ // using file data sink to record debug dats
268
+ else {
269
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
270
+ }
250
271
251
272
etdump_gen[i]->log_evalue (evalue);
252
273
@@ -267,15 +288,20 @@ TEST_F(ProfilerETDumpTest, VerifyLogging) {
267
288
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
268
289
269
290
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
291
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
270
292
271
293
// using span to record debug data
272
294
if (j == 0 ) {
273
295
etdump_gen[i]->set_debug_buffer (buffer);
274
296
}
275
- // using data sink to record debug data
276
- else {
297
+ // using buffer data sink to record debug data
298
+ else if (j == 1 ) {
277
299
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
278
300
}
301
+ // using buffer data sink to record debug data
302
+ else {
303
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
304
+ }
279
305
280
306
etdump_gen[i]->log_evalue (evalue);
281
307
etdump_gen[i]->log_evalue (evalue, LoggedEValueType::kProgramOutput );
@@ -473,11 +499,12 @@ TEST_F(ProfilerETDumpTest, VerifyData) {
473
499
474
500
TEST_F (ProfilerETDumpTest, LogDelegateIntermediateOutput) {
475
501
for (size_t i = 0 ; i < 2 ; i++) {
476
- for (size_t j = 0 ; j < 2 ; j++) {
502
+ for (size_t j = 0 ; j < 3 ; j++) {
477
503
void * ptr = malloc (2048 );
478
504
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
479
505
480
506
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
507
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
481
508
482
509
etdump_gen[i]->create_event_block (" test_block" );
483
510
TensorFactory<ScalarType::Float> tf;
@@ -493,10 +520,14 @@ TEST_F(ProfilerETDumpTest, LogDelegateIntermediateOutput) {
493
520
" Must set data sink before writing tensor-like data" );
494
521
etdump_gen[i]->set_debug_buffer (buffer);
495
522
}
496
- // using data sink to record debug data
497
- else {
523
+ // using buffer data sink to record debug data
524
+ else if (j == 1 ) {
498
525
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
499
526
}
527
+ // using file data sink to record debug data
528
+ else {
529
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
530
+ }
500
531
501
532
// Log a tensor
502
533
etdump_gen[i]->log_intermediate_output_delegate (
@@ -546,22 +577,27 @@ TEST_F(ProfilerETDumpTest, VerifyDelegateIntermediateLogging) {
546
577
EValue evalue (tf.ones ({3 , 2 }));
547
578
548
579
for (size_t i = 0 ; i < 2 ; i++) {
549
- for (size_t j = 0 ; j < 2 ; j++) {
580
+ for (size_t j = 0 ; j < 3 ; j++) {
550
581
etdump_gen[i]->create_event_block (" test_block" );
551
582
552
583
void * ptr = malloc (2048 );
553
584
Span<uint8_t > buffer ((uint8_t *)ptr, 2048 );
554
585
;
555
586
auto buffer_data_sink = BufferDataSink::create (ptr, 2048 );
587
+ auto file_data_sink = FileDataSink::create (dump_file_path.c_str ());
556
588
557
589
// using span to record debug data
558
590
if (j == 0 ) {
559
591
etdump_gen[i]->set_debug_buffer (buffer);
560
592
}
561
- // using data sink to record debug data
562
- else {
593
+ // using buffer data sink to record debug data
594
+ else if (j == 1 ) {
563
595
etdump_gen[i]->set_data_sink (&buffer_data_sink.get ());
564
596
}
597
+ // using file data sink to record debug data
598
+ else {
599
+ etdump_gen[i]->set_data_sink (&file_data_sink.get ());
600
+ }
565
601
566
602
// Event 0
567
603
etdump_gen[i]->log_intermediate_output_delegate (
0 commit comments