Receive output tensor buffers for the inference
authorInki Dae <inki.dae@samsung.com>
Fri, 14 Feb 2020 04:24:09 +0000 (13:24 +0900)
committerInki Dae <inki.dae@samsung.com>
Fri, 14 Feb 2020 04:24:09 +0000 (13:24 +0900)
This patch receives tensor buffers allocated by upper layer
and makes them to be used for the inference.

As for this, it implements GetOutputTensorBuffers callback.

Change-Id: Ic8a3978205b38de0b1b93cd61b6fec4e98c62f3a
Signed-off-by: Inki Dae <inki.dae@samsung.com>
src/inference_engine_armnn.cpp
src/inference_engine_armnn_private.h

index 30eeff115d2e610f5e414243443d3274f513b401..c29384dc7f9b7206b26127933451b5812d9f6137 100644 (file)
@@ -221,13 +221,25 @@ int InferenceARMNN::GetInputTensorBuffers(std::vector<inference_engine_tensor_bu
 {
     LOGI("ENTER");
 
-    // Upper layer will allocate input tensor buffer/buffers. 
+    // Upper layer will allocate input tensor buffer/buffers.
 
     LOGI("LEAVE");
 
     return INFERENCE_ENGINE_ERROR_NONE;
 }
 
+int InferenceARMNN::GetOutputTensorBuffers(std::vector<inference_engine_tensor_buffer> &buffers)
+{
+    LOGI("ENTER");
+
+    // Upper layer will allocate output tensor buffer/buffers.
+
+    LOGI("LEAVE");
+
+    return INFERENCE_ENGINE_ERROR_NONE;
+}
+
+
 int InferenceARMNN::GetInputLayerProperty(inference_engine_layer_property &property)
 {
     LOGI("ENTER");
@@ -303,7 +315,8 @@ int InferenceARMNN::GetBackendCapacity(inference_engine_capacity *capacity)
     return INFERENCE_ENGINE_ERROR_NONE;
 }
 
-int InferenceARMNN::Run(std::vector<inference_engine_tensor_buffer> &input_buffers)
+int InferenceARMNN::Run(std::vector<inference_engine_tensor_buffer> &input_buffers,
+                        std::vector<inference_engine_tensor_buffer> &output_buffers)
 {
     LOGI("ENTER");
 
@@ -324,18 +337,11 @@ int InferenceARMNN::Run(std::vector<inference_engine_tensor_buffer> &input_buffe
 
     // TODO. consider mutiple input and output.
 
-    void *outputData = AllocateTensorBuffer((armnn::DataType)outputTensorInfo.GetDataType(),
-        tensor_size);
-    if (outputData == nullptr) {
-        LOGE("Fail to allocate tensor buffer.");
-        return INFERENCE_ENGINE_ERROR_OUT_OF_MEMORY;
-    }
-
-    armnn::Tensor output_tensor(outputTensorInfo, outputData);
+    armnn::Tensor output_tensor(outputTensorInfo, output_buffers.front().buffer);
     armnn::Tensor input_tensor(inputTensorInfo, input_buffers.front().buffer);
 
-    mOutputTensor.clear();
-    mOutputTensor.push_back(output_tensor);
+    std::vector<armnn::Tensor> OutputTensors;
+    OutputTensors.push_back(output_tensor);
 
     std::vector<armnn::Tensor> InputTensors;
     InputTensors.push_back(input_tensor);
@@ -344,7 +350,7 @@ int InferenceARMNN::Run(std::vector<inference_engine_tensor_buffer> &input_buffe
     armnn::OutputTensors output_tensors;
 
     input_tensors.push_back({mInputBindingInfo[0].first, InputTensors.front()});
-    output_tensors.push_back({mOutputBindingInfo[0].first, mOutputTensor.front()});
+    output_tensors.push_back({mOutputBindingInfo[0].first, OutputTensors.front()});
 
     armnn::Status ret = mRuntime->EnqueueWorkload(mNetworkIdentifier,
                                                   input_tensors, output_tensors);
@@ -360,19 +366,6 @@ int InferenceARMNN::GetInferenceResult(tensor_t& results)
 {
     LOGI("ENTER");
 
-    armnn::Tensor output_tensor = mOutputTensor.front();
-    armnn::TensorShape shape = output_tensor.GetShape();
-
-    std::vector<int> tmpDimInfo;
-    for (int i = 0; i < (int)output_tensor.GetNumDimensions(); i++) {
-        tmpDimInfo.push_back(shape[i]);
-    }
-
-    results.dimInfo.push_back(tmpDimInfo);
-    results.data.push_back((void *)output_tensor.GetMemoryArea());
-
-    // TODO. when should output_tensor buffer be released?
-
     LOGI("LEAVE");
 
     return INFERENCE_ENGINE_ERROR_NONE;
index ece87bdc34ac68e4577b7323622d6a81b2998073..645b538b6d560780ef743d28a385c64a2f511a49 100644 (file)
@@ -53,13 +53,16 @@ public:
 
     int GetInputTensorBuffers(std::vector<inference_engine_tensor_buffer> &buffers) override;
 
+    int GetOutputTensorBuffers(std::vector<inference_engine_tensor_buffer> &buffers) override;
+
     int GetInputLayerProperty(inference_engine_layer_property &property) override;
 
     int GetOutputLayerProperty(inference_engine_layer_property &property) override;
 
     int GetBackendCapacity(inference_engine_capacity *capacity) override;
 
-    int Run(std::vector<inference_engine_tensor_buffer> &input_buffers) override;
+    int Run(std::vector<inference_engine_tensor_buffer> &input_buffers,
+            std::vector<inference_engine_tensor_buffer> &output_buffers) override;
 
     int GetInferenceResult(tensor_t& results) override;
 
@@ -79,8 +82,6 @@ private:
 
     std::vector<armnn::BindingPointInfo> mInputBindingInfo;
     std::vector<armnn::BindingPointInfo> mOutputBindingInfo;
-
-    std::vector<armnn::Tensor> mOutputTensor;
 };
 
 } /* InferenceEngineImpl */