• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }