diff options
author | Mikael Olsson <mikael.olsson@arm.com> | 2023-12-13 09:57:42 +0100 |
---|---|---|
committer | Mikael Olsson <mikael.olsson@arm.com> | 2023-12-15 14:08:16 +0100 |
commit | 918cd906a3f3d2b130a5a3c551d795cf43150f1c (patch) | |
tree | 3ee2ae1e10408d039b75500b3b9351c39958fced /applications | |
parent | 1575e51075da805e6a85796c007f3c6eb5697d1e (diff) | |
download | ethos-u-core-platform-918cd906a3f3d2b130a5a3c551d795cf43150f1c.tar.gz |
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 <mikael.olsson@arm.com>
Diffstat (limited to 'applications')
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 <open-source-office@arm.com> -# # 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 $<$<TARGET_EXISTS:ethosu_core_driver>: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 <open-source-office@arm.com> - * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may @@ -25,6 +24,7 @@ #include <cstdlib> #include <ethosu_log.h> +#include <ethosu_profiler.hpp> #if defined(ETHOSU) #include <ethosu_driver.h> @@ -32,6 +32,17 @@ #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<void *>(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<EthosU::ethosu_core_msg_inference_rsp *>(userArg); + auto context = static_cast<JobContext *>(userArg); + auto &response = context->rsp->rpmsg.inf_rsp; // Calculate maximum number of events const int numEvents = std::min(static_cast<int>(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<ethosu_pmu_event_type>(response->pmu_event_config[i])); + ETHOSU_PMU_Set_EVTYPER(drv, i, static_cast<ethosu_pmu_event_type>(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<EthosU::ethosu_core_msg_inference_rsp *>(userArg); + LOG_DEBUG(""); + + auto context = static_cast<JobContext *>(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 <open-source-office@arm.com> - * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may @@ -27,6 +26,12 @@ #include <inference_process.hpp> /***************************************************************************** + * 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; |