From 918cd906a3f3d2b130a5a3c551d795cf43150f1c Mon Sep 17 00:00:00 2001 From: Mikael Olsson Date: Wed, 13 Dec 2023 09:57:42 +0100 Subject: Update message_handler_openamp to use NPU profiler The message_handler_openamp application now uses the NPU profiler to use a common way to collect profiling data and report it. Change-Id: Ia2a860c790facc5193aca065636c58e1b5bbef22 Signed-off-by: Mikael Olsson --- .../message_handler_openamp/CMakeLists.txt | 2 +- .../message_handler_openamp/inference_runner.cpp | 60 ++++++++++++++++------ .../message_handler_openamp/inference_runner.hpp | 9 +++- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/applications/message_handler_openamp/CMakeLists.txt b/applications/message_handler_openamp/CMakeLists.txt index bc1f4a4..00e7995 100644 --- a/applications/message_handler_openamp/CMakeLists.txt +++ b/applications/message_handler_openamp/CMakeLists.txt @@ -1,6 +1,5 @@ # # SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates -# # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the License); you may @@ -61,6 +60,7 @@ ethosu_add_executable(message_handler_openamp $<$:ethosu_core_driver> ethosu_log ethosu_mailbox + ethosu_profiler freertos_kernel inference_process openamp-freertos) diff --git a/applications/message_handler_openamp/inference_runner.cpp b/applications/message_handler_openamp/inference_runner.cpp index 00e95a9..c290773 100644 --- a/applications/message_handler_openamp/inference_runner.cpp +++ b/applications/message_handler_openamp/inference_runner.cpp @@ -1,6 +1,5 @@ /* * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates - * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may @@ -25,12 +24,24 @@ #include #include +#include #if defined(ETHOSU) #include #include #endif +/***************************************************************************** + * JobContext + *****************************************************************************/ + +struct JobContext { + JobContext(Message *msg) : rsp(msg), profiler_context({}) {} + + Message *rsp; + struct ethosu_profiler_context profiler_context; +}; + /***************************************************************************** * InferenceRunner *****************************************************************************/ @@ -83,9 +94,9 @@ void InferenceRunner::inferenceTask(void *param) { void InferenceRunner::handleInferenceRequest(const uint32_t src, const uint64_t msgId, const EthosU::ethosu_core_msg_inference_req &request) { - auto message = - new Message(src, EthosU::ETHOSU_CORE_MSG_INFERENCE_RSP, msgId, sizeof(EthosU::ethosu_core_msg_inference_rsp)); - auto &response = message->rpmsg.inf_rsp; + auto jobContext = new JobContext( + new Message(src, EthosU::ETHOSU_CORE_MSG_INFERENCE_RSP, msgId, sizeof(EthosU::ethosu_core_msg_inference_rsp))); + auto &response = jobContext->rsp->rpmsg.inf_rsp; // Setup PMU configuration response.pmu_cycle_counter_enable = request.pmu_cycle_counter_enable; @@ -95,9 +106,11 @@ void InferenceRunner::handleInferenceRequest(const uint32_t src, } // Run inference - auto job = makeInferenceJob(request, response); + auto job = makeInferenceJob(request, *jobContext); auto failed = inference.runJob(job); + ethosu_profiler_report(&jobContext->profiler_context); + // Send response rpmsg response.ofm_count = job.output.size(); response.status = failed ? EthosU::ETHOSU_CORE_STATUS_ERROR : EthosU::ETHOSU_CORE_STATUS_OK; @@ -106,11 +119,12 @@ void InferenceRunner::handleInferenceRequest(const uint32_t src, response.ofm_size[i] = job.output[i].size; } - responseQueue.send(message); + responseQueue.send(jobContext->rsp); + delete jobContext; } InferenceProcess::InferenceJob InferenceRunner::makeInferenceJob(const EthosU::ethosu_core_msg_inference_req &request, - EthosU::ethosu_core_msg_inference_rsp &response) { + JobContext &jobContext) { InferenceProcess::InferenceJob job; job.networkModel = @@ -126,7 +140,7 @@ InferenceProcess::InferenceJob InferenceRunner::makeInferenceJob(const EthosU::e InferenceProcess::DataPtr(reinterpret_cast(request.ofm[i].ptr), request.ofm[i].size)); } - job.externalContext = &response; + job.externalContext = &jobContext; return job; } @@ -137,7 +151,8 @@ extern "C" { void ethosu_inference_begin(ethosu_driver *drv, void *userArg) { LOG_DEBUG(""); - auto response = static_cast(userArg); + auto context = static_cast(userArg); + auto &response = context->rsp->rpmsg.inf_rsp; // Calculate maximum number of events const int numEvents = std::min(static_cast(ETHOSU_PMU_Get_NumEventCounters()), ETHOSU_CORE_PMU_MAX); @@ -147,12 +162,12 @@ void ethosu_inference_begin(ethosu_driver *drv, void *userArg) { // Configure and enable events for (int i = 0; i < numEvents; i++) { - ETHOSU_PMU_Set_EVTYPER(drv, i, static_cast(response->pmu_event_config[i])); + ETHOSU_PMU_Set_EVTYPER(drv, i, static_cast(response.pmu_event_config[i])); ETHOSU_PMU_CNTR_Enable(drv, 1u << i); } // Enable cycle counter - if (response->pmu_cycle_counter_enable) { + if (response.pmu_cycle_counter_enable) { ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event(drv, ETHOSU_PMU_NPU_IDLE); ETHOSU_PMU_PMCCNTR_CFG_Set_Start_Event(drv, ETHOSU_PMU_NPU_ACTIVE); @@ -162,14 +177,23 @@ void ethosu_inference_begin(ethosu_driver *drv, void *userArg) { // Reset all counters ETHOSU_PMU_EVCNTR_ALL_Reset(drv); + + ethosu_profiler_start(&context->profiler_context); } void ethosu_inference_end(ethosu_driver *drv, void *userArg) { - auto response = static_cast(userArg); + LOG_DEBUG(""); + + auto context = static_cast(userArg); + auto &response = context->rsp->rpmsg.inf_rsp; + + ethosu_profiler_end(&context->profiler_context); // Get cycle counter - if (response->pmu_cycle_counter_enable) { - response->pmu_cycle_counter_count = ETHOSU_PMU_Get_CCNTR(drv); + if (response.pmu_cycle_counter_enable) { + uint64_t cycleCount = ETHOSU_PMU_Get_CCNTR(drv); + response.pmu_cycle_counter_count = cycleCount; + ethosu_profiler_add_to_pmu_cycles(&context->profiler_context, cycleCount); } // Calculate maximum number of events @@ -178,12 +202,14 @@ void ethosu_inference_end(ethosu_driver *drv, void *userArg) { // Get event counters int i; for (i = 0; i < numEvents; i++) { - response->pmu_event_count[i] = ETHOSU_PMU_Get_EVCNTR(drv, i); + uint32_t eventValue = ETHOSU_PMU_Get_EVCNTR(drv, i); + response.pmu_event_count[i] = eventValue; + ethosu_profiler_add_to_pmu_event(&context->profiler_context, i, eventValue); } for (; i < ETHOSU_CORE_PMU_MAX; i++) { - response->pmu_event_config[i] = 0; - response->pmu_event_count[i] = 0; + response.pmu_event_config[i] = 0; + response.pmu_event_count[i] = 0; } // Disable PMU diff --git a/applications/message_handler_openamp/inference_runner.hpp b/applications/message_handler_openamp/inference_runner.hpp index c9461a0..f87aa7a 100644 --- a/applications/message_handler_openamp/inference_runner.hpp +++ b/applications/message_handler_openamp/inference_runner.hpp @@ -1,6 +1,5 @@ /* * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates - * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may @@ -26,6 +25,12 @@ #include +/***************************************************************************** + * JobContext + *****************************************************************************/ + +struct JobContext; + /***************************************************************************** * InferenceRunner *****************************************************************************/ @@ -45,7 +50,7 @@ private: const uint64_t msgId, const EthosU::ethosu_core_msg_inference_req &request); InferenceProcess::InferenceJob makeInferenceJob(const EthosU::ethosu_core_msg_inference_req &request, - EthosU::ethosu_core_msg_inference_rsp &response); + JobContext &context); MessageHandler::InferenceQueue &inferenceQueue; MessageHandler::ResponseQueue &responseQueue; -- cgit v1.2.1