From fac9d70abfb1465da53d9574173f19f235ee6d02 Mon Sep 17 00:00:00 2001 From: Tiezhen WANG <wangtz@google.com> Date: Thu, 30 May 2019 06:24:46 -0700 Subject: [PATCH] TFL micro: map inputs/outputs_array from FlatBuffer. FlatBuffer int vector has the same memory layout as TfLiteIntArray so there is no need to copy the data over. It also makes the TFL memory layout more concise and solves the problem of unknown inputs size. Quoting from FlatBuffer docs: Vectors are stored as contiguous aligned scalar elements prefixed by a 32bit element count (not including any null termination). http://google.github.io/flatbuffers/flatbuffers_internals.html PiperOrigin-RevId: 250676930 --- .../experimental/micro/micro_interpreter.cc | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/tensorflow/lite/experimental/micro/micro_interpreter.cc b/tensorflow/lite/experimental/micro/micro_interpreter.cc index fdf800c1a5f..49d47d0353c 100644 --- a/tensorflow/lite/experimental/micro/micro_interpreter.cc +++ b/tensorflow/lite/experimental/micro/micro_interpreter.cc @@ -238,31 +238,11 @@ TfLiteStatus MicroInterpreter::Invoke() { user_data = registration->init(&context_, init_data, init_data_size); } - const int kMaxInputs = 16; - int inputs_data[kMaxInputs + 1]; - TfLiteIntArray* inputs_array = - reinterpret_cast<TfLiteIntArray*>(inputs_data); - if (op->inputs()->size() >= kMaxInputs) { - error_reporter_->Report("Too many inputs (%d)\n", op->inputs()->size()); - return kTfLiteError; - } - inputs_array->size = op->inputs()->size(); - for (int n = 0; n < op->inputs()->size(); ++n) { - inputs_array->data[n] = op->inputs()->Get(n); - } - - const int kMaxOutputs = 16; - int outputs_data[kMaxOutputs + 1]; - TfLiteIntArray* outputs_array = - reinterpret_cast<TfLiteIntArray*>(outputs_data); - if (op->outputs()->size() >= kMaxOutputs) { - error_reporter_->Report("Too many outputs (%d)\n", op->outputs()->size()); - return kTfLiteError; - } - outputs_array->size = op->outputs()->size(); - for (int n = 0; n < op->outputs()->size(); ++n) { - outputs_array->data[n] = op->outputs()->Get(n); - } + // Disregard const qualifier to workaround with existing API. + TfLiteIntArray* inputs_array = const_cast<TfLiteIntArray*>( + reinterpret_cast<const TfLiteIntArray*>(op->inputs())); + TfLiteIntArray* outputs_array = const_cast<TfLiteIntArray*>( + reinterpret_cast<const TfLiteIntArray*>(op->outputs())); const int kMaxTemporaries = 16; int temporaries_data[kMaxTemporaries + 1];