diff options
author | Chunseok Lee <chunseok.lee@samsung.com> | 2021-04-20 18:01:41 +0900 |
---|---|---|
committer | Chunseok Lee <chunseok.lee@samsung.com> | 2021-04-20 18:01:41 +0900 |
commit | 589bb1db6db6784efe21b3fbbfbfdb79aaa5f14e (patch) | |
tree | 47a2b23ce4220e3a4150c8b12ed941555272fb0c /runtime/libs | |
parent | 62529acabbafce7730601ed01d5709d7bc0d378a (diff) | |
download | nnfw-589bb1db6db6784efe21b3fbbfbfdb79aaa5f14e.tar.gz nnfw-589bb1db6db6784efe21b3fbbfbfdb79aaa5f14e.tar.bz2 nnfw-589bb1db6db6784efe21b3fbbfbfdb79aaa5f14e.zip |
Imported Upstream version 1.15.0upstream/1.15.0submit/tizen/20210427.093759submit/tizen/20210423.055448submit/tizen/20210422.015846submit/tizen/20210421.062230accepted/tizen/unified/20210428.040443
Diffstat (limited to 'runtime/libs')
l--------- | runtime/libs/.clang-format | 1 | ||||
-rw-r--r-- | runtime/libs/benchmark/src/Phases.cpp | 2 | ||||
-rw-r--r-- | runtime/libs/misc/include/misc/RandomGenerator.h | 1 | ||||
-rw-r--r-- | runtime/libs/misc/src/RandomGenerator.cpp | 28 | ||||
-rw-r--r-- | runtime/libs/profiling/CMakeLists.txt | 1 | ||||
-rw-r--r-- | runtime/libs/rua/anchor/CMakeLists.txt | 1 | ||||
-rw-r--r-- | runtime/libs/rua/dyn/CMakeLists.txt | 1 | ||||
-rw-r--r-- | runtime/libs/tflite/CMakeLists.txt | 1 | ||||
-rw-r--r-- | runtime/libs/tflite/include/tflite/CopyInputInitializer.h | 47 | ||||
-rw-r--r-- | runtime/libs/tflite/include/tflite/OutputResetter.h | 44 | ||||
-rw-r--r-- | runtime/libs/tflite/include/tflite/RandomInputInitializer.h | 49 | ||||
-rw-r--r-- | runtime/libs/tflite/include/tflite/TensorShapeUtils.h | 64 | ||||
-rw-r--r-- | runtime/libs/tflite/src/CopyInputInitializer.cpp | 68 | ||||
-rw-r--r-- | runtime/libs/tflite/src/OutputResetter.cpp | 64 | ||||
-rw-r--r-- | runtime/libs/tflite/src/RandomInputInitializer.cpp | 65 | ||||
-rw-r--r-- | runtime/libs/tflite/src/RandomTestRunner.cpp | 250 | ||||
-rw-r--r-- | runtime/libs/tflite/src/TensorShapeUtils.cpp | 45 |
17 files changed, 384 insertions, 348 deletions
diff --git a/runtime/libs/.clang-format b/runtime/libs/.clang-format deleted file mode 120000 index f761fe4ae..000000000 --- a/runtime/libs/.clang-format +++ /dev/null @@ -1 +0,0 @@ -../../.clang-format.8
\ No newline at end of file diff --git a/runtime/libs/benchmark/src/Phases.cpp b/runtime/libs/benchmark/src/Phases.cpp index 897b943d3..76993f266 100644 --- a/runtime/libs/benchmark/src/Phases.cpp +++ b/runtime/libs/benchmark/src/Phases.cpp @@ -42,7 +42,7 @@ void SleepForMicros(uint64_t micros) sleep_time.tv_nsec = micros * 1e3; nanosleep(&sleep_time, nullptr); } -} +} // namespace namespace benchmark { diff --git a/runtime/libs/misc/include/misc/RandomGenerator.h b/runtime/libs/misc/include/misc/RandomGenerator.h index 8d26b8c74..8da4f7f20 100644 --- a/runtime/libs/misc/include/misc/RandomGenerator.h +++ b/runtime/libs/misc/include/misc/RandomGenerator.h @@ -76,6 +76,7 @@ private: std::normal_distribution<float> _dist; }; +template <> int8_t RandomGenerator::generate<int8_t>(void); template <> uint8_t RandomGenerator::generate<uint8_t>(void); template <> bool RandomGenerator::generate<bool>(void); template <> int32_t RandomGenerator::generate<int32_t>(void); diff --git a/runtime/libs/misc/src/RandomGenerator.cpp b/runtime/libs/misc/src/RandomGenerator.cpp index e7fbc10ca..af072326b 100644 --- a/runtime/libs/misc/src/RandomGenerator.cpp +++ b/runtime/libs/misc/src/RandomGenerator.cpp @@ -21,6 +21,34 @@ namespace nnfw namespace misc { +template <> int8_t RandomGenerator::generate<int8_t>(void) +{ + // The value of type_range is 255. + float type_range = static_cast<float>(std::numeric_limits<int8_t>::max()) - + static_cast<float>(std::numeric_limits<int8_t>::min()); + // Most _dist values range from -5.0 to 5.0. + float min_range = -5.0f; + float max_range = 5.0f; + // NOTE shifted_relative_val has Gaussian distribution that origin mean was 0 and standard + // deviation was 2. And then its values are distributed and shift to that mean is 127.5 and range + // is about [0, 255]. + float shifted_relative_val = (_dist(_rand) - min_range) * type_range / (max_range - min_range); + + // shifted_relative_val is adjusted to be mapped to end points of the range, if it is out of range + // values. + if (shifted_relative_val < -128.0f) + { + return -128; + } + else if (shifted_relative_val > type_range) + { + return 127; + } + + // Convert shifted_relative_val from float to int8 + return static_cast<int8_t>(shifted_relative_val); +} + template <> uint8_t RandomGenerator::generate<uint8_t>(void) { // The value of type_range is 255. diff --git a/runtime/libs/profiling/CMakeLists.txt b/runtime/libs/profiling/CMakeLists.txt index e0398ce93..b115cc1c6 100644 --- a/runtime/libs/profiling/CMakeLists.txt +++ b/runtime/libs/profiling/CMakeLists.txt @@ -4,4 +4,3 @@ add_library(nnfw_lib_profiling STATIC ${SOURCES}) set_property(TARGET nnfw_lib_profiling PROPERTY POSITION_INDEPENDENT_CODE ON) target_include_directories(nnfw_lib_profiling PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(nnfw_lib_profiling PRIVATE nnfw_common) -target_link_libraries(nnfw_lib_profiling PRIVATE nnfw_coverage) diff --git a/runtime/libs/rua/anchor/CMakeLists.txt b/runtime/libs/rua/anchor/CMakeLists.txt index 6e65641f4..fb41c47ea 100644 --- a/runtime/libs/rua/anchor/CMakeLists.txt +++ b/runtime/libs/rua/anchor/CMakeLists.txt @@ -6,4 +6,3 @@ target_include_directories(nnfw_lib_rua_anchor PUBLIC include) target_link_libraries(nnfw_lib_rua_anchor PUBLIC nnfw_lib_rua_core) target_link_libraries(nnfw_lib_rua_anchor PRIVATE nnfw_lib_rua_dyn) target_link_libraries(nnfw_lib_rua_anchor PRIVATE nnfw_common) -target_link_libraries(nnfw_lib_rua_anchor PRIVATE nnfw_coverage) diff --git a/runtime/libs/rua/dyn/CMakeLists.txt b/runtime/libs/rua/dyn/CMakeLists.txt index 3f9ac8928..01d8a7c02 100644 --- a/runtime/libs/rua/dyn/CMakeLists.txt +++ b/runtime/libs/rua/dyn/CMakeLists.txt @@ -5,4 +5,3 @@ set_target_properties(nnfw_lib_rua_dyn PROPERTIES POSITION_INDEPENDENT_CODE ON) target_include_directories(nnfw_lib_rua_dyn PUBLIC include) target_link_libraries(nnfw_lib_rua_dyn PUBLIC nnfw_lib_rua_core) target_link_libraries(nnfw_lib_rua_dyn PRIVATE nnfw_common) -target_link_libraries(nnfw_lib_rua_dyn PRIVATE nnfw_coverage) diff --git a/runtime/libs/tflite/CMakeLists.txt b/runtime/libs/tflite/CMakeLists.txt index 93a3c9789..f02c93aa6 100644 --- a/runtime/libs/tflite/CMakeLists.txt +++ b/runtime/libs/tflite/CMakeLists.txt @@ -17,7 +17,6 @@ target_link_libraries(nnfw_lib_tflite PUBLIC tensorflow-lite-ex) target_link_libraries(nnfw_lib_tflite PUBLIC nnfw_lib_misc) target_link_libraries(nnfw_lib_tflite PRIVATE ${LIB_PTHREAD} dl) target_link_libraries(nnfw_lib_tflite PRIVATE nnfw_common) -target_link_libraries(nnfw_lib_tflite PRIVATE nnfw_coverage) if(NOT ENABLE_TEST) return() diff --git a/runtime/libs/tflite/include/tflite/CopyInputInitializer.h b/runtime/libs/tflite/include/tflite/CopyInputInitializer.h new file mode 100644 index 000000000..866af0598 --- /dev/null +++ b/runtime/libs/tflite/include/tflite/CopyInputInitializer.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_TFLITE_COPY_INPUT_INITIALIZER_H__ +#define __NNFW_TFLITE_COPY_INPUT_INITIALIZER_H__ + +#include <tensorflow/lite/interpreter.h> + +namespace nnfw +{ +namespace tflite +{ + +class CopyInputInitializer +{ +public: + CopyInputInitializer(::tflite::Interpreter &from) : _from{from} + { + // DO NOTHING + } + + void run(::tflite::Interpreter &interp); + +private: + template <typename T> void setValue(::tflite::Interpreter &interp, int tensor_idx); + +private: + ::tflite::Interpreter &_from; +}; + +} // namespace tflite +} // namespace nnfw + +#endif // __NNFW_TFLITE_COPY_INPUT_INITIALIZER_H__ diff --git a/runtime/libs/tflite/include/tflite/OutputResetter.h b/runtime/libs/tflite/include/tflite/OutputResetter.h new file mode 100644 index 000000000..424068d88 --- /dev/null +++ b/runtime/libs/tflite/include/tflite/OutputResetter.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_TFLITE_OUTPUT_RESETTER_H__ +#define __NNFW_TFLITE_OUTPUT_RESETTER_H__ + +#include <tensorflow/lite/interpreter.h> + +namespace nnfw +{ +namespace tflite +{ + +class OutputResetter +{ +public: + OutputResetter() + { + // DO NOTHING + } + + void run(::tflite::Interpreter &interp); + +private: + template <typename T> void resetValue(::tflite::Interpreter &interp, int tensor_idx); +}; + +} // namespace tflite +} // namespace nnfw + +#endif // __NNFW_TFLITE_OUTPUT_RESETTER_H__ diff --git a/runtime/libs/tflite/include/tflite/RandomInputInitializer.h b/runtime/libs/tflite/include/tflite/RandomInputInitializer.h new file mode 100644 index 000000000..3c241a85e --- /dev/null +++ b/runtime/libs/tflite/include/tflite/RandomInputInitializer.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_TFLITE_RANDOM_INPUT_INITIALIZER_H__ +#define __NNFW_TFLITE_RANDOM_INPUT_INITIALIZER_H__ + +#include <misc/RandomGenerator.h> + +#include <tensorflow/lite/interpreter.h> + +namespace nnfw +{ +namespace tflite +{ + +class RandomInputInitializer +{ +public: + RandomInputInitializer(misc::RandomGenerator &randgen) : _randgen{randgen} + { + // DO NOTHING + } + + void run(::tflite::Interpreter &interp); + +private: + template <typename T> void setValue(::tflite::Interpreter &interp, int tensor_idx); + +private: + nnfw::misc::RandomGenerator &_randgen; +}; + +} // namespace tflite +} // namespace nnfw + +#endif // __NNFW_TFLITE_RANDOM_INPUT_INITIALIZER_H__ diff --git a/runtime/libs/tflite/include/tflite/TensorShapeUtils.h b/runtime/libs/tflite/include/tflite/TensorShapeUtils.h deleted file mode 100644 index ba8687413..000000000 --- a/runtime/libs/tflite/include/tflite/TensorShapeUtils.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file TensorShapeUtils.h - * @brief This file contains utilities function of tensor shape - * @ingroup COM_AI_RUNTIME - */ - -#ifndef __NNFW_TFLITE_TENSOR_SHAPE_UTILS_H__ -#define __NNFW_TFLITE_TENSOR_SHAPE_UTILS_H__ - -#include "misc/tensor/Shape.h" - -#include <vector> - -namespace nnfw -{ -namespace tflite -{ - -/** - * @brief Converts tensor::Shape into a vector - * @param[in] shape The tensor shape to be converted - * @return vector value of given shape object - */ -static inline std::vector<int32_t> as_dims(const nnfw::misc::tensor::Shape &shape) -{ - std::vector<int32_t> dims; - - for (uint32_t axis = 0; axis < shape.rank(); ++axis) - { - dims.emplace_back(shape.dim(axis)); - } - - return dims; -} - -/** - * @brief Broadcasts between two given shapes - * @param[in] lhs_shape The left hand side shape - * @param[in] rhs_shape The right hand side shape - * @return The broadcasted shape - */ -nnfw::misc::tensor::Shape broadcast(const nnfw::misc::tensor::Shape &lhs_shape, - const nnfw::misc::tensor::Shape &rhs_shape); - -} // namespace tflite -} // namespace nnfw - -#endif // __NNFW_TFLITE_TENSOR_SHAPE_UTILS_H__ diff --git a/runtime/libs/tflite/src/CopyInputInitializer.cpp b/runtime/libs/tflite/src/CopyInputInitializer.cpp new file mode 100644 index 000000000..1950dad21 --- /dev/null +++ b/runtime/libs/tflite/src/CopyInputInitializer.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite/CopyInputInitializer.h" +#include "tflite/TensorView.h" + +#include <misc/tensor/IndexIterator.h> + +namespace nnfw +{ +namespace tflite +{ + +void CopyInputInitializer::run(::tflite::Interpreter &interp) +{ + for (const auto &tensor_idx : interp.inputs()) + { + TfLiteTensor *tensor = interp.tensor(tensor_idx); + switch (tensor->type) + { + case kTfLiteInt32: + setValue<int32_t>(interp, tensor_idx); + break; + case kTfLiteUInt8: + setValue<uint8_t>(interp, tensor_idx); + break; + case kTfLiteInt8: + setValue<int8_t>(interp, tensor_idx); + break; + case kTfLiteBool: + setValue<bool>(interp, tensor_idx); + break; + case kTfLiteFloat32: + setValue<float>(interp, tensor_idx); + break; + default: + throw std::runtime_error{"Not supported input type"}; + } + } +} + +template <typename T> +void CopyInputInitializer::setValue(::tflite::Interpreter &interp, int tensor_idx) +{ + auto tensor_from_view = nnfw::tflite::TensorView<T>::make(_from, tensor_idx); + auto tensor_to_view = nnfw::tflite::TensorView<T>::make(interp, tensor_idx); + + nnfw::misc::tensor::iterate(tensor_from_view.shape()) + << [&](const nnfw::misc::tensor::Index &ind) { + tensor_to_view.at(ind) = tensor_from_view.at(ind); + }; +} + +} // namespace tflite +} // namespace nnfw diff --git a/runtime/libs/tflite/src/OutputResetter.cpp b/runtime/libs/tflite/src/OutputResetter.cpp new file mode 100644 index 000000000..486bb4035 --- /dev/null +++ b/runtime/libs/tflite/src/OutputResetter.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite/OutputResetter.h" +#include "tflite/TensorView.h" + +#include <misc/tensor/IndexIterator.h> + +namespace nnfw +{ +namespace tflite +{ + +void OutputResetter::run(::tflite::Interpreter &interp) +{ + for (const auto &tensor_idx : interp.outputs()) + { + TfLiteTensor *tensor = interp.tensor(tensor_idx); + switch (tensor->type) + { + case kTfLiteInt32: + resetValue<int32_t>(interp, tensor_idx); + break; + case kTfLiteUInt8: + resetValue<uint8_t>(interp, tensor_idx); + break; + case kTfLiteInt8: + resetValue<int8_t>(interp, tensor_idx); + break; + case kTfLiteBool: + resetValue<bool>(interp, tensor_idx); + break; + case kTfLiteFloat32: + resetValue<float>(interp, tensor_idx); + break; + default: + throw std::runtime_error{"Not supported output type"}; + } + } +} + +template <typename T> void OutputResetter::resetValue(::tflite::Interpreter &interp, int tensor_idx) +{ + auto tensor_view = nnfw::tflite::TensorView<T>::make(interp, tensor_idx); + + nnfw::misc::tensor::iterate(tensor_view.shape()) + << [&](const nnfw::misc::tensor::Index &ind) { tensor_view.at(ind) = 0; }; +} + +} // namespace tflite +} // namespace nnfw diff --git a/runtime/libs/tflite/src/RandomInputInitializer.cpp b/runtime/libs/tflite/src/RandomInputInitializer.cpp new file mode 100644 index 000000000..57dd7f66c --- /dev/null +++ b/runtime/libs/tflite/src/RandomInputInitializer.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite/RandomInputInitializer.h" +#include "tflite/TensorView.h" + +#include <misc/tensor/IndexIterator.h> + +namespace nnfw +{ +namespace tflite +{ + +void RandomInputInitializer::run(::tflite::Interpreter &interp) +{ + for (const auto &tensor_idx : interp.inputs()) + { + TfLiteTensor *tensor = interp.tensor(tensor_idx); + switch (tensor->type) + { + case kTfLiteFloat32: + setValue<float>(interp, tensor_idx); + break; + case kTfLiteInt32: + setValue<int32_t>(interp, tensor_idx); + break; + case kTfLiteUInt8: + setValue<uint8_t>(interp, tensor_idx); + break; + case kTfLiteBool: + setValue<bool>(interp, tensor_idx); + break; + case kTfLiteInt8: + setValue<int8_t>(interp, tensor_idx); + break; + default: + throw std::runtime_error{"Not supported input type"}; + } + } +} + +template <typename T> +void RandomInputInitializer::setValue(::tflite::Interpreter &interp, int tensor_idx) +{ + auto tensor_view = nnfw::tflite::TensorView<T>::make(interp, tensor_idx); + + nnfw::misc::tensor::iterate(tensor_view.shape()) + << [&](const nnfw::misc::tensor::Index &ind) { tensor_view.at(ind) = _randgen.generate<T>(); }; +} + +} // namespace tflite +} // namespace nnfw diff --git a/runtime/libs/tflite/src/RandomTestRunner.cpp b/runtime/libs/tflite/src/RandomTestRunner.cpp index 3fa9a973f..ae834e79e 100644 --- a/runtime/libs/tflite/src/RandomTestRunner.cpp +++ b/runtime/libs/tflite/src/RandomTestRunner.cpp @@ -14,6 +14,9 @@ * limitations under the License. */ +#include "tflite/CopyInputInitializer.h" +#include "tflite/OutputResetter.h" +#include "tflite/RandomInputInitializer.h" #include "tflite/RandomTestRunner.h" #include "tflite/Diff.h" #include "tflite/TensorLogger.h" @@ -42,247 +45,24 @@ void RandomTestRunner::compile(const nnfw::tflite::Builder &builder) _nnapi = builder.build(); _tfl_interp->UseNNAPI(false); + _nnapi->UseNNAPI(true); // Allocate Tensors _tfl_interp->AllocateTensors(); _nnapi->AllocateTensors(); +} +int RandomTestRunner::run(size_t running_count) +{ assert(_tfl_interp->inputs() == _nnapi->inputs()); + assert(_tfl_interp->outputs() == _nnapi->outputs()); - using ::tflite::Interpreter; - using Initializer = std::function<void(int id, Interpreter *, Interpreter *)>; - - std::map<TfLiteType, Initializer> initializers; - std::map<TfLiteType, Initializer> reseters; - - // Generate singed 32-bit integer (s32) input - initializers[kTfLiteInt32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteInt32); - assert(_nnapi->tensor(id)->type == kTfLiteInt32); - - auto tfl_interp_view = nnfw::tflite::TensorView<int32_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<int32_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - int32_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - // TODO Generate random values - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - ++value; - }; - }; - - // Generate singed 32-bit integer (s32) input - reseters[kTfLiteInt32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteInt32); - assert(_nnapi->tensor(id)->type == kTfLiteInt32); - - auto tfl_interp_view = nnfw::tflite::TensorView<int32_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<int32_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - int32_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - // TODO Generate random values - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteUInt8] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteUInt8); - assert(_nnapi->tensor(id)->type == kTfLiteUInt8); - - auto tfl_interp_view = nnfw::tflite::TensorView<uint8_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<uint8_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<uint8_t (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<uint8_t>); - const nnfw::misc::tensor::Object<uint8_t> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteUInt8] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteUInt8); - assert(_nnapi->tensor(id)->type == kTfLiteUInt8); - - auto tfl_interp_view = nnfw::tflite::TensorView<uint8_t>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<uint8_t>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<uint8_t (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<uint8_t>); - const nnfw::misc::tensor::Object<uint8_t> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - assert(tfl_interp_view.shape() == data.shape()); - - uint8_t value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteFloat32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteFloat32); - assert(_nnapi->tensor(id)->type == kTfLiteFloat32); - - auto tfl_interp_view = nnfw::tflite::TensorView<float>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<float>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<float (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<float>); - const nnfw::misc::tensor::Object<float> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteFloat32] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteFloat32); - assert(_nnapi->tensor(id)->type == kTfLiteFloat32); - - auto tfl_interp_view = nnfw::tflite::TensorView<float>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<float>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<float (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<float>); - const nnfw::misc::tensor::Object<float> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); + nnfw::tflite::OutputResetter resetter; + resetter.run(*(_tfl_interp.get())); - assert(tfl_interp_view.shape() == data.shape()); + RandomInputInitializer initializer{_randgen}; + initializer.run(*(_tfl_interp.get())); - float value = 0; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - initializers[kTfLiteBool] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteBool); - assert(_nnapi->tensor(id)->type == kTfLiteBool); - - auto tfl_interp_view = nnfw::tflite::TensorView<bool>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<bool>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<bool (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<bool>); - const nnfw::misc::tensor::Object<bool> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - const auto value = data.at(ind); - - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - reseters[kTfLiteBool] = [&](int id, Interpreter *tfl_interp, Interpreter *nnapi) { - assert(_tfl_interp->tensor(id)->type == kTfLiteBool); - assert(_nnapi->tensor(id)->type == kTfLiteBool); - - auto tfl_interp_view = nnfw::tflite::TensorView<bool>::make(*tfl_interp, id); - auto nnapi_view = nnfw::tflite::TensorView<bool>::make(*nnapi, id); - - assert(tfl_interp_view.shape() == nnapi_view.shape()); - - auto fp = static_cast<bool (nnfw::misc::RandomGenerator::*)( - const ::nnfw::misc::tensor::Shape &, const ::nnfw::misc::tensor::Index &)>( - &nnfw::misc::RandomGenerator::generate<bool>); - const nnfw::misc::tensor::Object<bool> data(tfl_interp_view.shape(), - std::bind(fp, _randgen, _1, _2)); - - assert(tfl_interp_view.shape() == data.shape()); - - bool value = false; - - nnfw::misc::tensor::iterate(tfl_interp_view.shape()) - << [&](const nnfw::misc::tensor::Index &ind) { - tfl_interp_view.at(ind) = value; - nnapi_view.at(ind) = value; - }; - }; - - // Fill IFM with random numbers - for (const auto id : _tfl_interp->inputs()) - { - assert(_tfl_interp->tensor(id)->type == _nnapi->tensor(id)->type); - - auto it = initializers.find(_tfl_interp->tensor(id)->type); - - if (it == initializers.end()) - { - throw std::runtime_error{"Not supported input type"}; - } - - it->second(id, _tfl_interp.get(), _nnapi.get()); - } - - // Fill OFM with 0 - for (const auto id : _tfl_interp->outputs()) - { - assert(_tfl_interp->tensor(id)->type == _nnapi->tensor(id)->type); - - auto it = reseters.find(_tfl_interp->tensor(id)->type); - - if (it == reseters.end()) - { - throw std::runtime_error{"Not supported input type"}; - } - - it->second(id, _tfl_interp.get(), _nnapi.get()); - } -} - -int RandomTestRunner::run(size_t running_count) -{ std::cout << "[NNAPI TEST] Run T/F Lite Interpreter without NNAPI" << std::endl; _tfl_interp->Invoke(); @@ -290,13 +70,17 @@ int RandomTestRunner::run(size_t running_count) for (size_t i = 1; i <= running_count; ++i) { + resetter.run(*(_nnapi.get())); + + CopyInputInitializer copy_initializer{*(_tfl_interp.get())}; + copy_initializer.run(*(_nnapi.get())); + std::cout << "[NNAPI TEST #" << i << "] Run T/F Lite Interpreter with NNAPI" << std::endl; char *env = getenv("UPSTREAM_DELEGATE"); if (env && !std::string(env).compare("1")) { - _nnapi->UseNNAPI(true); _nnapi->Invoke(); } else diff --git a/runtime/libs/tflite/src/TensorShapeUtils.cpp b/runtime/libs/tflite/src/TensorShapeUtils.cpp deleted file mode 100644 index 689b6151b..000000000 --- a/runtime/libs/tflite/src/TensorShapeUtils.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite/TensorShapeUtils.h" - -namespace nnfw -{ -namespace tflite -{ - -nnfw::misc::tensor::Shape broadcast(const nnfw::misc::tensor::Shape &lhs_shape, - const nnfw::misc::tensor::Shape &rhs_shape) -{ - const uint32_t lhs_rank = lhs_shape.rank(); - const uint32_t rhs_rank = rhs_shape.rank(); - const uint32_t out_rank = std::max(lhs_rank, rhs_rank); - const uint32_t lhs_rank_diff = out_rank - lhs_rank; - const uint32_t rhs_rank_diff = out_rank - rhs_rank; - - nnfw::misc::tensor::Shape out_shape(out_rank); - - for (uint32_t axis = 0; axis < out_rank; ++axis) - { - out_shape.dim(axis) = std::max(axis < lhs_rank_diff ? 1 : lhs_shape.dim(axis - lhs_rank_diff), - axis < rhs_rank_diff ? 1 : rhs_shape.dim(axis - rhs_rank_diff)); - } - - return out_shape; -} - -} // namespace tflite -} // namespace nnfw |