diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 12 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/LayerTests.cpp | 24 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/LayerTests.hpp | 12 | ||||
-rw-r--r-- | src/backends/cl/test/ClLayerTests.cpp | 2 | ||||
-rw-r--r-- | src/backends/neon/test/NeonLayerTests.cpp | 2 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.cpp | 16 | ||||
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.cpp | 3 | ||||
-rw-r--r-- | src/backends/reference/RefWorkloadFactory.hpp | 1 | ||||
-rw-r--r-- | src/backends/reference/test/RefCreateWorkloadTests.cpp | 33 | ||||
-rw-r--r-- | src/backends/reference/test/RefLayerTests.cpp | 3 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefConstantWorkload.cpp | 41 | ||||
-rw-r--r-- | src/backends/reference/workloads/RefConstantWorkload.hpp | 20 |
12 files changed, 107 insertions, 62 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 335e7c5fcd..a3470ad601 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -812,6 +812,18 @@ void ConstantQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const "ConstantQueueDescriptor", "constant", "output"); + + // Check the supported data types + std::vector<DataType> supportedTypes = + { + DataType::Float32, + DataType::Float16, + DataType::Signed32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + ValidateDataTypes(workloadInfo.m_OutputTensorInfos[0], supportedTypes, "ConstantQueueDescriptor"); } void ReshapeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 980cd84d7c..52c9773b9f 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -6387,9 +6387,11 @@ LayerTestResult<T, 4> ConstantTestImpl( constexpr unsigned int outputChannels = inputChannels; constexpr unsigned int outputBatchSize = inputBatchSize; - armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType); + armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, + ArmnnType, qScale, qOffset); - armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType); + armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, + ArmnnType, qScale, qOffset); // Set quantization parameters if the requested type is a quantized type. if(armnn::IsQuantizedType<T>()) @@ -6471,7 +6473,14 @@ LayerTestResult<float, 4> ConstantTest( return ConstantTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0); } -LayerTestResult<uint8_t, 4> ConstantTestUint8( +LayerTestResult<int16_t, 4> ConstantInt16SimpleQuantizationScaleNoOffsetTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0); +} + +LayerTestResult<uint8_t, 4> ConstantUint8SimpleQuantizationScaleNoOffsetTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { @@ -8173,13 +8182,20 @@ LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest( 1.f/20.f, 50, armnn::DataLayout::NHWC); } -LayerTestResult<uint8_t, 4> ConstantUint8Test( +LayerTestResult<uint8_t, 4> ConstantUint8CustomQuantizationScaleAndOffsetTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 2e-6f, 1); } +LayerTestResult<int16_t, 4> ConstantInt16CustomQuantizationScaleAndOffsetTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 2e-6f, 1); +} + LayerTestResult<uint8_t, 1> Concatenation1dUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 60195cd534..76dc240488 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -774,7 +774,11 @@ LayerTestResult<float, 4> ConstantTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -LayerTestResult<uint8_t, 4> ConstantTestUint8( +LayerTestResult<uint8_t, 4> ConstantUint8SimpleQuantizationScaleNoOffsetTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<int16_t, 4> ConstantInt16SimpleQuantizationScaleNoOffsetTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); @@ -988,7 +992,11 @@ LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -LayerTestResult<uint8_t, 4> ConstantUint8Test( +LayerTestResult<uint8_t, 4> ConstantUint8CustomQuantizationScaleAndOffsetTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult<int16_t, 4> ConstantInt16CustomQuantizationScaleAndOffsetTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 0af1d34652..4d58778c93 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -260,7 +260,7 @@ ARMNN_AUTO_TEST_CASE(ResizeBilinearMagNhwc, ResizeBilinearMagTest, armnn::DataLa // Constant ARMNN_AUTO_TEST_CASE(Constant, ConstantTest) -ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantTestUint8) +ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantUint8SimpleQuantizationScaleNoOffsetTest) // Concat ARMNN_AUTO_TEST_CASE(Concatenation1d, Concatenation1dTest) diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index dce369dfa6..58618b4298 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -344,7 +344,7 @@ ARMNN_AUTO_TEST_CASE(BatchNormNhwc, BatchNormNhwcTest) // Constant ARMNN_AUTO_TEST_CASE(Constant, ConstantTest) -ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantTestUint8) +ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantUint8SimpleQuantizationScaleNoOffsetTest) // Concatenation ARMNN_AUTO_TEST_CASE(Concatenation1d, Concatenation1dTest) diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 858bd878ae..7beff72dad 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -306,13 +306,15 @@ bool RefLayerSupport::IsConcatSupported(const std::vector<const TensorInfo*> inp bool RefLayerSupport::IsConstantSupported(const TensorInfo& output, Optional<std::string&> reasonIfUnsupported) const { - return IsSupportedForDataTypeGeneric(reasonIfUnsupported, - output.GetDataType(), - &FalseFunc<>, - &TrueFunc<>, - &TrueFunc<>, - &TrueFunc<>, - &FalseFunc<>); + std::array<DataType,4> supportedTypes = { + DataType::Float32, + DataType::Signed32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + return CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, + "Reference constant: output is not a supported type."); } bool RefLayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input, diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 8c37fabe7c..45c43a92ac 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -253,8 +253,7 @@ std::unique_ptr<IWorkload> RefWorkloadFactory::CreateL2Normalization(const L2Nor std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper<NullWorkload, RefConstantFloat32Workload, RefConstantUint8Workload, - RefConstantInt32Workload, NullWorkload>(descriptor, info); + return std::make_unique<RefConstantWorkload>(descriptor, info); } std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor, diff --git a/src/backends/reference/RefWorkloadFactory.hpp b/src/backends/reference/RefWorkloadFactory.hpp index 86f1ec3c14..cbfcbfa363 100644 --- a/src/backends/reference/RefWorkloadFactory.hpp +++ b/src/backends/reference/RefWorkloadFactory.hpp @@ -187,7 +187,6 @@ private: template <typename F32Workload, typename U8Workload, typename QueueDescriptorType> std::unique_ptr<IWorkload> MakeWorkload(const QueueDescriptorType& descriptor, const WorkloadInfo& info) const; - }; } // namespace armnn diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 024bfe1e0c..4827d2867d 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -701,4 +701,37 @@ BOOST_AUTO_TEST_CASE(CreateMergerDim3Uint8Workload) RefCreateMergerWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }, 3); } +template <typename ConstantWorkloadType, armnn::DataType DataType> +static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape) +{ + armnn::Graph graph; + RefWorkloadFactory factory; + auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape); + + // Check output is as expected + auto queueDescriptor = workload->GetData(); + auto outputHandle = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]); + BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType))); +} + +BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload) +{ + RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }); +} + +BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload) +{ + RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QuantisedSymm16>({ 2, 3, 2, 10 }); +} + +BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload) +{ + RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }); +} + +BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload) +{ + RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 }); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 053de9e14f..55a25167f5 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -385,7 +385,8 @@ ARMNN_AUTO_TEST_CASE(PadUint84d, PadUint84dTest) // Constant ARMNN_AUTO_TEST_CASE(Constant, ConstantTest) -ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantUint8Test) +ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantUint8CustomQuantizationScaleAndOffsetTest) +ARMNN_AUTO_TEST_CASE(ConstantInt16, ConstantInt16CustomQuantizationScaleAndOffsetTest) // Concat ARMNN_AUTO_TEST_CASE(Concatenation1d, Concatenation1dTest) diff --git a/src/backends/reference/workloads/RefConstantWorkload.cpp b/src/backends/reference/workloads/RefConstantWorkload.cpp index e074c6fb04..3506198410 100644 --- a/src/backends/reference/workloads/RefConstantWorkload.cpp +++ b/src/backends/reference/workloads/RefConstantWorkload.cpp @@ -16,37 +16,26 @@ namespace armnn { -template <armnn::DataType DataType> -void RefConstantWorkload<DataType>::Execute() const -{ - // Considering the reference backend independently, it could be possible to initialise the intermediate tensor - // created by the layer output handler at workload construction time, rather than at workload execution time. - // However, this is not an option for other backends (e.g. CL). For consistency, we prefer to align all - // implementations. - // A similar argument can be made about performing the memory copy in the first place (the layer output handler - // could have a non-owning reference to the layer output tensor managed by the const input layer); again, this is - // not an option for other backends, and the extra complexity required to make this work for the reference backend - // may not be worth the effort (skipping a memory copy in the first inference). - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConstantWorkload_Execute"); +RefConstantWorkload::RefConstantWorkload( + const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload<ConstantQueueDescriptor>(descriptor, info) {} - if (!m_RanOnce) - { - const ConstantQueueDescriptor& data = this->m_Data; - - BOOST_ASSERT(data.m_LayerOutput != nullptr); +void RefConstantWorkload::PostAllocationConfigure() +{ + const ConstantQueueDescriptor& data = this->m_Data; - const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[0]); - BOOST_ASSERT(data.m_LayerOutput->GetTensorInfo().GetNumBytes() == outputInfo.GetNumBytes()); + BOOST_ASSERT(data.m_LayerOutput != nullptr); - memcpy(GetOutputTensorData<void>(0, data), data.m_LayerOutput->GetConstTensor<void>(), - outputInfo.GetNumBytes()); + const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[0]); + BOOST_ASSERT(data.m_LayerOutput->GetTensorInfo().GetNumBytes() == outputInfo.GetNumBytes()); - m_RanOnce = true; - } + memcpy(GetOutputTensorData<void>(0, data), data.m_LayerOutput->GetConstTensor<void>(), + outputInfo.GetNumBytes()); } -template class RefConstantWorkload<DataType::Float32>; -template class RefConstantWorkload<DataType::QuantisedAsymm8>; -template class RefConstantWorkload<DataType::Signed32>; +void RefConstantWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConstantWorkload_Execute"); +} } //namespace armnn diff --git a/src/backends/reference/workloads/RefConstantWorkload.hpp b/src/backends/reference/workloads/RefConstantWorkload.hpp index 75d7ecce26..ada488a7b2 100644 --- a/src/backends/reference/workloads/RefConstantWorkload.hpp +++ b/src/backends/reference/workloads/RefConstantWorkload.hpp @@ -14,27 +14,13 @@ namespace armnn { // Base class template providing an implementation of the Constant layer common to all data types. -template <armnn::DataType DataType> -class RefConstantWorkload : public TypedWorkload<ConstantQueueDescriptor, DataType> +class RefConstantWorkload : public BaseWorkload<ConstantQueueDescriptor> { public: - RefConstantWorkload(const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info) - : TypedWorkload<ConstantQueueDescriptor, DataType>(descriptor, info) - , m_RanOnce(false) - { - } - - using TypedWorkload<ConstantQueueDescriptor, DataType>::m_Data; - using TypedWorkload<ConstantQueueDescriptor, DataType>::TypedWorkload; + RefConstantWorkload(const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info); + void PostAllocationConfigure() override; virtual void Execute() const override; - -private: - mutable bool m_RanOnce; }; -using RefConstantFloat32Workload = RefConstantWorkload<DataType::Float32>; -using RefConstantUint8Workload = RefConstantWorkload<DataType::QuantisedAsymm8>; -using RefConstantInt32Workload = RefConstantWorkload<DataType::Signed32>; - } //namespace armnn |