aboutsummaryrefslogtreecommitdiff
path: root/src/armnnUtils
diff options
context:
space:
mode:
authorMatteo Martincigh <matteo.martincigh@arm.com>2019-06-05 09:02:41 +0100
committerMatteo Martincigh <matteo.martincigh@arm.com>2019-06-05 09:10:50 +0100
commitee423cee7d7753790d0d82c5c2fd12a262b412a2 (patch)
treed3bfacd18fb1fc2d70af98845ce1e9089642581c /src/armnnUtils
parent286080f0d4c4f8a1ca174888f48475e3ec9ac797 (diff)
downloadarmnn-ee423cee7d7753790d0d82c5c2fd12a262b412a2.tar.gz
IVGCVSW-3142 Refactor DataLayoutIndexed and TensorBufferArrayView
for convenience * Added GetIndex method to DataLayoutIndexed * Refactored TensorBufferArrayView::Get to use the new method Change-Id: Iae08b2761bddeda9e935b25e6bc4985f2d386cd3 Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
Diffstat (limited to 'src/armnnUtils')
-rw-r--r--src/armnnUtils/DataLayoutIndexed.cpp38
-rw-r--r--src/armnnUtils/DataLayoutIndexed.hpp6
2 files changed, 42 insertions, 2 deletions
diff --git a/src/armnnUtils/DataLayoutIndexed.cpp b/src/armnnUtils/DataLayoutIndexed.cpp
index db27de4bdd..b02f07ec85 100644
--- a/src/armnnUtils/DataLayoutIndexed.cpp
+++ b/src/armnnUtils/DataLayoutIndexed.cpp
@@ -5,6 +5,8 @@
#include "DataLayoutIndexed.hpp"
+#include <boost/assert.hpp>
+
using namespace armnn;
namespace armnnUtils
@@ -31,13 +33,45 @@ DataLayoutIndexed::DataLayoutIndexed(armnn::DataLayout dataLayout)
}
}
-// Definition in include/armnn/Types.hpp
+unsigned int DataLayoutIndexed::GetIndex(const TensorShape& shape,
+ unsigned int batchIndex, unsigned int channelIndex,
+ unsigned int heightIndex, unsigned int widthIndex) const
+{
+ BOOST_ASSERT( batchIndex < shape[0] || ( shape[0] == 0 && batchIndex == 0 ) );
+ BOOST_ASSERT( channelIndex < shape[m_ChannelsIndex] ||
+ ( shape[m_ChannelsIndex] == 0 && channelIndex == 0) );
+ BOOST_ASSERT( heightIndex < shape[m_HeightIndex] ||
+ ( shape[m_HeightIndex] == 0 && heightIndex == 0) );
+ BOOST_ASSERT( widthIndex < shape[m_WidthIndex] ||
+ ( shape[m_WidthIndex] == 0 && widthIndex == 0) );
+
+ // Offset the given indices appropriately depending on the data layout
+ switch (m_DataLayout)
+ {
+ case DataLayout::NHWC:
+ batchIndex *= shape[1] * shape[2] * shape[3]; // batchIndex *= heightIndex * widthIndex * channelIndex
+ heightIndex *= shape[m_WidthIndex] * shape[m_ChannelsIndex];
+ widthIndex *= shape[m_ChannelsIndex];
+ // channelIndex stays unchanged
+ break;
+ case DataLayout::NCHW:
+ default:
+ batchIndex *= shape[1] * shape[2] * shape[3]; // batchIndex *= heightIndex * widthIndex * channelIndex
+ channelIndex *= shape[m_HeightIndex] * shape[m_WidthIndex];
+ heightIndex *= shape[m_WidthIndex];
+ // widthIndex stays unchanged
+ break;
+ }
+
+ // Get the value using the correct offset
+ return batchIndex + channelIndex + heightIndex + widthIndex;
+}
+
bool operator==(const DataLayout& dataLayout, const DataLayoutIndexed& indexed)
{
return dataLayout == indexed.GetDataLayout();
}
-// Definition in include/armnn/Types.hpp
bool operator==(const DataLayoutIndexed& indexed, const DataLayout& dataLayout)
{
return indexed.GetDataLayout() == dataLayout;
diff --git a/src/armnnUtils/DataLayoutIndexed.hpp b/src/armnnUtils/DataLayoutIndexed.hpp
index 1cf2a09e32..5bb8e0d93f 100644
--- a/src/armnnUtils/DataLayoutIndexed.hpp
+++ b/src/armnnUtils/DataLayoutIndexed.hpp
@@ -2,8 +2,11 @@
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
+
#pragma once
+
#include <armnn/Types.hpp>
+#include <armnn/Tensor.hpp>
namespace armnnUtils
{
@@ -18,6 +21,9 @@ public:
unsigned int GetChannelsIndex() const { return m_ChannelsIndex; }
unsigned int GetHeightIndex() const { return m_HeightIndex; }
unsigned int GetWidthIndex() const { return m_WidthIndex; }
+ unsigned int GetIndex(const armnn::TensorShape& shape,
+ unsigned int batchIndex, unsigned int channelIndex,
+ unsigned int heightIndex, unsigned int widthIndex) const;
private:
armnn::DataLayout m_DataLayout;