aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler/message_handler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'applications/message_handler/message_handler.cpp')
-rw-r--r--applications/message_handler/message_handler.cpp85
1 files changed, 63 insertions, 22 deletions
diff --git a/applications/message_handler/message_handler.cpp b/applications/message_handler/message_handler.cpp
index f9f7304..585d63c 100644
--- a/applications/message_handler/message_handler.cpp
+++ b/applications/message_handler/message_handler.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2020-2022 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -22,6 +22,7 @@
#ifdef ETHOSU
#include <ethosu_driver.h>
+#include <pmu_ethosu.h>
#endif
#include "FreeRTOS.h"
@@ -150,12 +151,12 @@ bool IncomingMessageHandler::handleMessage() {
break;
}
- printf("Msg: InferenceReq. user_arg=0x%" PRIx64 ", network={0x%" PRIx32 ", %" PRIu32 "}\n",
+ printf("Msg: InferenceReq. user_arg=0x%" PRIx64 ", network={0x%" PRIx32 ", %" PRIu32 "}, \n",
inference.user_arg,
inference.network.ptr,
inference.network.size);
- printf(", ifm_count=%" PRIu32 ", ifm=[", inference.ifm_count);
+ printf("ifm_count=%" PRIu32 ", ifm=[", inference.ifm_count);
for (uint32_t i = 0; i < inference.ifm_count; ++i) {
if (i > 0) {
printf(", ");
@@ -223,6 +224,9 @@ void InferenceHandler::run() {
}
void InferenceHandler::runInference(ethosu_core_inference_req &req, ethosu_core_inference_rsp &rsp) {
+ currentReq = &req;
+ currentRsp = &rsp;
+
/*
* Setup inference job
*/
@@ -239,15 +243,7 @@ void InferenceHandler::runInference(ethosu_core_inference_req &req, ethosu_core_
ofm.push_back(InferenceProcess::DataPtr(reinterpret_cast<void *>(req.ofm[i].ptr), req.ofm[i].size));
}
- std::vector<InferenceProcess::DataPtr> expectedOutput;
-
- std::vector<uint8_t> pmuEventConfig(ETHOSU_CORE_PMU_MAX);
- for (uint32_t i = 0; i < ETHOSU_CORE_PMU_MAX; i++) {
- pmuEventConfig[i] = req.pmu_event_config[i];
- }
-
- InferenceProcess::InferenceJob job(
- "job", networkModel, ifm, ofm, expectedOutput, -1, pmuEventConfig, req.pmu_cycle_counter_enable);
+ InferenceProcess::InferenceJob job("job", networkModel, ifm, ofm, {}, -1, this);
/*
* Run inference
@@ -269,16 +265,8 @@ void InferenceHandler::runInference(ethosu_core_inference_req &req, ethosu_core_
rsp.ofm_size[i] = job.output[i].size;
}
- for (size_t i = 0; i < job.pmuEventConfig.size(); i++) {
- rsp.pmu_event_config[i] = job.pmuEventConfig[i];
- }
-
- for (size_t i = 0; i < job.pmuEventCount.size(); i++) {
- rsp.pmu_event_count[i] = job.pmuEventCount[i];
- }
-
- rsp.pmu_cycle_counter_enable = job.pmuCycleCounterEnable;
- rsp.pmu_cycle_counter_count = job.pmuCycleCounterCount;
+ currentReq = nullptr;
+ currentRsp = nullptr;
}
/****************************************************************************
@@ -404,3 +392,56 @@ void OutgoingMessageHandler::readCapabilties(ethosu_core_msg_capabilities_rsp &r
}
} // namespace MessageHandler
+
+extern "C" void ethosu_inference_begin(struct ethosu_driver *drv, void *userArg) {
+ MessageHandler::InferenceHandler *self = static_cast<MessageHandler::InferenceHandler *>(userArg);
+
+ // Calculate maximum number of events
+ const int numEvents = std::min(static_cast<int>(ETHOSU_PMU_Get_NumEventCounters()), ETHOSU_CORE_PMU_MAX);
+
+ // Enable PMU
+ ETHOSU_PMU_Enable(drv);
+
+ // Configure and enable events
+ for (int i = 0; i < numEvents; i++) {
+ ETHOSU_PMU_Set_EVTYPER(drv, i, static_cast<ethosu_pmu_event_type>(self->currentReq->pmu_event_config[i]));
+ ETHOSU_PMU_CNTR_Enable(drv, 1 << i);
+ }
+
+ // Enable cycle counter
+ if (self->currentReq->pmu_cycle_counter_enable) {
+ ETHOSU_PMU_CNTR_Enable(drv, ETHOSU_PMU_CCNT_Msk);
+ ETHOSU_PMU_CYCCNT_Reset(drv);
+ }
+
+ // Reset all counters
+ ETHOSU_PMU_EVCNTR_ALL_Reset(drv);
+}
+
+extern "C" void ethosu_inference_end(struct ethosu_driver *drv, void *userArg) {
+ MessageHandler::InferenceHandler *self = static_cast<MessageHandler::InferenceHandler *>(userArg);
+
+ // Get cycle counter
+ self->currentRsp->pmu_cycle_counter_enable = self->currentReq->pmu_cycle_counter_enable;
+ if (self->currentReq->pmu_cycle_counter_enable) {
+ self->currentRsp->pmu_cycle_counter_count = ETHOSU_PMU_Get_CCNTR(drv);
+ }
+
+ // Calculate maximum number of events
+ const int numEvents = std::min(static_cast<int>(ETHOSU_PMU_Get_NumEventCounters()), ETHOSU_CORE_PMU_MAX);
+
+ // Get event counters
+ int i;
+ for (i = 0; i < numEvents; i++) {
+ self->currentRsp->pmu_event_config[i] = self->currentReq->pmu_event_config[i];
+ self->currentRsp->pmu_event_count[i] = ETHOSU_PMU_Get_EVCNTR(drv, i);
+ }
+
+ for (; i < ETHOSU_CORE_PMU_MAX; i++) {
+ self->currentRsp->pmu_event_config[i] = 0;
+ self->currentRsp->pmu_event_count[i] = 0;
+ }
+
+ // Disable PMU
+ ETHOSU_PMU_Disable(drv);
+}