|
14 | 14 | #include <string>
|
15 | 15 | #include <unordered_map>
|
16 | 16 | #include <vector>
|
17 |
| - |
18 | 17 | #include "jni_layer_constants.h"
|
19 | 18 |
|
20 | 19 | #include <executorch/extension/android/jni/log.h>
|
|
31 | 30 | #include <executorch/extension/threadpool/threadpool.h>
|
32 | 31 | #endif
|
33 | 32 |
|
| 33 | +#ifdef EXECUTORCH_ANDROID_PROFILING |
| 34 | +#include <fcntl.h> |
| 35 | +#include <unistd.h> |
| 36 | +#include <executorch/devtools/etdump/etdump_flatcc.h> |
| 37 | +#endif |
| 38 | + |
34 | 39 | #include <fbjni/ByteBuffer.h>
|
35 | 40 | #include <fbjni/fbjni.h>
|
36 | 41 |
|
@@ -237,8 +242,12 @@ class ExecuTorchJni : public facebook::jni::HybridClass<ExecuTorchJni> {
|
237 | 242 | } else if (loadMode == 3) {
|
238 | 243 | load_mode = Module::LoadMode::MmapUseMlockIgnoreErrors;
|
239 | 244 | }
|
240 |
| - |
241 |
| - module_ = std::make_unique<Module>(modelPath->toStdString(), load_mode); |
| 245 | +#ifdef EXECUTORCH_ANDROID_PROFILING |
| 246 | + auto etdump_gen = std::make_unique<executorch::etdump::ETDumpGen>(); |
| 247 | +#else |
| 248 | + auto etdump_gen = nullptr; |
| 249 | +#endif |
| 250 | + module_ = std::make_unique<Module>(modelPath->toStdString(), load_mode, std::move(etdump_gen)); |
242 | 251 |
|
243 | 252 | #ifdef ET_USE_THREADPOOL
|
244 | 253 | // Default to using cores/2 threadpool threads. The long-term plan is to
|
@@ -361,6 +370,27 @@ class ExecuTorchJni : public facebook::jni::HybridClass<ExecuTorchJni> {
|
361 | 370 | auto jevalue = JEValue::newJEValueFromEValue(result.get()[i]);
|
362 | 371 | jresult->setElement(i, *jevalue);
|
363 | 372 | }
|
| 373 | +#ifdef EXECUTORCH_ANDROID_PROFILING |
| 374 | + executorch::etdump::ETDumpGen* etdumpgen = (executorch::etdump::ETDumpGen*) module_->event_tracer(); |
| 375 | + auto etdump_data = etdumpgen->get_etdump_data(); |
| 376 | + |
| 377 | + if (etdump_data.buf != nullptr && etdump_data.size > 0) { |
| 378 | + int etdump_file = open("/data/local/tmp/result.etdump", O_WRONLY | O_CREAT, 0644); |
| 379 | + if (etdump_file == -1) { |
| 380 | + ET_LOG(Error, "Cannot create result.etdump error: %d", errno); |
| 381 | + } |
| 382 | + ssize_t bytes_written = write(etdump_file, (uint8_t*)etdump_data.buf, etdump_data.size); |
| 383 | + if (bytes_written == -1) { |
| 384 | + ET_LOG(Error, "Cannot write result.etdump error: %d", errno); |
| 385 | + } else { |
| 386 | + ET_LOG(Info, "ETDump written %d bytes to file.", bytes_written); |
| 387 | + } |
| 388 | + close(etdump_file); |
| 389 | + free(etdump_data.buf); |
| 390 | + } else { |
| 391 | + ET_LOG(Error, "No ETDump data available!"); |
| 392 | + } |
| 393 | +#endif |
364 | 394 |
|
365 | 395 | return jresult;
|
366 | 396 | }
|
|
0 commit comments