diff options
-rw-r--r-- | applications/inference_process/CMakeLists.txt | 4 | ||||
-rw-r--r-- | applications/inference_process/src/inference_process.cpp | 4 | ||||
-rw-r--r-- | event_recorder.cmake | 13 | ||||
-rw-r--r-- | lib/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lib/layer_by_layer_profiler/CMakeLists.txt (renamed from lib/ethosu_profiler/CMakeLists.txt) | 8 | ||||
-rw-r--r-- | lib/layer_by_layer_profiler/include/layer_by_layer_profiler.hpp (renamed from lib/ethosu_profiler/include/ethosu_profiler.hpp) | 15 | ||||
-rw-r--r-- | lib/layer_by_layer_profiler/src/layer_by_layer_profiler.cpp (renamed from lib/ethosu_profiler/src/ethosu_profiler.cpp) | 33 | ||||
-rw-r--r-- | lib/rte_component/include/RTE_Components.h (renamed from lib/ethosu_monitor/include/RTE_Components.h) | 3 |
8 files changed, 51 insertions, 34 deletions
diff --git a/applications/inference_process/CMakeLists.txt b/applications/inference_process/CMakeLists.txt index 4bd75c4..1378181 100644 --- a/applications/inference_process/CMakeLists.txt +++ b/applications/inference_process/CMakeLists.txt @@ -24,8 +24,8 @@ target_include_directories(inference_process PUBLIC include PRIVATE ${TENSORFLOW_PATH} ${TENSORFLOW_PATH}/tensorflow/lite/micro/tools/make/downloads/flatbuffers/include) target_link_libraries(inference_process PRIVATE tflu cmsis_core cmsis_device) -if (TARGET ethosu_profiler) - target_link_libraries(inference_process PRIVATE ethosu_profiler) +if (TARGET layer_by_layer_profiler) + target_link_libraries(inference_process PRIVATE layer_by_layer_profiler) endif() if (TARGET arm_profiler) target_link_libraries(inference_process PRIVATE arm_profiler) diff --git a/applications/inference_process/src/inference_process.cpp b/applications/inference_process/src/inference_process.cpp index 009706e..511a139 100644 --- a/applications/inference_process/src/inference_process.cpp +++ b/applications/inference_process/src/inference_process.cpp @@ -26,7 +26,7 @@ #include "arm_profiler.hpp" #ifdef ETHOSU -#include "ethosu_profiler.hpp" +#include "layer_by_layer_profiler.hpp" #endif #include "inference_process.hpp" @@ -202,7 +202,7 @@ bool InferenceProcess::runJob(InferenceJob &job) { // Create the TFL micro interpreter tflite::AllOpsResolver resolver; #ifdef ETHOSU - tflite::EthosUProfiler profiler; + tflite::LayerByLayerProfiler profiler; #else tflite::ArmProfiler profiler; #endif diff --git a/event_recorder.cmake b/event_recorder.cmake index 3823896..bb9efd9 100644 --- a/event_recorder.cmake +++ b/event_recorder.cmake @@ -16,17 +16,18 @@ # limitations under the License. # +add_library(rte_component INTERFACE) +target_include_directories(rte_component INTERFACE lib/rte_component/include) +target_link_libraries(rte_component INTERFACE cmsis_device) +target_compile_definitions(rte_component INTERFACE RTE_Components_CMSIS_device_header=\"${ARM_CPU}${ARM_FEATURES}.h\") + add_library(event_recorder INTERFACE) target_include_directories(event_recorder INTERFACE ${CMSIS_VIEW_PATH}/EventRecorder/Include ${CMSIS_VIEW_PATH}/EventRecorder/Config) -target_include_directories(event_recorder INTERFACE - ${CMSIS_VIEW_PATH}/EventRecorder/Config) +target_link_libraries(event_recorder INTERFACE rte_component) +target_sources(event_recorder INTERFACE ${CMSIS_VIEW_PATH}/EventRecorder/Source/EventRecorder.c) -target_link_libraries(event_recorder INTERFACE cmsis_device) -target_sources(event_recorder INTERFACE - ${CMSIS_VIEW_PATH}/EventRecorder/Source/EventRecorder.c) -target_compile_definitions(event_recorder INTERFACE RTE_Components_CMSIS_device_header=\"${ARM_CPU}${ARM_FEATURES}.h\") diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index ae18806..5536949 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -16,12 +16,11 @@ # limitations under the License. # -# Build ethosu_profiler -add_subdirectory(ethosu_profiler) +# Build layer_by_layer_profiler +add_subdirectory(layer_by_layer_profiler) # Build arm_profiler add_subdirectory(arm_profiler) # Build ethosu_monitor add_subdirectory(ethosu_monitor) - diff --git a/lib/ethosu_profiler/CMakeLists.txt b/lib/layer_by_layer_profiler/CMakeLists.txt index 336a696..9774685 100644 --- a/lib/ethosu_profiler/CMakeLists.txt +++ b/lib/layer_by_layer_profiler/CMakeLists.txt @@ -19,8 +19,8 @@ if (NOT TARGET ethosu_core_driver) return() endif() -add_library(ethosu_profiler INTERFACE) -target_link_libraries(ethosu_profiler INTERFACE ethosu_core_driver tflu) -target_include_directories(ethosu_profiler INTERFACE include) -target_sources(ethosu_profiler INTERFACE src/ethosu_profiler.cpp) +add_library(layer_by_layer_profiler INTERFACE) +target_link_libraries(layer_by_layer_profiler INTERFACE ethosu_core_driver tflu event_recorder) +target_include_directories(layer_by_layer_profiler INTERFACE include) +target_sources(layer_by_layer_profiler INTERFACE src/layer_by_layer_profiler.cpp) diff --git a/lib/ethosu_profiler/include/ethosu_profiler.hpp b/lib/layer_by_layer_profiler/include/layer_by_layer_profiler.hpp index 12c337c..8e8dc0f 100644 --- a/lib/ethosu_profiler/include/ethosu_profiler.hpp +++ b/lib/layer_by_layer_profiler/include/layer_by_layer_profiler.hpp @@ -16,9 +16,10 @@ * limitations under the License. */ -#ifndef ETHOSU_PROFILER_H -#define ETHOSU_PROFILER_H +#ifndef LAYER_BY_LAYER_PROFILER_H +#define LAYER_BY_LAYER_PROFILER_H +#include "EventRecorder.h" #include "tensorflow/lite/kernels/internal/compatibility.h" #include <memory> #include <pmu_ethosu.h> @@ -26,9 +27,12 @@ // NOTE: This profiler only works on systems with 1 NPU due to the use of // ethosu_reserve_driver(). namespace tflite { -class EthosUProfiler : public MicroProfiler { +class LayerByLayerProfiler : public MicroProfiler { public: - EthosUProfiler(size_t max_events = 200); + enum Backend { PRINTF, EVENT_RECORDER }; + LayerByLayerProfiler(size_t max_events = 200, + Backend backend = PRINTF, + int32_t event_id = EventID(EventLevelError, EvtStatistics_No, EventRecordNone)); uint32_t BeginEvent(const char *tag); void EndEvent(uint32_t event_handle); uint64_t GetTotalTicks() const; @@ -39,6 +43,9 @@ private: std::unique_ptr<const char *[]> tags_; std::unique_ptr<uint64_t[]> start_ticks_; std::unique_ptr<uint64_t[]> end_ticks_; + + Backend backend_; + int32_t event_id_; size_t num_events_; TF_LITE_REMOVE_VIRTUAL_DELETE; diff --git a/lib/ethosu_profiler/src/ethosu_profiler.cpp b/lib/layer_by_layer_profiler/src/layer_by_layer_profiler.cpp index 50b65f0..f7922cb 100644 --- a/lib/ethosu_profiler/src/ethosu_profiler.cpp +++ b/lib/layer_by_layer_profiler/src/layer_by_layer_profiler.cpp @@ -23,7 +23,7 @@ #include <string.h> -#include "ethosu_profiler.hpp" +#include "layer_by_layer_profiler.hpp" #include <ethosu_driver.h> #include <inttypes.h> #include <stdio.h> @@ -38,7 +38,9 @@ uint64_t GetCurrentEthosuTicks(struct ethosu_driver *drv) { namespace tflite { -EthosUProfiler::EthosUProfiler(size_t max_events) : max_events_(max_events), num_events_(0) { +LayerByLayerProfiler::LayerByLayerProfiler(size_t max_events, Backend backend, int32_t event_id) : + max_events_(max_events), backend_(backend), event_id_(event_id), num_events_(0) { + tags_ = std::make_unique<const char *[]>(max_events_); start_ticks_ = std::make_unique<uint64_t[]>(max_events_); end_ticks_ = std::make_unique<uint64_t[]>(max_events_); @@ -50,7 +52,7 @@ EthosUProfiler::EthosUProfiler(size_t max_events) : max_events_(max_events), num } // NOTE: THIS PROFILER ONLY WORKS ON SYSTEMS WITH 1 NPU -uint32_t EthosUProfiler::BeginEvent(const char *tag) { +uint32_t LayerByLayerProfiler::BeginEvent(const char *tag) { if (num_events_ == max_events_) { tflite::GetMicroErrorReporter()->Report("Profiling event overflow, max: %u events", max_events_); num_events_ = 0; @@ -74,7 +76,7 @@ uint32_t EthosUProfiler::BeginEvent(const char *tag) { } // NOTE: THIS PROFILER ONLY WORKS ON SYSTEMS WITH 1 NPU -void EthosUProfiler::EndEvent(uint32_t event_handle) { +void LayerByLayerProfiler::EndEvent(uint32_t event_handle) { TFLITE_DCHECK(event_handle < max_events_); if (strcmp("ethos-u", tags_[event_handle]) == 0) { @@ -85,12 +87,16 @@ void EthosUProfiler::EndEvent(uint32_t event_handle) { end_ticks_[event_handle] = GetCurrentTimeTicks(); } - printf("%s : cycle_cnt : %" PRIu64 " cycles\n", - tags_[event_handle], - end_ticks_[event_handle] - start_ticks_[event_handle]); + if (backend_ == PRINTF) { + printf("%s : cycle_cnt : %" PRIu64 " cycles\n", + tags_[event_handle], + end_ticks_[event_handle] - start_ticks_[event_handle]); + } else { + EventRecord2(event_id_, (int32_t)event_handle, end_ticks_[event_handle] - start_ticks_[event_handle]); + } } -uint64_t EthosUProfiler::GetTotalTicks() const { +uint64_t LayerByLayerProfiler::GetTotalTicks() const { uint64_t ticks = 0; for (size_t i = 0; i < num_events_; ++i) { @@ -100,11 +106,14 @@ uint64_t EthosUProfiler::GetTotalTicks() const { return ticks; } -void EthosUProfiler::Log() const { +void LayerByLayerProfiler::Log() const { + #if !defined(TF_LITE_STRIP_ERROR_STRINGS) - for (int i = 0; i < num_events_; ++i) { - uint64_t ticks = end_ticks_[i] - start_ticks_[i]; - printf("%s took %" PRIu64 " cycles\n", tags_[i], ticks); + if (backend_ == PRINTF) { + for (size_t i = 0; i < num_events_; ++i) { + uint64_t ticks = end_ticks_[i] - start_ticks_[i]; + printf("%s took %" PRIu64 " cycles\n", tags_[i], ticks); + } } #endif } diff --git a/lib/ethosu_monitor/include/RTE_Components.h b/lib/rte_component/include/RTE_Components.h index 97b6624..024f52b 100644 --- a/lib/ethosu_monitor/include/RTE_Components.h +++ b/lib/rte_component/include/RTE_Components.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Arm Limited. All rights reserved. + * Copyright (c) 2020-2021 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #ifndef RTE_COMPONENTS_H #define RTE_COMPONENTS_H |