aboutsummaryrefslogtreecommitdiff
path: root/src/backends/reference
diff options
context:
space:
mode:
authorAron Virginas-Tar <Aron.Virginas-Tar@arm.com>2019-11-05 18:00:21 +0000
committerFrancis Murtagh <francis.murtagh@arm.com>2019-11-06 12:10:02 +0000
commit5edc8816118fcddb2681379db04c978041ce8b46 (patch)
tree22e4382138e9963d0ed3dacefda4fb142877e1fc /src/backends/reference
parentec33a91ec1557b78b2d01975ec4c5eaf24aa058c (diff)
downloadarmnn-5edc8816118fcddb2681379db04c978041ce8b46.tar.gz
IVGCVSW-3837 Add support for per-axis quantization to reference Convolution2d workload
Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com> Change-Id: I0ac08ba4864d48e6f64c4ac645dad8ea850be112
Diffstat (limited to 'src/backends/reference')
-rw-r--r--src/backends/reference/RefLayerSupport.cpp46
-rw-r--r--src/backends/reference/test/RefLayerTests.cpp2
-rw-r--r--src/backends/reference/workloads/BaseIterator.hpp13
-rw-r--r--src/backends/reference/workloads/ConvImpl.cpp6
4 files changed, 49 insertions, 18 deletions
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 716e8d9492..4252fecf35 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -433,11 +433,12 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input,
bool supported = true;
// Define supported types.
- std::array<DataType,4> supportedTypes = {
- DataType::Float32,
- DataType::Float16,
- DataType::QuantisedAsymm8,
- DataType::QuantisedSymm16
+ std::array<DataType,4> supportedTypes =
+ {
+ DataType::Float32,
+ DataType::Float16,
+ DataType::QuantisedAsymm8,
+ DataType::QuantisedSymm16
};
supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
@@ -446,22 +447,39 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input,
supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
"Reference convolution2d: output is not a supported type.");
- supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported,
- "Reference convolution2d: weights is not a supported type.");
-
supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
"Reference convolution2d: input and output types mismatched.");
- supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported,
- "Reference convolution2d: input and weights types mismatched.");
+ const DataType inputType = input.GetDataType();
+ if (inputType == DataType::QuantisedAsymm8)
+ {
+ std::array<DataType, 2> supportedWeightTypes =
+ {
+ DataType::QuantisedAsymm8,
+ DataType::QuantizedSymm8PerAxis
+ };
+
+ supported &= CheckSupportRule(TypeAnyOf(weights, supportedWeightTypes), reasonIfUnsupported,
+ "Reference convolution2d: weights type not supported for quantized input.");
+ }
+ else
+ {
+ supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported,
+ "Reference convolution2d: weights is not a supported type.");
+
+ supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported,
+ "Reference convolution2d: input and weights types mismatched.");
+ }
if (biases.has_value())
{
- std::array<DataType,3> biasesSupportedTypes = {
- DataType::Float32,
- DataType::Float16,
- DataType::Signed32
+ std::array<DataType,3> biasesSupportedTypes =
+ {
+ DataType::Float32,
+ DataType::Float16,
+ DataType::Signed32
};
+
supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported,
"Reference convolution2d: biases is not a supported type.");
}
diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp
index 2c38ed52cd..c407828f06 100644
--- a/src/backends/reference/test/RefLayerTests.cpp
+++ b/src/backends/reference/test/RefLayerTests.cpp
@@ -145,6 +145,8 @@ ARMNN_AUTO_TEST_CASE(Convolution2d2x2Dilation2x2Padding2x2Stride3x3NhwcInt16,
false,
DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(Convolution2dPerAxisQuantTestNchw, Convolution2dPerAxisQuantTest, DataLayout::NCHW);
+ARMNN_AUTO_TEST_CASE(Convolution2dPerAxisQuantTestNhwc, Convolution2dPerAxisQuantTest, DataLayout::NHWC);
// Depthwise Convolution
ARMNN_AUTO_TEST_CASE(DepthwiseConvolution2d, DepthwiseConvolution2dTest, true, DataLayout::NCHW)
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp
index 50475312a5..95a31fbdd6 100644
--- a/src/backends/reference/workloads/BaseIterator.hpp
+++ b/src/backends/reference/workloads/BaseIterator.hpp
@@ -11,6 +11,7 @@
#include <ResolveType.hpp>
#include <boost/assert.hpp>
+#include <boost/core/ignore_unused.hpp>
namespace armnn
{
@@ -22,6 +23,8 @@ public:
virtual ~BaseIterator() {}
+ virtual BaseIterator& SetIndex(unsigned int index, unsigned int axisIndex = 0) = 0;
+
virtual BaseIterator& operator++() = 0;
virtual BaseIterator& operator+=(const unsigned int increment) = 0;
@@ -101,6 +104,14 @@ public:
return *this;
}
+ TypedIterator& SetIndex(unsigned int index, unsigned int axisIndex = 0) override
+ {
+ boost::ignore_unused(axisIndex);
+ BOOST_ASSERT(m_Iterator);
+ m_Iterator = m_Start + index;
+ return *this;
+ }
+
protected:
T* m_Iterator;
T* m_Start;
@@ -350,7 +361,7 @@ public:
{}
// This should be called to set index for per-axis Encoder/Decoder
- PerAxisIterator& SetIndex(unsigned int index, unsigned int axisIndex)
+ PerAxisIterator& SetIndex(unsigned int index, unsigned int axisIndex) override
{
BOOST_ASSERT(m_Iterator);
m_Iterator = m_Start + index;
diff --git a/src/backends/reference/workloads/ConvImpl.cpp b/src/backends/reference/workloads/ConvImpl.cpp
index 92e3b2d7dd..0c13e3ba0d 100644
--- a/src/backends/reference/workloads/ConvImpl.cpp
+++ b/src/backends/reference/workloads/ConvImpl.cpp
@@ -165,7 +165,7 @@ void Convolve(const TensorShape& rInputShape,
}
}
- rFilterDecoder[filterIndex];
+ rFilterDecoder.SetIndex(filterIndex, cOutput);
float filterValue = rFilterDecoder.Get();
unsigned int yInput = yOutput * yStride + yFilter * yDilation;
@@ -211,7 +211,7 @@ void Convolve(const TensorShape& rInputShape,
if (biasEnabled)
{
- (*pBiasDecoder)[cOutput];
+ (*pBiasDecoder).SetIndex(cOutput, cOutput);
sum += pBiasDecoder->Get();
}
@@ -225,4 +225,4 @@ void Convolve(const TensorShape& rInputShape,
}
}
-} //namespace armnn
+} // namespace armnn