blob: c9a5a6d33be0f4c25263d6d8930be886b8eb2503 [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;
Sadik Armagan188675f2021-02-12 17:16:42 +000022using RequestArgument = V1_0::RequestArgument;
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010023
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010024namespace
25{
26
Kevin Mayedc5ffa2019-05-22 12:02:53 +010027#ifndef ARMCOMPUTECL_ENABLED
Colm Doneland7fdbe22020-10-30 16:57:43 +000028 static const std::array<armnn::Compute, 1> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef }};
Kevin Mayedc5ffa2019-05-22 12:02:53 +010029#else
Colm Doneland7fdbe22020-10-30 16:57:43 +000030 static const std::array<armnn::Compute, 2> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef, armnn::Compute::GpuAcc }};
Kevin Mayedc5ffa2019-05-22 12:02:53 +010031#endif
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010032
33void MeanTestImpl(const TestTensor& input,
34 const hidl_vec<uint32_t>& axisDimensions,
35 const int32_t* axisValues,
36 int32_t keepDims,
37 const TestTensor& expectedOutput,
38 bool fp16Enabled,
39 armnn::Compute computeDevice)
40{
41 auto driver = std::make_unique<ArmnnDriver>(DriverOptions(computeDevice, fp16Enabled));
42
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010043 HalPolicy::Model model = {};
44
45 AddInputOperand<HalPolicy>(model, input.GetDimensions());
46
47 AddTensorOperand<HalPolicy>(model,
48 axisDimensions,
49 const_cast<int32_t*>(axisValues),
50 HalPolicy::OperandType::TENSOR_INT32);
51
52 AddIntOperand<HalPolicy>(model, keepDims);
53
54 AddOutputOperand<HalPolicy>(model, expectedOutput.GetDimensions());
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010055
56 model.operations.resize(1);
Aron Virginas-Tar44cfd842019-06-14 15:45:03 +010057 model.operations[0].type = HalPolicy::OperationType::MEAN;
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010058 model.operations[0].inputs = hidl_vec<uint32_t>{ 0, 1, 2 };
59 model.operations[0].outputs = hidl_vec<uint32_t>{ 3 };
60 model.relaxComputationFloat32toFloat16 = fp16Enabled;
61
Sadik Armagand6539c52019-05-22 18:00:30 +010062 android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010063
64 // The request's memory pools will follow the same order as the inputs
Sadik Armagan188675f2021-02-12 17:16:42 +000065 V1_0::DataLocation inLoc = {};
66 inLoc.poolIndex = 0;
67 inLoc.offset = 0;
68 inLoc.length = input.GetNumElements() * sizeof(float);
69 RequestArgument inArg = {};
70 inArg.location = inLoc;
71 inArg.dimensions = input.GetDimensions();
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010072
73 // An additional memory pool is needed for the output
Sadik Armagan188675f2021-02-12 17:16:42 +000074 V1_0::DataLocation outLoc = {};
75 outLoc.poolIndex = 1;
76 outLoc.offset = 0;
77 outLoc.length = expectedOutput.GetNumElements() * sizeof(float);
78 RequestArgument outArg = {};
79 outArg.location = outLoc;
80 outArg.dimensions = expectedOutput.GetDimensions();
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010081
82 // Make the request based on the arguments
Kevin Mayec1e5b82020-02-26 17:00:39 +000083 V1_0::Request request = {};
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010084 request.inputs = hidl_vec<RequestArgument>{ inArg };
85 request.outputs = hidl_vec<RequestArgument>{ outArg };
86
87 // Set the input data
88 AddPoolAndSetData(input.GetNumElements(), request, input.GetData());
89
90 // Add memory for the output
Ellen Norris-Thompson976ad3e2019-08-21 15:21:14 +010091 android::sp<IMemory> outMemory = AddPoolAndGetData<float>(expectedOutput.GetNumElements(), request);
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010092 const float* outputData = static_cast<const float*>(static_cast<void*>(outMemory->getPointer()));
93
Sadik Armagand4636872020-04-27 10:15:41 +010094 if (preparedModel.get() != nullptr)
95 {
96 V1_0::ErrorStatus execStatus = Execute(preparedModel, request);
97 BOOST_TEST(execStatus == V1_0::ErrorStatus::NONE);
98 }
Matteo Martincigh8d50f8f2018-10-25 15:39:33 +010099
100 const float* expectedOutputData = expectedOutput.GetData();
101 for (unsigned int i = 0; i < expectedOutput.GetNumElements(); i++)
102 {
103 BOOST_TEST(outputData[i] == expectedOutputData[i]);
104 }
105}
106
107} // anonymous namespace
108
109BOOST_DATA_TEST_CASE(MeanNoKeepDimsTest, COMPUTE_DEVICES)
110{
111 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,
112 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
113 20.0f, 21.0f, 22.0f, 23.0f, 24.0f } };
114 hidl_vec<uint32_t> axisDimensions = { 2 };
115 int32_t axisValues[] = { 0, 1 };
116 int32_t keepDims = 0;
117 TestTensor expectedOutput{ armnn::TensorShape{ 2 }, { 12.0f, 13.0f } };
118
119 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, false, sample);
120}
121
122BOOST_DATA_TEST_CASE(MeanKeepDimsTest, COMPUTE_DEVICES)
123{
124 TestTensor input{ armnn::TensorShape{ 1, 1, 3, 2 }, { 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f } };
125 hidl_vec<uint32_t> axisDimensions = { 1 };
126 int32_t axisValues[] = { 2 };
127 int32_t keepDims = 1;
128 TestTensor expectedOutput{ armnn::TensorShape{ 1, 1, 1, 2 }, { 2.0f, 2.0f } };
129
130 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, false, sample);
131}
132
133BOOST_DATA_TEST_CASE(MeanFp16NoKeepDimsTest, COMPUTE_DEVICES)
134{
135 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,
136 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f, 19.0f,
137 20.0f, 21.0f, 22.0f, 23.0f, 24.0f } };
138 hidl_vec<uint32_t> axisDimensions = { 2 };
139 int32_t axisValues[] = { 0, 1 };
140 int32_t keepDims = 0;
141 TestTensor expectedOutput{ armnn::TensorShape{ 2 }, { 12.0f, 13.0f } };
142
143 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, true, sample);
144}
145
146BOOST_DATA_TEST_CASE(MeanFp16KeepDimsTest, COMPUTE_DEVICES)
147{
148 TestTensor input{ armnn::TensorShape{ 1, 1, 3, 2 }, { 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f } };
149 hidl_vec<uint32_t> axisDimensions = { 1 };
150 int32_t axisValues[] = { 2 };
151 int32_t keepDims = 1;
152 TestTensor expectedOutput{ armnn::TensorShape{ 1, 1, 1, 2 }, { 2.0f, 2.0f } };
153
154 MeanTestImpl(input, axisDimensions, axisValues, keepDims, expectedOutput, true, sample);
155}
156
157BOOST_AUTO_TEST_SUITE_END()