Support Strided Slice Ex on nnapi_delegate.cc (#1399)
author이춘석/동작제어Lab(SR)/Senior Engineer/삼성전자 <chunseok.lee@samsung.com>
Wed, 30 May 2018 01:30:28 +0000 (10:30 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 30 May 2018 01:30:28 +0000 (10:30 +0900)
* Support Strided Slice Ex on nnapi_delegate.cc

Add Strided Slice Ex conversion to nnapi_delegate.cc
Note that stride_slide on nn runtime does not support 2 parameters : ellipsis_mask
and new_axis_mask.

Signed-off-by: Chunseok Lee <chunseok.lee@samsung.com>
* add CHECK_NN, remove break

libs/support/tflite/src/nnapi_delegate.cpp
libs/support/tflite/src/nnapi_delegate_ex_AddOpsAndParams_lambda.inc

index 59e109c..7e072e1 100644 (file)
@@ -17,6 +17,7 @@ limitations under the License.
 // NOTE This code is derived from the following file (in TensorFlow)
 //        'externals/tensorflow/tensorflow/contrib/lite/nnapi_delegate.cc'
 #include "NeuralNetworksShim.h"
+#include "NeuralNetworksExShim.h"
 #include "support/tflite/nnapi_delegate.h"
 
 #include "tensorflow/contrib/lite/builtin_op_data.h"
@@ -310,6 +311,17 @@ void AddOpsAndParams(tflite::Interpreter *interpreter, ANeuralNetworksModel *nn_
         nn_op_type = ANEURALNETWORKS_LSTM;
         break;
       }
+      case tflite::BuiltinOperator_STRIDED_SLICE:
+        add_strided_slice_ex_params(node.builtin_data);
+        nn_op_type = ANEURALNETWORKS_STRIDED_SLICE_EX;
+        // FIXME: This call is ugly. please fix this
+        // Use ANN_addOperationEx for STRIDED_SLICE
+        CHECK_NN(ANeuralNetworksModel_addOperationEx(
+            nn_model, static_cast<ANeuralNetworksOperationTypeEx>(ANEURALNETWORKS_STRIDED_SLICE_EX),
+            static_cast<uint32_t>(augmented_inputs.size()), augmented_inputs.data(),
+            static_cast<uint32_t>(node.outputs->size),
+            reinterpret_cast<uint32_t *>(node.outputs->data)));
+        continue;
       case tflite::BuiltinOperator_CONCAT_EMBEDDINGS:
       case tflite::BuiltinOperator_LSH_PROJECTION:
       case tflite::BuiltinOperator_SVDF:
@@ -335,7 +347,6 @@ void AddOpsAndParams(tflite::Interpreter *interpreter, ANeuralNetworksModel *nn_
       case tflite::BuiltinOperator_MEAN:
       case tflite::BuiltinOperator_SPLIT:
       case tflite::BuiltinOperator_SQUEEZE:
-      case tflite::BuiltinOperator_STRIDED_SLICE:
       case tflite::BuiltinOperator_EXP:
       case tflite::BuiltinOperator_LOG_SOFTMAX:
       case tflite::BuiltinOperator_DEQUANTIZE:
index cca9b14..126ab71 100644 (file)
       add_scalar_int32(height);
       add_scalar_int32(width);
     };
+
+    auto add_strided_slice_ex_params = [&add_scalar_int32](void* data) {
+      auto builtin = reinterpret_cast<TfLiteStridedSliceParams*>(data);
+      add_scalar_int32(builtin->begin_mask);
+      add_scalar_int32(builtin->end_mask);
+      // ellipsis_mask and new_axis_mask are not supported on nn runtime
+      // cf) tflite interpreter supports both operations
+      if (builtin->ellipsis_mask) {
+        FATAL("STRIDE_SLICE does not support ellipsis_mask in NNAPI");
+      }
+      if (builtin->new_axis_mask) {
+        FATAL("STRIDE_SLICE does not support new_axis_mask in NNAPI");
+      }
+      add_scalar_int32(builtin->shrink_axis_mask);
+    };