From 82d225899bd3d4fd07d70cac80f50c1b288dc4a3 Mon Sep 17 00:00:00 2001 From: Davide Grohmann Date: Mon, 25 Apr 2022 12:52:38 +0200 Subject: Add support for rejected inference responses Change-Id: I62e13df69c712ed4cf70766429b4cb13fc9c9dcb --- driver_library/include/ethosu.hpp | 11 +++++++- driver_library/src/ethosu.cpp | 29 +++++++++++++++++-- kernel/ethosu_core_interface.h | 4 ++- kernel/ethosu_inference.c | 44 ++++++++++++++++++----------- kernel/uapi/ethosu.h | 4 ++- utils/inference_runner/inference_runner.cpp | 7 +++-- 6 files changed, 75 insertions(+), 24 deletions(-) diff --git a/driver_library/include/ethosu.hpp b/driver_library/include/ethosu.hpp index a12d668..61e2bc5 100644 --- a/driver_library/include/ethosu.hpp +++ b/driver_library/include/ethosu.hpp @@ -180,6 +180,15 @@ private: std::vector ofmDims; }; +enum class InferenceStatus { + OK, + ERROR, + RUNNING, + REJECTED, +}; + +std::ostream &operator<<(std::ostream &out, const InferenceStatus &v); + class Inference { public: template @@ -220,7 +229,7 @@ public: int wait(int64_t timeoutNanos = -1) const; const std::vector getPmuCounters() const; uint64_t getCycleCounter() const; - bool failed() const; + InferenceStatus status() const; int getFd() const; const std::shared_ptr getNetwork() const; std::vector> &getIfmBuffers(); diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp index 2b1da45..0da30c3 100644 --- a/driver_library/src/ethosu.cpp +++ b/driver_library/src/ethosu.cpp @@ -330,6 +330,20 @@ size_t Network::getOfmSize() const { * Inference ****************************************************************************/ +ostream &operator<<(ostream &out, const InferenceStatus &status) { + switch (status) { + case InferenceStatus::OK: + return out << "ok"; + case InferenceStatus::ERROR: + return out << "error"; + case InferenceStatus::RUNNING: + return out << "running"; + case InferenceStatus::REJECTED: + return out << "rejected"; + } + throw Exception("Unknown inference status"); +} + Inference::~Inference() noexcept(false) { eclose(fd); } @@ -395,12 +409,23 @@ int Inference::wait(int64_t timeoutNanos) const { return eppoll(&pfd, 1, &tmo_p, NULL); } -bool Inference::failed() const { +InferenceStatus Inference::status() const { ethosu_uapi_result_status uapi; eioctl(fd, ETHOSU_IOCTL_INFERENCE_STATUS, static_cast(&uapi)); - return uapi.status != ETHOSU_UAPI_STATUS_OK; + switch (uapi.status) { + case ETHOSU_UAPI_STATUS_OK: + return InferenceStatus::OK; + case ETHOSU_UAPI_STATUS_ERROR: + return InferenceStatus::ERROR; + case ETHOSU_UAPI_STATUS_RUNNING: + return InferenceStatus::RUNNING; + case ETHOSU_UAPI_STATUS_REJECTED: + return InferenceStatus::REJECTED; + } + + throw Exception("Unknown inference status"); } const std::vector Inference::getPmuCounters() const { diff --git a/kernel/ethosu_core_interface.h b/kernel/ethosu_core_interface.h index 5a6e55d..76fe35e 100644 --- a/kernel/ethosu_core_interface.h +++ b/kernel/ethosu_core_interface.h @@ -95,7 +95,9 @@ struct ethosu_core_queue { */ enum ethosu_core_status { ETHOSU_CORE_STATUS_OK, - ETHOSU_CORE_STATUS_ERROR + ETHOSU_CORE_STATUS_ERROR, + ETHOSU_CORE_STATUS_RUNNING, + ETHOSU_CORE_STATUS_REJECTED, }; /** diff --git a/kernel/ethosu_inference.c b/kernel/ethosu_inference.c index 3c18bbd..73a8c06 100644 --- a/kernel/ethosu_inference.c +++ b/kernel/ethosu_inference.c @@ -70,6 +70,12 @@ static const char *status_to_string(const enum ethosu_uapi_status status) case ETHOSU_UAPI_STATUS_ERROR: { return "Error"; } + case ETHOSU_UAPI_STATUS_RUNNING: { + return "Running"; + } + case ETHOSU_UAPI_STATUS_REJECTED: { + return "Rejected"; + } default: { return "Unknown"; } @@ -93,6 +99,8 @@ static int ethosu_inference_send(struct ethosu_inference *inf) if (ret) return ret; + inf->status = ETHOSU_UAPI_STATUS_RUNNING; + ethosu_inference_get(inf); return 0; @@ -412,29 +420,33 @@ void ethosu_inference_rsp(struct ethosu_device *edev, if (ret) inf->status = ETHOSU_UAPI_STATUS_ERROR; } + } else if (rsp->status == ETHOSU_CORE_STATUS_REJECTED) { + inf->status = ETHOSU_UAPI_STATUS_REJECTED; } else { inf->status = ETHOSU_UAPI_STATUS_ERROR; } - for (i = 0; i < ETHOSU_CORE_PMU_MAX; i++) { - inf->pmu_event_config[i] = rsp->pmu_event_config[i]; - inf->pmu_event_count[i] = rsp->pmu_event_count[i]; - } + if (inf->status == ETHOSU_UAPI_STATUS_OK) { + for (i = 0; i < ETHOSU_CORE_PMU_MAX; i++) { + inf->pmu_event_config[i] = rsp->pmu_event_config[i]; + inf->pmu_event_count[i] = rsp->pmu_event_count[i]; + } - inf->pmu_cycle_counter_enable = rsp->pmu_cycle_counter_enable; - inf->pmu_cycle_counter_count = rsp->pmu_cycle_counter_count; + inf->pmu_cycle_counter_enable = rsp->pmu_cycle_counter_enable; + inf->pmu_cycle_counter_count = rsp->pmu_cycle_counter_count; - dev_info(edev->dev, - "PMU events. config=[%u, %u, %u, %u], count=[%u, %u, %u, %u]\n", - inf->pmu_event_config[0], inf->pmu_event_config[1], - inf->pmu_event_config[2], inf->pmu_event_config[3], - inf->pmu_event_count[0], inf->pmu_event_count[1], - inf->pmu_event_count[2], inf->pmu_event_count[3]); + dev_info(edev->dev, + "PMU events. config=[%u, %u, %u, %u], count=[%u, %u, %u, %u]\n", + inf->pmu_event_config[0], inf->pmu_event_config[1], + inf->pmu_event_config[2], inf->pmu_event_config[3], + inf->pmu_event_count[0], inf->pmu_event_count[1], + inf->pmu_event_count[2], inf->pmu_event_count[3]); - dev_info(edev->dev, - "PMU cycle counter. enable=%u, count=%llu\n", - inf->pmu_cycle_counter_enable, - inf->pmu_cycle_counter_count); + dev_info(edev->dev, + "PMU cycle counter. enable=%u, count=%llu\n", + inf->pmu_cycle_counter_enable, + inf->pmu_cycle_counter_count); + } inf->done = true; wake_up_interruptible(&inf->waitq); diff --git a/kernel/uapi/ethosu.h b/kernel/uapi/ethosu.h index fda7fc2..4627cb9 100644 --- a/kernel/uapi/ethosu.h +++ b/kernel/uapi/ethosu.h @@ -75,7 +75,9 @@ namespace EthosU { */ enum ethosu_uapi_status { ETHOSU_UAPI_STATUS_OK, - ETHOSU_UAPI_STATUS_ERROR + ETHOSU_UAPI_STATUS_ERROR, + ETHOSU_UAPI_STATUS_RUNNING, + ETHOSU_UAPI_STATUS_REJECTED, }; /** diff --git a/utils/inference_runner/inference_runner.cpp b/utils/inference_runner/inference_runner.cpp index b6a5cdb..21e133c 100644 --- a/utils/inference_runner/inference_runner.cpp +++ b/utils/inference_runner/inference_runner.cpp @@ -254,17 +254,18 @@ int main(int argc, char *argv[]) { int ofmIndex = 0; for (auto &inference : inferences) { + cout << "Inference status: " << inference->status() << endl; /* make sure the wait completes ok */ try { + cout << "Wait for inference" << endl; inference->wait(timeout); } catch (std::exception &e) { cout << "Failed to wait for inference completion: " << e.what() << endl; exit(1); } - string status = inference->failed() ? "failed" : "success"; - cout << "Inference status: " << status << endl; + cout << "Inference status: " << inference->status() << endl; string ofmFilename = ofmArg + "." + to_string(ofmIndex); ofstream ofmStream(ofmFilename, ios::binary); @@ -273,7 +274,7 @@ int main(int argc, char *argv[]) { exit(1); } - if (!inference->failed()) { + if (inference->status() == InferenceStatus::OK) { /* The inference completed and has ok status */ for (auto &ofmBuffer : inference->getOfmBuffers()) { cout << "OFM size: " << ofmBuffer->size() << endl; -- cgit v1.2.1