| // |
| // 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 "Maximum.hpp" |
| #include "Minimum.hpp" |
| #include "StringMapping.hpp" |
| |
| namespace armnn |
| { |
| |
| template <typename Functor, |
| typename armnn::DataType DataType, |
| typename ParentDescriptor, |
| typename armnn::StringMapping::Id DebugString> |
| class RefElementwiseWorkload |
| { |
| // Needs specialization. The default is empty on purpose. |
| }; |
| |
| template <typename ParentDescriptor, typename Functor> |
| class BaseFloat32ElementwiseWorkload : public Float32Workload<ParentDescriptor> |
| { |
| public: |
| using Float32Workload<ParentDescriptor>::Float32Workload; |
| void ExecuteImpl(const char * debugString) const; |
| }; |
| |
| template <typename Functor, |
| typename ParentDescriptor, |
| typename armnn::StringMapping::Id DebugString> |
| class RefElementwiseWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString> |
| : public BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor> |
| { |
| public: |
| using BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>::BaseFloat32ElementwiseWorkload; |
| |
| virtual void Execute() const override |
| { |
| using Parent = BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>; |
| Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString)); |
| } |
| }; |
| |
| template <typename ParentDescriptor, typename Functor> |
| class BaseUint8ElementwiseWorkload : public Uint8Workload<ParentDescriptor> |
| { |
| public: |
| using Uint8Workload<ParentDescriptor>::Uint8Workload; |
| void ExecuteImpl(const char * debugString) const; |
| }; |
| |
| template <typename Functor, |
| typename ParentDescriptor, |
| typename armnn::StringMapping::Id DebugString> |
| class RefElementwiseWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString> |
| : public BaseUint8ElementwiseWorkload<ParentDescriptor, Functor> |
| { |
| public: |
| using BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>::BaseUint8ElementwiseWorkload; |
| |
| virtual void Execute() const override |
| { |
| using Parent = BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>; |
| Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString)); |
| } |
| }; |
| |
| using RefAdditionFloat32Workload = |
| RefElementwiseWorkload<std::plus<float>, |
| DataType::Float32, |
| AdditionQueueDescriptor, |
| StringMapping::RefAdditionWorkload_Execute>; |
| |
| using RefAdditionUint8Workload = |
| RefElementwiseWorkload<std::plus<float>, |
| DataType::QuantisedAsymm8, |
| AdditionQueueDescriptor, |
| StringMapping::RefAdditionWorkload_Execute>; |
| |
| using RefSubtractionFloat32Workload = |
| RefElementwiseWorkload<std::minus<float>, |
| DataType::Float32, |
| SubtractionQueueDescriptor, |
| StringMapping::RefSubtractionWorkload_Execute>; |
| |
| using RefSubtractionUint8Workload = |
| RefElementwiseWorkload<std::minus<float>, |
| DataType::QuantisedAsymm8, |
| SubtractionQueueDescriptor, |
| StringMapping::RefSubtractionWorkload_Execute>; |
| |
| using RefMultiplicationFloat32Workload = |
| RefElementwiseWorkload<std::multiplies<float>, |
| DataType::Float32, |
| MultiplicationQueueDescriptor, |
| StringMapping::RefMultiplicationWorkload_Execute>; |
| |
| using RefMultiplicationUint8Workload = |
| RefElementwiseWorkload<std::multiplies<float>, |
| DataType::QuantisedAsymm8, |
| MultiplicationQueueDescriptor, |
| StringMapping::RefMultiplicationWorkload_Execute>; |
| |
| using RefDivisionFloat32Workload = |
| RefElementwiseWorkload<std::divides<float>, |
| DataType::Float32, |
| DivisionQueueDescriptor, |
| StringMapping::RefDivisionWorkload_Execute>; |
| |
| using RefDivisionUint8Workload = |
| RefElementwiseWorkload<std::divides<float>, |
| DataType::QuantisedAsymm8, |
| DivisionQueueDescriptor, |
| StringMapping::RefDivisionWorkload_Execute>; |
| |
| |
| using RefMaximumFloat32Workload = |
| RefElementwiseWorkload<armnn::maximum<float>, |
| DataType::Float32, |
| MaximumQueueDescriptor, |
| StringMapping::RefMaximumWorkload_Execute>; |
| |
| using RefMaximumUint8Workload = |
| RefElementwiseWorkload<armnn::maximum<float>, |
| DataType::QuantisedAsymm8, |
| MaximumQueueDescriptor, |
| StringMapping::RefMaximumWorkload_Execute>; |
| |
| using RefMinimumFloat32Workload = |
| RefElementwiseWorkload<minimum<float>, |
| DataType::Float32, |
| MinimumQueueDescriptor, |
| StringMapping::RefMinimumWorkload_Execute>; |
| |
| using RefMinimumUint8Workload = |
| RefElementwiseWorkload<minimum<float>, |
| DataType::QuantisedAsymm8, |
| MinimumQueueDescriptor, |
| StringMapping::RefMinimumWorkload_Execute>; |
| |
| using RefEqualFloat32Workload = |
| RefElementwiseWorkload<std::equal_to<float>, |
| DataType::Float32, |
| EqualQueueDescriptor, |
| StringMapping::RefEqualWorkload_Execute>; |
| |
| using RefEqualUint8Workload = |
| RefElementwiseWorkload<std::equal_to<float>, |
| DataType::QuantisedAsymm8, |
| EqualQueueDescriptor, |
| StringMapping::RefEqualWorkload_Execute>; |
| |
| using RefGreaterFloat32Workload = |
| RefElementwiseWorkload<std::greater<float>, |
| DataType::Float32, |
| GreaterQueueDescriptor, |
| StringMapping::RefGreaterWorkload_Execute>; |
| |
| using RefGreaterUint8Workload = |
| RefElementwiseWorkload<std::greater<float>, |
| DataType::QuantisedAsymm8, |
| GreaterQueueDescriptor, |
| StringMapping::RefGreaterWorkload_Execute>; |
| } // armnn |