blob: 8c52d23d478af5670b123e9815a2d29812c4a9bc [file] [log] [blame]
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "../DriverTestHelpers.hpp"
7#include "../TestTensor.hpp"
8
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +01009#include "../1.1/HalPolicy.hpp"
10
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010011#include <boost/test/data/test_case.hpp>
12
Colm Doneland7fdbe22020-10-30 16:57:43 +000013#include <array>
14
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010015BOOST_AUTO_TEST_SUITE(MeanTests)
16
17using namespace android::hardware;
18using namespace driverTestHelpers;
19using namespace armnn_driver;
20
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010021using HalPolicy = hal_1_1::HalPolicy;
22
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010023namespace
24{
25
Kevin Mayedc5ffa2019-05-22 12:02:53 +010026#ifndef ARMCOMPUTECL_ENABLED
Colm Doneland7fdbe22020-10-30 16:57:43 +000027 static const std::array<armnn::Compute, 1> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef }};
Kevin Mayedc5ffa2019-05-22 12:02:53 +010028#else
Colm Doneland7fdbe22020-10-30 16:57:43 +000029 static const std::array<armnn::Compute, 2> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef, armnn::Compute::GpuAcc }};
Kevin Mayedc5ffa2019-05-22 12:02:53 +010030#endif
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010031
32void MeanTestImpl(const TestTensor& input,
33 const hidl_vec<uint32_t>& axisDimensions,
34 const int32_t* axisValues,
35 int32_t keepDims,
36 const TestTensor& expectedOutput,
37 bool fp16Enabled,
38 armnn::Compute computeDevice)
39{
40 auto driver = std::make_unique<ArmnnDriver>(DriverOptions(computeDevice, fp16Enabled));
41
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010042 HalPolicy::Model model = {};
43
44 AddInputOperand<HalPolicy>(model, input.GetDimensions());
45
46 AddTensorOperand<HalPolicy>(model,
47 axisDimensions,
48 const_cast<int32_t*>(axisValues),
49 HalPolicy::OperandType::TENSOR_INT32);
50
51 AddIntOperand<HalPolicy>(model, keepDims);
52
53 AddOutputOperand<HalPolicy>(model, expectedOutput.GetDimensions());
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010054
55 model.operations.resize(1);
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010056 model.operations[0].type = HalPolicy::OperationType::MEAN;
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010057 model.operations[0].inputs = hidl_vec<uint32_t>{ 0, 1, 2 };
58 model.operations[0].outputs = hidl_vec<uint32_t>{ 3 };
59 model.relaxComputationFloat32toFloat16 = fp16Enabled;
60
Sadik Armagand6539c52019-05-22 18:00:30 +010061 android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010062
63 // The request's memory pools will follow the same order as the inputs
64 DataLocation inLoc = {};
65 inLoc.poolIndex = 0;
66 inLoc.offset = 0;
67 inLoc.length = input.GetNumElements() * sizeof(float);
68 RequestArgument inArg = {};
69 inArg.location = inLoc;
70 inArg.dimensions = input.GetDimensions();
71
72 // An additional memory pool is needed for the output
73 DataLocation outLoc = {};
74 outLoc.poolIndex = 1;
75 outLoc.offset = 0;
76 outLoc.length = expectedOutput.GetNumElements() * sizeof(float);
77 RequestArgument outArg = {};
78 outArg.location = outLoc;
79 outArg.dimensions = expectedOutput.GetDimensions();
80
81 // Make the request based on the arguments
Kevin Mayec1e5b82020-02-26 17:00:39 +000082 V1_0::Request request = {};
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010083 request.inputs = hidl_vec<RequestArgument>{ inArg };
84 request.outputs = hidl_vec<RequestArgument>{ outArg };
85
86 // Set the input data
87 AddPoolAndSetData(input.GetNumElements(), request, input.GetData());
88
89 // Add memory for the output
Ellen Norris-Thompson976ad3e2019-08-21 15:21:14 +010090 android::sp<IMemory> outMemory = AddPoolAndGetData<float>(expectedOutput.GetNumElements(), request);
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010091 const float* outputData = static_cast<const float*>(static_cast<void*>(outMemory->getPointer()));
92
Sadik Armagand4636872020-04-27 10:15:41 +010093 if (preparedModel.get() != nullptr)
94 {
95 V1_0::ErrorStatus execStatus = Execute(preparedModel, request);
96 BOOST_TEST(execStatus == V1_0::ErrorStatus::NONE);
97 }
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010098
99 const float* expectedOutputData = expectedOutput.GetData();
100 for (unsigned int i = 0; i < expectedOutput.GetNumElements(); i++)
101 {
102 BOOST_TEST(outputData[i] == expectedOutputData[i]);
103 }
104}
105
106} // anonymous namespace
107
108BOOST_DATA_TEST_CASE(MeanNoKeepDimsTest, COMPUTE_DEVICES)
109{
110 TestTensor input{ armnn::TensorShape{ 4, 3, 2 }, { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
111 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
112 20.0f, 21.0f, 22.0f, 23.0f, 24.0f } };
113 hidl_vec<uint32_t> axisDimensions = { 2 };
114 int32_t axisValues[] = { 0, 1 };
115 int32_t keepDims = 0;
116 TestTensor expectedOutput{ armnn::TensorShape{ 2 }, { 12.0f, 13.0f } };
117
118 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, false, sample);
119}
120
121BOOST_DATA_TEST_CASE(MeanKeepDimsTest, COMPUTE_DEVICES)
122{
123 TestTensor input{ armnn::TensorShape{ 1, 1, 3, 2 }, { 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f } };
124 hidl_vec<uint32_t> axisDimensions = { 1 };
125 int32_t axisValues[] = { 2 };
126 int32_t keepDims = 1;
127 TestTensor expectedOutput{ armnn::TensorShape{ 1, 1, 1, 2 }, { 2.0f, 2.0f } };
128
129 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, false, sample);
130}
131
132BOOST_DATA_TEST_CASE(MeanFp16NoKeepDimsTest, COMPUTE_DEVICES)
133{
134 TestTensor input{ armnn::TensorShape{ 4, 3, 2 }, { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
135 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
136 20.0f, 21.0f, 22.0f, 23.0f, 24.0f } };
137 hidl_vec<uint32_t> axisDimensions = { 2 };
138 int32_t axisValues[] = { 0, 1 };
139 int32_t keepDims = 0;
140 TestTensor expectedOutput{ armnn::TensorShape{ 2 }, { 12.0f, 13.0f } };
141
142 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, true, sample);
143}
144
145BOOST_DATA_TEST_CASE(MeanFp16KeepDimsTest, COMPUTE_DEVICES)
146{
147 TestTensor input{ armnn::TensorShape{ 1, 1, 3, 2 }, { 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f } };
148 hidl_vec<uint32_t> axisDimensions = { 1 };
149 int32_t axisValues[] = { 2 };
150 int32_t keepDims = 1;
151 TestTensor expectedOutput{ armnn::TensorShape{ 1, 1, 1, 2 }, { 2.0f, 2.0f } };
152
153 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, true, sample);
154}
155
156BOOST_AUTO_TEST_SUITE_END()