From a14e12ee63dd69552bc9acf70db81e0cf82736f8 Mon Sep 17 00:00:00 2001 From: Krzysztof Bruniecki Date: Mon, 28 Sep 2020 09:22:23 +0200 Subject: [PATCH] Return REQUEST_NOT_READY if GNA Wait returns busy status (#2401) * Return REQUEST_NOT_READY if GNA Wait returns busy status * Apply fixes from review --- inference-engine/src/gna_plugin/gna_device.cpp | 9 ++++++--- inference-engine/src/gna_plugin/gna_device.hpp | 7 ++++++- inference-engine/src/gna_plugin/gna_infer_request.hpp | 15 ++++++++------- inference-engine/src/gna_plugin/gna_plugin.cpp | 19 ++++++++++++------- inference-engine/src/gna_plugin/gna_plugin.hpp | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/inference-engine/src/gna_plugin/gna_device.cpp b/inference-engine/src/gna_plugin/gna_device.cpp index 52fe936..97d4026 100644 --- a/inference-engine/src/gna_plugin/gna_device.cpp +++ b/inference-engine/src/gna_plugin/gna_device.cpp @@ -272,11 +272,14 @@ const std::map , const std::string> }; #endif -bool GNADeviceHelper::wait(uint32_t reqId, int64_t millisTimeout) { +GnaWaitStatus GNADeviceHelper::wait(uint32_t reqId, int64_t millisTimeout) { #if GNA_LIB_VER == 2 const auto status = Gna2RequestWait(reqId, millisTimeout); if (status == Gna2StatusDriverQoSTimeoutExceeded) { - return false; + return GNA_REQUEST_ABORTED; + } + if (status == Gna2StatusWarningDeviceBusy) { + return GNA_REQUEST_PENDING; } checkGna2Status(status); unwaitedRequestIds.erase(std::remove(unwaitedRequestIds.begin(), unwaitedRequestIds.end(), reqId)); @@ -289,7 +292,7 @@ bool GNADeviceHelper::wait(uint32_t reqId, int64_t millisTimeout) { checkStatus(); #endif updateGnaPerfCounters(); - return true; + return GNA_REQUEST_COMPLETED; } #if GNA_LIB_VER == 1 diff --git a/inference-engine/src/gna_plugin/gna_device.hpp b/inference-engine/src/gna_plugin/gna_device.hpp index 1a42922..7b35f3c 100644 --- a/inference-engine/src/gna_plugin/gna_device.hpp +++ b/inference-engine/src/gna_plugin/gna_device.hpp @@ -27,6 +27,11 @@ #include "gna-api-instrumentation.h" #endif +enum GnaWaitStatus : int { + GNA_REQUEST_COMPLETED = 0, // and removed from GNA library queue + GNA_REQUEST_ABORTED = 1, // for QoS purposes + GNA_REQUEST_PENDING = 2 // for device busy purposes +}; /** * holds gna - style handle in RAII way @@ -115,7 +120,7 @@ public: static void checkGna2Status(Gna2Status status); static void checkGna2Status(Gna2Status status, const Gna2Model& gnaModel); #endif - bool wait(uint32_t id, int64_t millisTimeout = MAX_TIMEOUT); + GnaWaitStatus wait(uint32_t id, int64_t millisTimeout = MAX_TIMEOUT); struct DumpResult { #if GNA_LIB_VER == 2 diff --git a/inference-engine/src/gna_plugin/gna_infer_request.hpp b/inference-engine/src/gna_plugin/gna_infer_request.hpp index 5d34db4..defbc16 100644 --- a/inference-engine/src/gna_plugin/gna_infer_request.hpp +++ b/inference-engine/src/gna_plugin/gna_infer_request.hpp @@ -95,20 +95,21 @@ class GNAInferRequest : public InferenceEngine::AsyncInferRequestInternal { THROW_IE_EXCEPTION << PARAMETER_MISMATCH_str; } - bool qosOK; if (millis_timeout == InferenceEngine::IInferRequest::WaitMode::RESULT_READY) { - qosOK = plg->Wait(inferRequestIdx); - } else { - qosOK = plg->WaitFor(inferRequestIdx, millis_timeout); + millis_timeout = MAX_TIMEOUT; } + const auto waitStatus = plg->WaitFor(inferRequestIdx, millis_timeout); - if (qosOK) { - return InferenceEngine::OK; - } else { + if (waitStatus == GNA_REQUEST_PENDING) { + // request is still pending so Wait() is needed once again + return InferenceEngine::RESULT_NOT_READY; + } + if (waitStatus == GNA_REQUEST_ABORTED) { // need to preserve invalid state here to avoid next Wait() from clearing it inferRequestIdx = -1; return InferenceEngine::INFER_NOT_STARTED; } + return InferenceEngine::OK; } }; } // namespace GNAPluginNS diff --git a/inference-engine/src/gna_plugin/gna_plugin.cpp b/inference-engine/src/gna_plugin/gna_plugin.cpp index b9861b8..92b6a69 100644 --- a/inference-engine/src/gna_plugin/gna_plugin.cpp +++ b/inference-engine/src/gna_plugin/gna_plugin.cpp @@ -976,21 +976,26 @@ uint32_t GNAPlugin::QueueInference(const InferenceEngine::BlobMap &inputs, Infer } bool GNAPlugin::Wait(uint32_t request_idx) { - return WaitFor(request_idx, MAX_TIMEOUT); + return GNA_REQUEST_COMPLETED == WaitFor(request_idx, MAX_TIMEOUT); } -bool GNAPlugin::WaitFor(uint32_t request_idx, int64_t millisTimeout) { +GnaWaitStatus GNAPlugin::WaitFor(uint32_t request_idx, int64_t millisTimeout) { #if GNA_LIB_VER == 2 auto& nnets = gnaRequestConfigToRequestIdMap; #endif - if (nnets.size() <= request_idx) return true; // TODO: GNA2: check whether necessary + // TODO: GNA2: check whether necessary + if (nnets.size() <= request_idx) return GNA_REQUEST_COMPLETED; // already synced TODO: might be copy required ??? - if (std::get<1>(nnets[request_idx]) == -1) return true; + if (std::get<1>(nnets[request_idx]) == -1) return GNA_REQUEST_COMPLETED; if (gnadevice) { - if (!gnadevice->wait(std::get<1>(nnets[request_idx]), millisTimeout)) { + const auto waitStatus = gnadevice->wait(std::get<1>(nnets[request_idx]), millisTimeout); + if (waitStatus == GNA_REQUEST_ABORTED) { std::get<1>(nnets[request_idx]) = -1; - return false; + return GNA_REQUEST_ABORTED; + } + if (waitStatus == GNA_REQUEST_PENDING) { + return GNA_REQUEST_PENDING; } } @@ -1090,7 +1095,7 @@ bool GNAPlugin::WaitFor(uint32_t request_idx, int64_t millisTimeout) { output_idx++; } - return true; + return GNA_REQUEST_COMPLETED; } void GNAPlugin::Reset() { diff --git a/inference-engine/src/gna_plugin/gna_plugin.hpp b/inference-engine/src/gna_plugin/gna_plugin.hpp index 54bf674..99eda6c 100644 --- a/inference-engine/src/gna_plugin/gna_plugin.hpp +++ b/inference-engine/src/gna_plugin/gna_plugin.hpp @@ -119,7 +119,7 @@ class GNAPlugin : public InferenceEngine::IInferencePlugin { InferenceEngine::QueryNetworkResult &res) const override; uint32_t QueueInference(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result); bool Wait(uint32_t idx); - bool WaitFor(uint32_t idx, int64_t millisTimeout); + GnaWaitStatus WaitFor(uint32_t idx, int64_t millisTimeout); InferenceEngine::Parameter GetConfig(const std::string& name, const std::map & options) const override; -- 2.7.4