1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #pragma once
7
8 #include "LayerTestResult.hpp"
9
10 #include <armnn/ArmNN.hpp>
11
12 #include <ResolveType.hpp>
13
14 #include <armnn/backends/IBackendInternal.hpp>
15 #include <backendsCommon/Workload.hpp>
16 #include <backendsCommon/WorkloadData.hpp>
17 #include <backendsCommon/WorkloadFactory.hpp>
18
19 #include <backendsCommon/test/DataTypeUtils.hpp>
20 #include <backendsCommon/test/TensorCopyUtils.hpp>
21 #include <backendsCommon/test/WorkloadTestUtils.hpp>
22
23 #include <test/TensorHelpers.hpp>
24
25 #include <memory>
26
27 std::unique_ptr<armnn::IWorkload> CreateWorkload(
28 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const armnn::ElementwiseUnaryQueueDescriptor& descriptor);
31
32 template <std::size_t NumDims,
33 armnn::DataType ArmnnType,
34 typename T = armnn::ResolveType<ArmnnType>>
ElementwiseUnaryTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::UnaryOperation op,const unsigned int shape[NumDims],std::vector<float> values,float quantScale,int quantOffset,const unsigned int outShape[NumDims],std::vector<float> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float outQuantScale,int outQuantOffset)35 LayerTestResult<T, NumDims> ElementwiseUnaryTestHelper(
36 armnn::IWorkloadFactory & workloadFactory,
37 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
38 armnn::UnaryOperation op,
39 const unsigned int shape[NumDims],
40 std::vector<float> values,
41 float quantScale,
42 int quantOffset,
43 const unsigned int outShape[NumDims],
44 std::vector<float> outValues,
45 const armnn::ITensorHandleFactory& tensorHandleFactory,
46 float outQuantScale,
47 int outQuantOffset)
48 {
49 armnn::TensorInfo inputTensorInfo{NumDims, shape, ArmnnType};
50 armnn::TensorInfo outputTensorInfo{NumDims, outShape, ArmnnType};
51
52 inputTensorInfo.SetQuantizationScale(quantScale);
53 inputTensorInfo.SetQuantizationOffset(quantOffset);
54
55 outputTensorInfo.SetQuantizationScale(outQuantScale);
56 outputTensorInfo.SetQuantizationOffset(outQuantOffset);
57
58 auto input = MakeTensor<T, NumDims>(inputTensorInfo, ConvertToDataType<ArmnnType>(values, inputTensorInfo));
59
60 LayerTestResult<T, NumDims> ret(outputTensorInfo);
61
62 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
63 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
64
65 armnn::ElementwiseUnaryDescriptor desc(op);
66 armnn::ElementwiseUnaryQueueDescriptor qDesc;
67 qDesc.m_Parameters = desc;
68 armnn::WorkloadInfo info;
69 AddInputToWorkload(qDesc, info, inputTensorInfo, inputHandle.get());
70 AddOutputToWorkload(qDesc, info, outputTensorInfo, outputHandle.get());
71 auto workload = CreateWorkload(workloadFactory, info, qDesc);
72
73 inputHandle->Allocate();
74 outputHandle->Allocate();
75
76 CopyDataToITensorHandle(inputHandle.get(), input.origin());
77
78 workload->PostAllocationConfigure();
79 ExecuteWorkload(*workload, memoryManager);
80
81 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
82
83 ret.outputExpected = MakeTensor<T, NumDims>(outputTensorInfo, ConvertToDataType<ArmnnType>(outValues,
84 inputTensorInfo));
85 return ret;
86 }
87
88 template <std::size_t NumDims,
89 armnn::DataType ArmnnType,
90 typename T = armnn::ResolveType<ArmnnType>>
ElementwiseUnaryTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::UnaryOperation op,const unsigned int shape[NumDims],std::vector<float> values,const unsigned int outShape[NumDims],std::vector<float> outValues,const armnn::ITensorHandleFactory & tensorHandleFactory,float quantScale=1.0f,int quantOffset=0)91 LayerTestResult<T, NumDims> ElementwiseUnaryTestHelper(
92 armnn::IWorkloadFactory & workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
94 armnn::UnaryOperation op,
95 const unsigned int shape[NumDims],
96 std::vector<float> values,
97 const unsigned int outShape[NumDims],
98 std::vector<float> outValues,
99 const armnn::ITensorHandleFactory& tensorHandleFactory,
100 float quantScale = 1.0f,
101 int quantOffset = 0)
102 {
103 return ElementwiseUnaryTestHelper<NumDims, ArmnnType>(
104 workloadFactory,
105 memoryManager,
106 op,
107 shape,
108 values,
109 quantScale,
110 quantOffset,
111 outShape,
112 outValues,
113 tensorHandleFactory,
114 quantScale,
115 quantOffset);
116 }