diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/armnnUtils/TensorIOUtils.hpp | 87 | ||||
-rw-r--r-- | tests/InferenceModel.hpp | 73 | ||||
-rw-r--r-- | tests/MultipleNetworksCifar10/MultipleNetworksCifar10.cpp | 6 |
4 files changed, 93 insertions, 74 deletions
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 <armnn/Tensor.hpp> +#include <vector> + +#include <boost/format.hpp> +#include <boost/variant/apply_visitor.hpp> + +namespace armnnUtils +{ + +template<typename TContainer> +inline armnn::InputTensors MakeInputTensors( + const std::vector<armnn::BindingPointInfo>& inputBindings, + const std::vector<TContainer>& 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<typename TContainer> +inline armnn::OutputTensors MakeOutputTensors( + const std::vector<armnn::BindingPointInfo>& outputBindings, + std::vector<TContainer>& 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 <HeapProfiling.hpp> +#include <TensorIOUtils.hpp> #include <backendsCommon/BackendRegistry.hpp> @@ -302,75 +303,7 @@ public: }; #endif -template<typename TContainer> -inline armnn::InputTensors MakeInputTensors( - const std::vector<armnn::BindingPointInfo>& inputBindings, - const std::vector<TContainer>& 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<typename TContainer> -inline armnn::OutputTensors MakeOutputTensors( - const std::vector<armnn::BindingPointInfo>& outputBindings, - std::vector<TContainer>& 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 <typename IParser, typename TDataType> class InferenceModel @@ -615,13 +548,13 @@ private: template<typename TContainer> armnn::InputTensors MakeInputTensors(const std::vector<TContainer>& inputDataContainers) { - return ::MakeInputTensors(m_InputBindings, inputDataContainers); + return armnnUtils::MakeInputTensors(m_InputBindings, inputDataContainers); } template<typename TContainer> armnn::OutputTensors MakeOutputTensors(std::vector<TContainer>& 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<float>, std::vector<int>, std::vector<unsigned char>>; - 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<TContainer> 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"; |