blob: 36a875af420d11c5cc47697cd5bb6f10c49c5b22 [file] [log] [blame]
josh minor4a3c6102020-01-06 16:40:46 -06001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
josh minor4a3c6102020-01-06 16:40:46 -06003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Sadik Armagana097d2a2021-11-24 15:47:28 +00008#include <armnnTestUtils/LayerTestResult.hpp>
josh minor4a3c6102020-01-06 16:40:46 -06009
10#include <armnn/ArmNN.hpp>
11
12#include <ResolveType.hpp>
13
14#include <armnn/backends/IBackendInternal.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000015#include <armnn/backends/Workload.hpp>
16#include <armnn/backends/WorkloadData.hpp>
17#include <armnn/backends/WorkloadFactory.hpp>
josh minor4a3c6102020-01-06 16:40:46 -060018
Sadik Armagana097d2a2021-11-24 15:47:28 +000019#include <DataTypeUtils.hpp>
20#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000021#include <armnnTestUtils/WorkloadTestUtils.hpp>
josh minor4a3c6102020-01-06 16:40:46 -060022
Colm Donelanc42a9872022-02-02 16:35:09 +000023#include <armnnTestUtils/TensorHelpers.hpp>
josh minor4a3c6102020-01-06 16:40:46 -060024
25#include <memory>
26
27std::unique_ptr<armnn::IWorkload> CreateWorkload(
28 const armnn::IWorkloadFactory& workloadFactory,
29 const armnn::WorkloadInfo& info,
30 const armnn::ElementwiseUnaryQueueDescriptor& descriptor);
31
32template <std::size_t NumDims,
33 armnn::DataType ArmnnType,
34 typename T = armnn::ResolveType<ArmnnType>>
35LayerTestResult<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,
Keith Davis33a626f2020-08-27 15:38:12 +010045 const armnn::ITensorHandleFactory& tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -060046 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
Sadik Armagan483c8112021-06-01 09:24:52 +010058 std::vector<T> input = ConvertToDataType<ArmnnType>(values, inputTensorInfo);
59 std::vector<T> expectedOutput = ConvertToDataType<ArmnnType>(outValues, inputTensorInfo);
60 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
josh minor4a3c6102020-01-06 16:40:46 -060061
Keith Davis33a626f2020-08-27 15:38:12 +010062 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
63 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
josh minor4a3c6102020-01-06 16:40:46 -060064
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
Sadik Armagan483c8112021-06-01 09:24:52 +010076 CopyDataToITensorHandle(inputHandle.get(), input.data());
josh minor4a3c6102020-01-06 16:40:46 -060077
78 workload->PostAllocationConfigure();
79 ExecuteWorkload(*workload, memoryManager);
80
Sadik Armagan483c8112021-06-01 09:24:52 +010081 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
josh minor4a3c6102020-01-06 16:40:46 -060082
Sadik Armagan483c8112021-06-01 09:24:52 +010083 return LayerTestResult<T, NumDims>(actualOutput,
84 expectedOutput,
85 outputHandle->GetShape(),
86 outputTensorInfo.GetShape());
87
josh minor4a3c6102020-01-06 16:40:46 -060088}
89
90template <std::size_t NumDims,
91 armnn::DataType ArmnnType,
92 typename T = armnn::ResolveType<ArmnnType>>
93LayerTestResult<T, NumDims> ElementwiseUnaryTestHelper(
94 armnn::IWorkloadFactory & workloadFactory,
95 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
96 armnn::UnaryOperation op,
97 const unsigned int shape[NumDims],
98 std::vector<float> values,
99 const unsigned int outShape[NumDims],
100 std::vector<float> outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100101 const armnn::ITensorHandleFactory& tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -0600102 float quantScale = 1.0f,
103 int quantOffset = 0)
104{
105 return ElementwiseUnaryTestHelper<NumDims, ArmnnType>(
106 workloadFactory,
107 memoryManager,
108 op,
109 shape,
110 values,
111 quantScale,
112 quantOffset,
113 outShape,
114 outValues,
Keith Davis33a626f2020-08-27 15:38:12 +0100115 tensorHandleFactory,
josh minor4a3c6102020-01-06 16:40:46 -0600116 quantScale,
117 quantOffset);
118}