diff options
author | Davide Grohmann <davide.grohmann@arm.com> | 2022-03-23 12:48:45 +0100 |
---|---|---|
committer | Davide Grohmann <davide.grohmann@arm.com> | 2022-05-05 11:13:04 +0200 |
commit | 7e8f508765632c42cc44fd8ad704c9d90943ab32 (patch) | |
tree | 42dcfb929accf5470d6aa61810da20356c39eb75 /driver_library | |
parent | 82d225899bd3d4fd07d70cac80f50c1b288dc4a3 (diff) | |
download | ethos-u-linux-driver-stack-7e8f508765632c42cc44fd8ad704c9d90943ab32.tar.gz |
Add support for inference cancellation
Send cancel inference messages to the ethosu subsystem to abort
inference execution there. Also mark inference as aborted in the
linux driver stack itself, so pending inference messages are not
resent when resetting the firmware.
Change-Id: I244c2b119fd7995d14e3859815abf2a00c7f0583
Diffstat (limited to 'driver_library')
-rw-r--r-- | driver_library/include/ethosu.hpp | 5 | ||||
-rw-r--r-- | driver_library/src/ethosu.cpp | 18 |
2 files changed, 20 insertions, 3 deletions
diff --git a/driver_library/include/ethosu.hpp b/driver_library/include/ethosu.hpp index 61e2bc5..da8dbbd 100644 --- a/driver_library/include/ethosu.hpp +++ b/driver_library/include/ethosu.hpp @@ -185,6 +185,8 @@ enum class InferenceStatus { ERROR, RUNNING, REJECTED, + ABORTED, + ABORTING, }; std::ostream &operator<<(std::ostream &out, const InferenceStatus &v); @@ -226,9 +228,10 @@ public: virtual ~Inference() noexcept(false); - int wait(int64_t timeoutNanos = -1) const; + bool wait(int64_t timeoutNanos = -1) const; const std::vector<uint32_t> getPmuCounters() const; uint64_t getCycleCounter() const; + bool cancel() const; InferenceStatus status() const; int getFd() const; const std::shared_ptr<Network> getNetwork() const; diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp index 0da30c3..eeb95c2 100644 --- a/driver_library/src/ethosu.cpp +++ b/driver_library/src/ethosu.cpp @@ -340,6 +340,10 @@ ostream &operator<<(ostream &out, const InferenceStatus &status) { return out << "running"; case InferenceStatus::REJECTED: return out << "rejected"; + case InferenceStatus::ABORTED: + return out << "aborted"; + case InferenceStatus::ABORTING: + return out << "aborting"; } throw Exception("Unknown inference status"); } @@ -390,7 +394,7 @@ uint32_t Inference::getMaxPmuEventCounters() { return ETHOSU_PMU_EVENT_MAX; } -int Inference::wait(int64_t timeoutNanos) const { +bool Inference::wait(int64_t timeoutNanos) const { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLIN | POLLERR; @@ -406,7 +410,13 @@ int Inference::wait(int64_t timeoutNanos) const { tmo_p.tv_sec = timeoutNanos / nanosec; tmo_p.tv_nsec = timeoutNanos % nanosec; - return eppoll(&pfd, 1, &tmo_p, NULL); + return eppoll(&pfd, 1, &tmo_p, NULL) == 0; +} + +bool Inference::cancel() const { + ethosu_uapi_cancel_inference_status uapi; + eioctl(fd, ETHOSU_IOCTL_INFERENCE_CANCEL, static_cast<void *>(&uapi)); + return uapi.status == ETHOSU_UAPI_STATUS_OK; } InferenceStatus Inference::status() const { @@ -423,6 +433,10 @@ InferenceStatus Inference::status() const { return InferenceStatus::RUNNING; case ETHOSU_UAPI_STATUS_REJECTED: return InferenceStatus::REJECTED; + case ETHOSU_UAPI_STATUS_ABORTED: + return InferenceStatus::ABORTED; + case ETHOSU_UAPI_STATUS_ABORTING: + return InferenceStatus::ABORTING; } throw Exception("Unknown inference status"); |