diff options
Diffstat (limited to 'src/backends/reference/workloads')
13 files changed, 245 insertions, 251 deletions
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp index 95c75a576a..955d7f2185 100644 --- a/src/backends/reference/workloads/BaseIterator.hpp +++ b/src/backends/reference/workloads/BaseIterator.hpp @@ -25,34 +25,30 @@ public: virtual BaseIterator& operator-=(const unsigned int increment) = 0; }; +template<typename IType> class Decoder : public BaseIterator { public: - Decoder() : BaseIterator() {} + using InterfaceType = IType; + + Decoder() {} virtual ~Decoder() {} - virtual float Get() const = 0; + virtual IType Get() const = 0; }; +template<typename IType> class Encoder : public BaseIterator { public: - Encoder() : BaseIterator() {} - - virtual ~Encoder() {} + using InterfaceType = IType; - virtual void Set(const float& right) = 0; -}; - -class ComparisonEncoder : public BaseIterator -{ -public: - ComparisonEncoder() : BaseIterator() {} + Encoder() {} - virtual ~ComparisonEncoder() {} + virtual ~Encoder() {} - virtual void Set(bool right) = 0; + virtual void Set(IType right) = 0; }; template<typename T, typename Base> @@ -84,7 +80,7 @@ public: T* m_Iterator; }; -class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder> +class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>> { public: QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset) @@ -100,19 +96,7 @@ private: const int32_t m_Offset; }; -class FloatDecoder : public TypedIterator<const float, Decoder> -{ -public: - FloatDecoder(const float* data) - : TypedIterator(data) {} - - float Get() const override - { - return *m_Iterator; - } -}; - -class QSymm16Decoder : public TypedIterator<const int16_t, Decoder> +class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>> { public: QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset) @@ -128,25 +112,25 @@ private: const int32_t m_Offset; }; -class FloatEncoder : public TypedIterator<float, Encoder> +class FloatDecoder : public TypedIterator<const float, Decoder<float>> { public: - FloatEncoder(float* data) + FloatDecoder(const float* data) : TypedIterator(data) {} - void Set(const float& right) override + float Get() const override { - *m_Iterator = right; + return *m_Iterator; } }; -class QASymm8Encoder : public TypedIterator<uint8_t, Encoder> +class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>> { public: QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset) : TypedIterator(data), m_Scale(scale), m_Offset(offset) {} - void Set(const float& right) override + void Set(float right) override { *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset); } @@ -156,32 +140,45 @@ private: const int32_t m_Offset; }; -class BooleanEncoder : public TypedIterator<uint8_t, ComparisonEncoder> +class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>> { public: - BooleanEncoder(uint8_t* data) + QSymm16Encoder(int16_t* data, const float scale, const int32_t offset) + : TypedIterator(data), m_Scale(scale), m_Offset(offset) {} + + void Set(float right) override + { + *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset); + } + +private: + const float m_Scale; + const int32_t m_Offset; +}; + +class FloatEncoder : public TypedIterator<float, Encoder<float>> +{ +public: + FloatEncoder(float* data) : TypedIterator(data) {} - void Set(bool right) override + void Set(float right) override { *m_Iterator = right; } }; -class QSymm16Encoder : public TypedIterator<int16_t, Encoder> +class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>> { public: - QSymm16Encoder(int16_t* data, const float scale, const int32_t offset) - : TypedIterator(data), m_Scale(scale), m_Offset(offset) {} + BooleanEncoder(uint8_t* data) + : TypedIterator(data) {} - void Set(const float& right) override + void Set(bool right) override { - *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset); + *m_Iterator = right; } - -private: - const float m_Scale; - const int32_t m_Offset; }; + } //namespace armnn
\ No newline at end of file diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index 4ff2466e87..e94b031060 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -16,10 +16,12 @@ list(APPEND armnnRefBackendWorkloads_sources ConvImpl.hpp Debug.cpp Debug.hpp + Decoders.hpp DetectionPostProcess.cpp DetectionPostProcess.hpp ElementwiseFunction.cpp ElementwiseFunction.hpp + Encoders.hpp FullyConnected.cpp FullyConnected.hpp Gather.cpp @@ -44,8 +46,6 @@ list(APPEND armnnRefBackendWorkloads_sources RefBatchToSpaceNdFloat32Workload.hpp RefBatchToSpaceNdUint8Workload.cpp RefBatchToSpaceNdUint8Workload.hpp - RefComparisonWorkload.cpp - RefComparisonWorkload.hpp RefConstantWorkload.cpp RefConstantWorkload.hpp RefConvertFp16ToFp32Workload.cpp diff --git a/src/backends/reference/workloads/Decoders.hpp b/src/backends/reference/workloads/Decoders.hpp new file mode 100644 index 0000000000..4112e7d454 --- /dev/null +++ b/src/backends/reference/workloads/Decoders.hpp @@ -0,0 +1,48 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "BaseIterator.hpp" + +namespace armnn +{ + +template<typename T> +std::unique_ptr<Decoder<T>> MakeDecoder(const TensorInfo& info, const void* data); + +template<> +std::unique_ptr<Decoder<float>> MakeDecoder(const TensorInfo& info, const void* data) +{ + switch(info.GetDataType()) + { + case armnn::DataType::QuantisedAsymm8: + { + return std::make_unique<QASymm8Decoder>( + static_cast<const uint8_t*>(data), + info.GetQuantizationScale(), + info.GetQuantizationOffset()); + } + case armnn::DataType::QuantisedSymm16: + { + return std::make_unique<QSymm16Decoder>( + static_cast<const int16_t*>(data), + info.GetQuantizationScale(), + info.GetQuantizationOffset()); + } + case armnn::DataType::Float32: + { + return std::make_unique<FloatDecoder>(static_cast<const float*>(data)); + } + default: + { + BOOST_ASSERT_MSG(false, "Not supported Data Type!"); + break; + } + } + return nullptr; +} + +} //namespace armnn
\ No newline at end of file diff --git a/src/backends/reference/workloads/ElementwiseFunction.cpp b/src/backends/reference/workloads/ElementwiseFunction.cpp index 934a86217a..7a5c071f70 100644 --- a/src/backends/reference/workloads/ElementwiseFunction.cpp +++ b/src/backends/reference/workloads/ElementwiseFunction.cpp @@ -13,26 +13,25 @@ namespace armnn { -template <typename Functor, typename DecoderOp, typename EncoderOp> -ElementwiseFunction<Functor, DecoderOp, EncoderOp>::ElementwiseFunction(const TensorShape& inShape0, - const TensorShape& inShape1, - const TensorShape& outShape, - DecoderOp& inData0, - DecoderOp& inData1, - EncoderOp& outData) +template <typename Functor> +ElementwiseFunction<Functor>::ElementwiseFunction(const TensorShape& inShape0, + const TensorShape& inShape1, + const TensorShape& outShape, + armnn::Decoder<InType>& inData0, + armnn::Decoder<InType>& inData1, + armnn::Encoder<OutType>& outData) { BroadcastLoop(inShape0, inShape1, outShape).Unroll(Functor(), 0, inData0, inData1, outData); } } //namespace armnn -template struct armnn::ElementwiseFunction<std::plus<float>, armnn::Decoder, armnn::Encoder>; -template struct armnn::ElementwiseFunction<std::minus<float>, armnn::Decoder, armnn::Encoder>; -template struct armnn::ElementwiseFunction<std::multiplies<float>, armnn::Decoder, armnn::Encoder>; -template struct armnn::ElementwiseFunction<std::divides<float>, armnn::Decoder, armnn::Encoder>; -template struct armnn::ElementwiseFunction<armnn::maximum<float>, armnn::Decoder, armnn::Encoder>; -template struct armnn::ElementwiseFunction<armnn::minimum<float>, armnn::Decoder, armnn::Encoder>; - -template struct armnn::ElementwiseFunction<std::equal_to<float>, armnn::Decoder, armnn::ComparisonEncoder>; -template struct armnn::ElementwiseFunction<std::greater<float>, armnn::Decoder, armnn::ComparisonEncoder>; +template struct armnn::ElementwiseFunction<std::plus<float>>; +template struct armnn::ElementwiseFunction<std::minus<float>>; +template struct armnn::ElementwiseFunction<std::multiplies<float>>; +template struct armnn::ElementwiseFunction<std::divides<float>>; +template struct armnn::ElementwiseFunction<armnn::maximum<float>>; +template struct armnn::ElementwiseFunction<armnn::minimum<float>>; +template struct armnn::ElementwiseFunction<std::equal_to<float>>; +template struct armnn::ElementwiseFunction<std::greater<float>>; diff --git a/src/backends/reference/workloads/ElementwiseFunction.hpp b/src/backends/reference/workloads/ElementwiseFunction.hpp index 9eb003d5f9..fd1fab0690 100644 --- a/src/backends/reference/workloads/ElementwiseFunction.hpp +++ b/src/backends/reference/workloads/ElementwiseFunction.hpp @@ -11,15 +11,18 @@ namespace armnn { -template <typename Functor, typename DecoderOp, typename EncoderOp> +template <typename Functor> struct ElementwiseFunction { + using OutType = typename Functor::result_type; + using InType = typename Functor::first_argument_type; + ElementwiseFunction(const TensorShape& inShape0, const TensorShape& inShape1, const TensorShape& outShape, - DecoderOp& inData0, - DecoderOp& inData1, - EncoderOp& outData); + armnn::Decoder<InType>& inData0, + armnn::Decoder<InType>& inData1, + armnn::Encoder<OutType>& outData); }; } //namespace armnn diff --git a/src/backends/reference/workloads/Encoders.hpp b/src/backends/reference/workloads/Encoders.hpp new file mode 100644 index 0000000000..90300aa0f7 --- /dev/null +++ b/src/backends/reference/workloads/Encoders.hpp @@ -0,0 +1,66 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "BaseIterator.hpp" + +namespace armnn +{ + +template<typename T> +std::unique_ptr<Encoder<T>> MakeEncoder(const TensorInfo& info, void* data); + +template<> +std::unique_ptr<Encoder<float>> MakeEncoder(const TensorInfo& info, void* data) +{ + switch(info.GetDataType()) + { + case armnn::DataType::QuantisedAsymm8: + { + return std::make_unique<QASymm8Encoder>( + static_cast<uint8_t*>(data), + info.GetQuantizationScale(), + info.GetQuantizationOffset()); + } + case armnn::DataType::QuantisedSymm16: + { + return std::make_unique<QSymm16Encoder>( + static_cast<int16_t*>(data), + info.GetQuantizationScale(), + info.GetQuantizationOffset()); + } + case armnn::DataType::Float32: + { + return std::make_unique<FloatEncoder>(static_cast<float*>(data)); + } + default: + { + BOOST_ASSERT_MSG(false, "Cannot encode from float. Not supported target Data Type!"); + break; + } + } + return nullptr; +} + +template<> +std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data) +{ + switch(info.GetDataType()) + { + case armnn::DataType::Boolean: + { + return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data)); + } + default: + { + BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!"); + break; + } + } + return nullptr; +} + +} //namespace armnn
\ No newline at end of file diff --git a/src/backends/reference/workloads/Maximum.hpp b/src/backends/reference/workloads/Maximum.hpp index 524afffc44..97df19d3c6 100644 --- a/src/backends/reference/workloads/Maximum.hpp +++ b/src/backends/reference/workloads/Maximum.hpp @@ -10,7 +10,7 @@ namespace armnn { template<typename T> - struct maximum +struct maximum : public std::binary_function<T, T, T> { T operator () (const T& inputData0, const T& inputData1) const diff --git a/src/backends/reference/workloads/Minimum.hpp b/src/backends/reference/workloads/Minimum.hpp index 2f3bdc1c02..0c053981a0 100644 --- a/src/backends/reference/workloads/Minimum.hpp +++ b/src/backends/reference/workloads/Minimum.hpp @@ -9,7 +9,7 @@ namespace armnn { template<typename T> -struct minimum +struct minimum : public std::binary_function<T, T, T> { T operator()(const T& input1, const T& input2) const diff --git a/src/backends/reference/workloads/RefComparisonWorkload.cpp b/src/backends/reference/workloads/RefComparisonWorkload.cpp deleted file mode 100644 index bb8bb04ad3..0000000000 --- a/src/backends/reference/workloads/RefComparisonWorkload.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefComparisonWorkload.hpp" -#include "ElementwiseFunction.hpp" -#include "RefWorkloadUtils.hpp" -#include "Profiling.hpp" -#include <vector> - -namespace armnn { - -template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString> -void RefComparisonWorkload<Functor, ParentDescriptor, DebugString>::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, StringMapping::Instance().Get(DebugString)); - const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]); - const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]); - const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - - const TensorShape& inShape0 = inputInfo0.GetShape(); - const TensorShape& inShape1 = inputInfo1.GetShape(); - const TensorShape& outShape = outputInfo.GetShape(); - - switch(inputInfo0.GetDataType()) - { - case armnn::DataType::QuantisedAsymm8: - { - QASymm8Decoder decodeIterator0(GetInputTensorDataU8(0, m_Data), - inputInfo0.GetQuantizationScale(), - inputInfo0.GetQuantizationOffset()); - - QASymm8Decoder decodeIterator1(GetInputTensorDataU8(1, m_Data), - inputInfo1.GetQuantizationScale(), - inputInfo1.GetQuantizationOffset()); - - BooleanEncoder encodeIterator0(GetOutputTensorDataU8(0, m_Data)); - - ElementwiseFunction<Functor, Decoder, ComparisonEncoder>(inShape0, - inShape1, - outShape, - decodeIterator0, - decodeIterator1, - encodeIterator0); - break; - } - case armnn::DataType::Float32: - { - FloatDecoder decodeIterator0(GetInputTensorDataFloat(0, m_Data)); - FloatDecoder decodeIterator1(GetInputTensorDataFloat(1, m_Data)); - BooleanEncoder encodeIterator0(GetOutputTensorDataU8(0, m_Data)); - - ElementwiseFunction<Functor, Decoder, ComparisonEncoder>(inShape0, - inShape1, - outShape, - decodeIterator0, - decodeIterator1, - encodeIterator0); - break; - } - default: - BOOST_ASSERT_MSG(false, "RefComparisonWorkload: Not supported Data Type!"); - break; - } -} - -} - -template class armnn::RefComparisonWorkload<std::equal_to<float>, - armnn::EqualQueueDescriptor, - armnn::StringMapping::RefEqualWorkload_Execute>; - -template class armnn::RefComparisonWorkload<std::greater<float>, - armnn::GreaterQueueDescriptor, - armnn::StringMapping::RefGreaterWorkload_Execute>; diff --git a/src/backends/reference/workloads/RefComparisonWorkload.hpp b/src/backends/reference/workloads/RefComparisonWorkload.hpp deleted file mode 100644 index cfc2dcf2aa..0000000000 --- a/src/backends/reference/workloads/RefComparisonWorkload.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include <armnn/Types.hpp> -#include <backendsCommon/Workload.hpp> -#include <backendsCommon/WorkloadData.hpp> -#include "StringMapping.hpp" - -namespace armnn -{ - -template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString> -class RefComparisonWorkload : public BaseWorkload<ParentDescriptor> -{ -public: - using BaseWorkload<ParentDescriptor>::m_Data; - using BaseWorkload<ParentDescriptor>::BaseWorkload; - - void Execute() const override; -}; - -using RefEqualWorkload = - RefComparisonWorkload<std::equal_to<float>, - EqualQueueDescriptor, - StringMapping::RefEqualWorkload_Execute>; - - -using RefGreaterWorkload = - RefComparisonWorkload<std::greater<float>, - GreaterQueueDescriptor, - StringMapping::RefGreaterWorkload_Execute>; -} // armnn diff --git a/src/backends/reference/workloads/RefElementwiseWorkload.cpp b/src/backends/reference/workloads/RefElementwiseWorkload.cpp index 1a30e7c9fb..535adca0d7 100644 --- a/src/backends/reference/workloads/RefElementwiseWorkload.cpp +++ b/src/backends/reference/workloads/RefElementwiseWorkload.cpp @@ -4,17 +4,41 @@ // #include "RefElementwiseWorkload.hpp" + +#include "Decoders.hpp" #include "ElementwiseFunction.hpp" -#include "RefWorkloadUtils.hpp" +#include "Encoders.hpp" #include "Profiling.hpp" +#include "RefWorkloadUtils.hpp" #include "StringMapping.hpp" #include "TypeUtils.hpp" + #include <vector> namespace armnn { template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString> +RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::RefElementwiseWorkload( + const ParentDescriptor& desc, + const WorkloadInfo& info) + : BaseWorkload<ParentDescriptor>(desc, info) +{ +} + +template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString> +void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::PostAllocationConfigure() +{ + const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]); + const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]); + const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); + + m_Input0 = MakeDecoder<InType>(inputInfo0, m_Data.m_Inputs[0]->Map()); + m_Input1 = MakeDecoder<InType>(inputInfo1, m_Data.m_Inputs[1]->Map()); + m_Output = MakeEncoder<OutType>(outputInfo, m_Data.m_Outputs[0]->Map()); +} + +template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString> void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute() const { ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, StringMapping::Instance().Get(DebugString)); @@ -26,73 +50,15 @@ void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute() c const TensorShape& inShape1 = inputInfo1.GetShape(); const TensorShape& outShape = outputInfo.GetShape(); - switch(inputInfo0.GetDataType()) - { - case armnn::DataType::QuantisedAsymm8: - { - QASymm8Decoder decodeIterator0(GetInputTensorDataU8(0, m_Data), - inputInfo0.GetQuantizationScale(), - inputInfo0.GetQuantizationOffset()); - - QASymm8Decoder decodeIterator1(GetInputTensorDataU8(1, m_Data), - inputInfo1.GetQuantizationScale(), - inputInfo1.GetQuantizationOffset()); - - QASymm8Encoder encodeIterator0(GetOutputTensorDataU8(0, m_Data), - outputInfo.GetQuantizationScale(), - outputInfo.GetQuantizationOffset()); - - ElementwiseFunction<Functor, Decoder, Encoder>(inShape0, - inShape1, - outShape, - decodeIterator0, - decodeIterator1, - encodeIterator0); - break; - } - case armnn::DataType::Float32: - { - FloatDecoder decodeIterator0(GetInputTensorDataFloat(0, m_Data)); - FloatDecoder decodeIterator1(GetInputTensorDataFloat(1, m_Data)); - FloatEncoder encodeIterator0(GetOutputTensorDataFloat(0, m_Data)); - - ElementwiseFunction<Functor, Decoder, Encoder>(inShape0, - inShape1, - outShape, - decodeIterator0, - decodeIterator1, - encodeIterator0); - break; - } - case armnn::DataType::QuantisedSymm16: - { - QSymm16Decoder decodeIterator0(GetInputTensorData<int16_t>(0, m_Data), - inputInfo0.GetQuantizationScale(), - inputInfo0.GetQuantizationOffset()); - - QSymm16Decoder decodeIterator1(GetInputTensorData<int16_t>(1, m_Data), - inputInfo1.GetQuantizationScale(), - inputInfo1.GetQuantizationOffset()); - - QSymm16Encoder encodeIterator0(GetOutputTensorData<int16_t>(0, m_Data), - outputInfo.GetQuantizationScale(), - outputInfo.GetQuantizationOffset()); - - ElementwiseFunction<Functor, Decoder, Encoder>(inShape0, - inShape1, - outShape, - decodeIterator0, - decodeIterator1, - encodeIterator0); - break; - } - default: - BOOST_ASSERT_MSG(false, "RefElementwiseWorkload: Not supported Data Type!"); - break; - } + ElementwiseFunction<Functor>(inShape0, + inShape1, + outShape, + *m_Input0, + *m_Input1, + *m_Output); } -} +} //namespace armnn template class armnn::RefElementwiseWorkload<std::plus<float>, armnn::AdditionQueueDescriptor, @@ -116,4 +82,12 @@ template class armnn::RefElementwiseWorkload<armnn::maximum<float>, template class armnn::RefElementwiseWorkload<armnn::minimum<float>, armnn::MinimumQueueDescriptor, - armnn::StringMapping::RefMinimumWorkload_Execute>;
\ No newline at end of file + armnn::StringMapping::RefMinimumWorkload_Execute>; + +template class armnn::RefElementwiseWorkload<std::equal_to<float>, + armnn::EqualQueueDescriptor, + armnn::StringMapping::RefEqualWorkload_Execute>; + +template class armnn::RefElementwiseWorkload<std::greater<float>, + armnn::GreaterQueueDescriptor, + armnn::StringMapping::RefGreaterWorkload_Execute>; diff --git a/src/backends/reference/workloads/RefElementwiseWorkload.hpp b/src/backends/reference/workloads/RefElementwiseWorkload.hpp index 81af19627e..651942e9e5 100644 --- a/src/backends/reference/workloads/RefElementwiseWorkload.hpp +++ b/src/backends/reference/workloads/RefElementwiseWorkload.hpp @@ -8,6 +8,8 @@ #include <armnn/Types.hpp> #include <backendsCommon/Workload.hpp> #include <backendsCommon/WorkloadData.hpp> +#include "BaseIterator.hpp" +#include "ElementwiseFunction.hpp" #include "Maximum.hpp" #include "Minimum.hpp" #include "StringMapping.hpp" @@ -19,10 +21,18 @@ template <typename Functor, typename ParentDescriptor, typename armnn::StringMap class RefElementwiseWorkload : public BaseWorkload<ParentDescriptor> { public: + using InType = typename ElementwiseFunction<Functor>::InType; + using OutType = typename ElementwiseFunction<Functor>::OutType; using BaseWorkload<ParentDescriptor>::m_Data; - using BaseWorkload<ParentDescriptor>::BaseWorkload; + RefElementwiseWorkload(const ParentDescriptor& descriptor, const WorkloadInfo& info); + void PostAllocationConfigure() override; void Execute() const override; + +private: + std::unique_ptr<Decoder<InType>> m_Input0; + std::unique_ptr<Decoder<InType>> m_Input1; + std::unique_ptr<Encoder<OutType>> m_Output; }; using RefAdditionWorkload = @@ -54,4 +64,14 @@ using RefMinimumWorkload = RefElementwiseWorkload<armnn::minimum<float>, MinimumQueueDescriptor, StringMapping::RefMinimumWorkload_Execute>; + +using RefEqualWorkload = + RefElementwiseWorkload<std::equal_to<float>, + armnn::EqualQueueDescriptor, + armnn::StringMapping::RefEqualWorkload_Execute>; + +using RefGreaterWorkload = + RefElementwiseWorkload<std::greater<float>, + armnn::GreaterQueueDescriptor, + armnn::StringMapping::RefGreaterWorkload_Execute>; } // armnn diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index 77aa56fcc6..a1b584759b 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -62,7 +62,6 @@ #include "RefBatchToSpaceNdFloat32Workload.hpp" #include "RefDebugWorkload.hpp" #include "RefRsqrtFloat32Workload.hpp" -#include "RefComparisonWorkload.hpp" #include "RefDequantizeWorkload.hpp" #include "RefQuantizeWorkload.hpp"
\ No newline at end of file |