From 2fd6100c7c034d6fc4420fbb5b615660803e46e9 Mon Sep 17 00:00:00 2001 From: Jim Flynn Date: Fri, 3 May 2019 12:54:26 +0100 Subject: IVGCVSW-3038 Move MakeInputTensors to armnnUtils Change-Id: I4352a645badde788b9e33b3675a9cc9c0fc3dc33 Signed-off-by: Jim Flynn --- CMakeLists.txt | 1 + src/armnnUtils/TensorIOUtils.hpp | 87 ++++++++++++++++++++++ tests/InferenceModel.hpp | 73 +----------------- .../MultipleNetworksCifar10.cpp | 6 +- 4 files changed, 93 insertions(+), 74 deletions(-) create mode 100644 src/armnnUtils/TensorIOUtils.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 34dbd91526..b3056c9cae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ list(APPEND armnnUtils_sources src/armnnUtils/ParserPrototxtFixture.hpp src/armnnUtils/PrototxtConversions.hpp src/armnnUtils/PrototxtConversions.cpp + src/armnnUtils/TensorIOUtils.hpp src/armnnUtils/TensorUtils.hpp src/armnnUtils/TensorUtils.cpp ) diff --git a/src/armnnUtils/TensorIOUtils.hpp b/src/armnnUtils/TensorIOUtils.hpp new file mode 100644 index 0000000000..bf5a37b00f --- /dev/null +++ b/src/armnnUtils/TensorIOUtils.hpp @@ -0,0 +1,87 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +#include +#include + +namespace armnnUtils +{ + +template +inline armnn::InputTensors MakeInputTensors( + const std::vector& inputBindings, + const std::vector& inputDataContainers) +{ + armnn::InputTensors inputTensors; + + const size_t numInputs = inputBindings.size(); + if (numInputs != inputDataContainers.size()) + { + throw armnn::Exception(boost::str(boost::format("Number of inputs does not match number of " + "tensor data containers: %1% != %2%") % numInputs % inputDataContainers.size())); + } + + for (size_t i = 0; i < numInputs; i++) + { + const armnn::BindingPointInfo& inputBinding = inputBindings[i]; + const TContainer& inputData = inputDataContainers[i]; + + boost::apply_visitor([&](auto&& value) + { + if (value.size() != inputBinding.second.GetNumElements()) + { + throw armnn::Exception("Input tensor has incorrect size"); + } + + armnn::ConstTensor inputTensor(inputBinding.second, value.data()); + inputTensors.push_back(std::make_pair(inputBinding.first, inputTensor)); + }, + inputData); + } + + return inputTensors; +} + +template +inline armnn::OutputTensors MakeOutputTensors( + const std::vector& outputBindings, + std::vector& outputDataContainers) +{ + armnn::OutputTensors outputTensors; + + const size_t numOutputs = outputBindings.size(); + if (numOutputs != outputDataContainers.size()) + { + throw armnn::Exception(boost::str(boost::format("Number of outputs does not match number of " + "tensor data containers: %1% != %2%") % numOutputs % outputDataContainers.size())); + } + + for (size_t i = 0; i < numOutputs; i++) + { + const armnn::BindingPointInfo& outputBinding = outputBindings[i]; + TContainer& outputData = outputDataContainers[i]; + + boost::apply_visitor([&](auto&& value) + { + if (value.size() != outputBinding.second.GetNumElements()) + { + throw armnn::Exception("Output tensor has incorrect size"); + } + + armnn::Tensor outputTensor(outputBinding.second, value.data()); + outputTensors.push_back(std::make_pair(outputBinding.first, outputTensor)); + }, + outputData); + } + + return outputTensors; +} + +} // namespace armnnUtils \ No newline at end of file diff --git a/tests/InferenceModel.hpp b/tests/InferenceModel.hpp index d2d2ca3c8e..8e463ec326 100644 --- a/tests/InferenceModel.hpp +++ b/tests/InferenceModel.hpp @@ -16,6 +16,7 @@ #endif #include +#include #include @@ -302,75 +303,7 @@ public: }; #endif -template -inline armnn::InputTensors MakeInputTensors( - const std::vector& inputBindings, - const std::vector& inputDataContainers) -{ - armnn::InputTensors inputTensors; - - const size_t numInputs = inputBindings.size(); - if (numInputs != inputDataContainers.size()) - { - throw armnn::Exception(boost::str(boost::format("Number of inputs does not match number of " - "tensor data containers: %1% != %2%") % numInputs % inputDataContainers.size())); - } - - for (size_t i = 0; i < numInputs; i++) - { - const armnn::BindingPointInfo& inputBinding = inputBindings[i]; - const TContainer& inputData = inputDataContainers[i]; - - boost::apply_visitor([&](auto&& value) - { - if (value.size() != inputBinding.second.GetNumElements()) - { - throw armnn::Exception("Input tensor has incorrect size"); - } - - armnn::ConstTensor inputTensor(inputBinding.second, value.data()); - inputTensors.push_back(std::make_pair(inputBinding.first, inputTensor)); - }, - inputData); - } - - return inputTensors; -} -template -inline armnn::OutputTensors MakeOutputTensors( - const std::vector& outputBindings, - std::vector& outputDataContainers) -{ - armnn::OutputTensors outputTensors; - - const size_t numOutputs = outputBindings.size(); - if (numOutputs != outputDataContainers.size()) - { - throw armnn::Exception(boost::str(boost::format("Number of outputs does not match number of " - "tensor data containers: %1% != %2%") % numOutputs % outputDataContainers.size())); - } - - for (size_t i = 0; i < numOutputs; i++) - { - const armnn::BindingPointInfo& outputBinding = outputBindings[i]; - TContainer& outputData = outputDataContainers[i]; - - boost::apply_visitor([&](auto&& value) - { - if (value.size() != outputBinding.second.GetNumElements()) - { - throw armnn::Exception("Output tensor has incorrect size"); - } - - armnn::Tensor outputTensor(outputBinding.second, value.data()); - outputTensors.push_back(std::make_pair(outputBinding.first, outputTensor)); - }, - outputData); - } - - return outputTensors; -} template class InferenceModel @@ -615,13 +548,13 @@ private: template armnn::InputTensors MakeInputTensors(const std::vector& inputDataContainers) { - return ::MakeInputTensors(m_InputBindings, inputDataContainers); + return armnnUtils::MakeInputTensors(m_InputBindings, inputDataContainers); } template armnn::OutputTensors MakeOutputTensors(std::vector& outputDataContainers) { - return ::MakeOutputTensors(m_OutputBindings, outputDataContainers); + return armnnUtils::MakeOutputTensors(m_OutputBindings, outputDataContainers); } std::chrono::high_resolution_clock::time_point GetCurrentTime() diff --git a/tests/MultipleNetworksCifar10/MultipleNetworksCifar10.cpp b/tests/MultipleNetworksCifar10/MultipleNetworksCifar10.cpp index 006318f73a..fec78ac805 100644 --- a/tests/MultipleNetworksCifar10/MultipleNetworksCifar10.cpp +++ b/tests/MultipleNetworksCifar10/MultipleNetworksCifar10.cpp @@ -168,8 +168,6 @@ int main(int argc, char* argv[]) } Cifar10Database cifar10(dataDir); - using TContainer = boost::variant, std::vector, std::vector>; - for (unsigned int i = 0; i < 3; ++i) { // Loads test case data (including image data). @@ -193,8 +191,8 @@ int main(int argc, char* argv[]) std::vector outputDataContainers = { outputs[k] }; status = runtime->EnqueueWorkload(networks[k].m_Network, - MakeInputTensors(inputBindings, inputDataContainers), - MakeOutputTensors(outputBindings, outputDataContainers)); + armnnUtils::MakeInputTensors(inputBindings, inputDataContainers), + armnnUtils::MakeOutputTensors(outputBindings, outputDataContainers)); if (status == armnn::Status::Failure) { BOOST_LOG_TRIVIAL(fatal) << "armnn::IRuntime: Failed to enqueue workload"; -- cgit v1.2.1