};
#endif
-void GNADeviceHelper::wait(uint32_t reqId) {
+bool GNADeviceHelper::wait(uint32_t reqId, int64_t millisTimeout) {
#if GNA_LIB_VER == 2
- const auto status = Gna2RequestWait(reqId, GNA_TIMEOUT);
+ const auto status = Gna2RequestWait(reqId, millisTimeout);
+ if (status == Gna2StatusDriverQoSTimeoutExceeded) {
+ return false;
+ }
checkGna2Status(status);
#else
if (isPerformanceMeasuring) {
- nGNAStatus = GNAWaitPerfRes(nGNAHandle, GNA_TIMEOUT, reqId, &nGNAPerfResults);
+ nGNAStatus = GNAWaitPerfRes(nGNAHandle, millisTimeout, reqId, &nGNAPerfResults);
} else {
- nGNAStatus = GNAWait(nGNAHandle, GNA_TIMEOUT, reqId);
+ nGNAStatus = GNAWait(nGNAHandle, millisTimeout, reqId);
}
checkStatus();
#endif
updateGnaPerfCounters();
+ return true;
}
#if GNA_LIB_VER == 1
#define MAX_TIMEOUT 500000
#endif
- const uint32_t GNA_TIMEOUT = MAX_TIMEOUT;
bool isPerformanceMeasuring = false;
bool deviceOpened = false;
public:
static void checkGna2Status(Gna2Status status);
static void checkGna2Status(Gna2Status status, const Gna2Model& gnaModel);
#endif
- void wait(uint32_t id);
+ bool wait(uint32_t id, int64_t millisTimeout = MAX_TIMEOUT);
struct DumpResult {
#if GNA_LIB_VER == 2
void InferImpl() override {
// execute input pre-processing.
execDataPreprocessing(_inputs);
- plg->Infer(_inputs, _outputs);
+ // result returned from sync infer wait method
+ auto result = plg->Infer(_inputs, _outputs);
+
+ // if result is false we are dealing with QoS feature
+ // if result is ok, next call to wait() will return Ok, if request not in gna_queue
+ if (!result) {
+ inferRequestIdx = -1;
+ } else {
+ inferRequestIdx = -2;
+ }
}
/**
if (_callback) {
auto infer_request = _publicInterface.lock();
IE_ASSERT(infer_request != nullptr);
- auto res = Wait(0);
+ auto res = Wait(InferenceEngine::IInferRequest::WaitMode::RESULT_READY);
_callback(infer_request, res);
}
}
+
InferenceEngine::StatusCode Wait(int64_t millis_timeout) override {
if (inferRequestIdx == -1) {
return InferenceEngine::INFER_NOT_STARTED;
THROW_IE_EXCEPTION << PARAMETER_MISMATCH_str;
}
- plg->Wait(inferRequestIdx);
- return InferenceEngine::OK;
+ bool qosOK;
+ if (millis_timeout == InferenceEngine::IInferRequest::WaitMode::RESULT_READY) {
+ qosOK = plg->Wait(inferRequestIdx);
+ } else {
+ qosOK = plg->WaitFor(inferRequestIdx, millis_timeout);
+ }
+
+ if (qosOK) {
+ return InferenceEngine::OK;
+ } else {
+ // need to preserve invalid state here to avoid next Wait() from clearing it
+ inferRequestIdx = -1;
+ return InferenceEngine::INFER_NOT_STARTED;
+ }
}
};
} // namespace GNAPluginNS
return idx;
}
-void GNAPlugin::Wait(uint32_t request_idx) {
+bool GNAPlugin::Wait(uint32_t request_idx) {
+ return WaitFor(request_idx, MAX_TIMEOUT);
+}
+
+bool GNAPlugin::WaitFor(uint32_t request_idx, int64_t millisTimeout) {
#if GNA_LIB_VER == 2
auto& nnets = gnaRequestConfigToRequestIdMap;
#endif
- if (nnets.size() <= request_idx) return; // TODO: GNA2: check whether necessary
+ if (nnets.size() <= request_idx) return true; // TODO: GNA2: check whether necessary
// already synced TODO: might be copy required ???
- if (std::get<1>(nnets[request_idx]) == -1) return;
+ if (std::get<1>(nnets[request_idx]) == -1) return true;
if (gnadevice) {
- gnadevice->wait(std::get<1>(nnets[request_idx]));
+ if (!gnadevice->wait(std::get<1>(nnets[request_idx]), millisTimeout)) {
+ std::get<1>(nnets[request_idx]) = -1;
+ return false;
+ }
}
std::get<1>(nnets[request_idx]) = -1;
}
output_idx++;
}
+ return true;
}
void GNAPlugin::Reset() {
graphCompiler.Reset();
}
-void GNAPlugin::Infer(const InferenceEngine::Blob &input, InferenceEngine::Blob &output) {
+bool GNAPlugin::Infer(const InferenceEngine::Blob &input, InferenceEngine::Blob &output) {
BlobMap bmInput;
BlobMap bmOutput;
if (inputsDataMap.size() != 1) {
bmInput[inputsDataMap.begin()->first] = std::shared_ptr<Blob>(const_cast<Blob*>(&input), [](Blob*){});
IE_ASSERT(!outputsDataMap.empty());
bmOutput[outputsDataMap.begin()->first] = std::shared_ptr<Blob>(&output, [](Blob*){});
- Infer(bmInput, bmOutput);
+ return Infer(bmInput, bmOutput);
}
-void GNAPlugin::Infer(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result) {
- Wait(QueueInference(input, result));
+bool GNAPlugin::Infer(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result) {
+ return Wait(QueueInference(input, result));
}
Blob::Ptr GNAPlugin::GetOutputBlob(const std::string& name, InferenceEngine::Precision precision) {
void LoadNetwork(InferenceEngine::ICNNNetwork &network);
- void Infer(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result);
+ bool Infer(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result);
void GetPerformanceCounts(std::map<std::string, InferenceEngine::InferenceEngineProfileInfo> &perfMap);
void AddExtension(InferenceEngine::IExtensionPtr extension) override;
InferenceEngine::ExecutableNetwork LoadNetwork(const InferenceEngine::ICNNNetwork &network,
const std::map<std::string, std::string> &config_map,
InferenceEngine::RemoteContext::Ptr context) override { THROW_GNA_EXCEPTION << "Not implemented"; }
- void Infer(const InferenceEngine::Blob &input, InferenceEngine::Blob &result);
+ bool Infer(const InferenceEngine::Blob &input, InferenceEngine::Blob &result);
void SetCore(InferenceEngine::ICore*) noexcept override {}
InferenceEngine::ICore* GetCore() const noexcept override {return nullptr;}
void Reset();
const std::map<std::string, std::string>& config,
InferenceEngine::QueryNetworkResult &res) const override;
uint32_t QueueInference(const InferenceEngine::BlobMap &input, InferenceEngine::BlobMap &result);
- void Wait(uint32_t idx = 0);
+ bool Wait(uint32_t idx);
+ bool WaitFor(uint32_t idx, int64_t millisTimeout);
InferenceEngine::Parameter GetConfig(const std::string& name,
const std::map<std::string, InferenceEngine::Parameter> & options) const override;