blob: 4e403283e73a5ba4ec4f0833c7c3d65e9bdc759c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlin8398edc2020-07-20 14:23:02 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
arovir0143095f32018-10-09 18:04:24 +01005
telsoa01c577f2c2018-08-31 09:22:23 +01006#include "ClContextControlFixture.hpp"
Aron Virginas-Tar56055192018-11-12 18:10:43 +00007#include "ClWorkloadFactoryHelper.hpp"
telsoa014fcda012018-03-09 14:13:49 +00008
Sadik Armagan04a72972020-09-14 15:44:18 +01009#include <armnn/utility/Assert.hpp>
10#include <armnn/utility/IgnoreUnused.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010011#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/MemCopyWorkload.hpp>
Sadik Armagane9444752020-12-02 11:28:58 +000013#include <backendsCommon/test/TensorCopyUtils.hpp>
14#include <backendsCommon/test/WorkloadTestUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010015
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010017#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010018
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000019#include <cl/ClTensorHandle.hpp>
20#include <cl/ClWorkloadFactory.hpp>
21#include <cl/workloads/ClWorkloads.hpp>
22#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010023
Sadik Armagan1625efc2021-06-10 18:24:34 +010024#include <doctest/doctest.h>
25
Colm Donelan25ab3a82021-05-17 13:01:52 +010026armnn::PredicateResult CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
27 std::initializer_list<unsigned int> expectedDimensions)
telsoa014fcda012018-03-09 14:13:49 +000028{
29 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
30}
31
Sadik Armagan1625efc2021-06-10 18:24:34 +010032TEST_SUITE("CreateWorkloadCl")
33{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010034template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010035static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000036{
37 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000038 ClWorkloadFactory factory =
39 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000040
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010041 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000042
telsoa01c577f2c2018-08-31 09:22:23 +010043 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000044 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010045 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
46 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000047
Colm Donelan25ab3a82021-05-17 13:01:52 +010048 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +010049 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010050
51 predResult = CompareIClTensorHandleShape(outputHandle, {1, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +010052 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +000053}
54
Sadik Armagan1625efc2021-06-10 18:24:34 +010055TEST_CASE_FIXTURE(ClContextControlFixture, "CreateActivationFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +010056{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010057 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010058}
59
Sadik Armagan1625efc2021-06-10 18:24:34 +010060TEST_CASE_FIXTURE(ClContextControlFixture, "CreateActivationFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +010061{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010062 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010063}
64
David Beck4a8692c2018-09-07 16:19:24 +010065template <typename WorkloadType,
66 typename DescriptorType,
67 typename LayerType,
68 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000069static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000070{
71 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000072 ClWorkloadFactory factory =
73 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
74
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000075 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000076
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000077 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010078 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010079 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
80 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
81 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +010082 auto predResult = CompareIClTensorHandleShape(inputHandle1, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010083 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010084 predResult = CompareIClTensorHandleShape(inputHandle2, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010085 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010086 predResult = CompareIClTensorHandleShape(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010087 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +000088}
89
Sadik Armagan1625efc2021-06-10 18:24:34 +010090TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +000091{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000092 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010093 AdditionQueueDescriptor,
94 AdditionLayer,
95 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010096}
97
Sadik Armagan1625efc2021-06-10 18:24:34 +010098TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +010099{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000100 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100101 AdditionQueueDescriptor,
102 AdditionLayer,
103 armnn::DataType::Float16>();
104}
105
Sadik Armagan1625efc2021-06-10 18:24:34 +0100106TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloatWorkload")
David Beck4a8692c2018-09-07 16:19:24 +0100107{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000108 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100109 SubtractionQueueDescriptor,
110 SubtractionLayer,
111 armnn::DataType::Float32>();
112}
113
Sadik Armagan1625efc2021-06-10 18:24:34 +0100114TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloat16Workload")
David Beck4a8692c2018-09-07 16:19:24 +0100115{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000116 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100117 SubtractionQueueDescriptor,
118 SubtractionLayer,
119 armnn::DataType::Float16>();
120}
121
Sadik Armagan1625efc2021-06-10 18:24:34 +0100122TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100123{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000124 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100125 MultiplicationQueueDescriptor,
126 MultiplicationLayer,
127 armnn::DataType::Float32>();
128}
129
Sadik Armagan1625efc2021-06-10 18:24:34 +0100130TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100131{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000132 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100133 MultiplicationQueueDescriptor,
134 MultiplicationLayer,
135 armnn::DataType::Float16>();
136}
137
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationUint8WorkloadTest")
Matthew Benthame2ec3302018-10-01 11:32:48 +0100139{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000140 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100141 MultiplicationQueueDescriptor,
142 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000143 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100144}
145
Sadik Armagan1625efc2021-06-10 18:24:34 +0100146TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100147{
Teresa Charline11e63d2021-04-21 12:56:45 +0100148 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100149 DivisionQueueDescriptor,
150 DivisionLayer,
151 armnn::DataType::Float32>();
152}
153
Sadik Armagan1625efc2021-06-10 18:24:34 +0100154TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100155{
Teresa Charline11e63d2021-04-21 12:56:45 +0100156 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100157 DivisionQueueDescriptor,
158 DivisionLayer,
159 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100160}
161
josh minor4a3c6102020-01-06 16:40:46 -0600162template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100163 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100164 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600165static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100166{
167 Graph graph;
168 ClWorkloadFactory factory =
169 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
170
josh minor4a3c6102020-01-06 16:40:46 -0600171 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100172
173 DescriptorType queueDescriptor = workload->GetData();
174
Jan Eilersbb446e52020-04-02 13:56:54 +0100175 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
176 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100177
Colm Donelan25ab3a82021-05-17 13:01:52 +0100178 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100179 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100180
181 predResult = CompareIClTensorHandleShape(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100182 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100183}
184
Sadik Armagan1625efc2021-06-10 18:24:34 +0100185TEST_CASE_FIXTURE(ClContextControlFixture, "CreateRsqrtFloat32WorkloadTest")
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100186{
josh minor4a3c6102020-01-06 16:40:46 -0600187 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
188 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100189}
190
telsoa01c577f2c2018-08-31 09:22:23 +0100191template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100192static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100193{
194 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000195 ClWorkloadFactory factory =
196 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000197
telsoa01c577f2c2018-08-31 09:22:23 +0100198 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100199 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000200
telsoa01c577f2c2018-08-31 09:22:23 +0100201 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000202 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100203 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
204 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000205
Colm Donelan25ab3a82021-05-17 13:01:52 +0100206 armnn::PredicateResult predResult(true);
207 switch (dataLayout)
Nikhil Rajd1340932018-10-18 14:27:50 +0100208 {
209 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +0100210 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100211 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100212 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100213 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100214 break;
215 default: // NCHW
Colm Donelan25ab3a82021-05-17 13:01:52 +0100216 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100217 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100218 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100219 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100220 }
telsoa014fcda012018-03-09 14:13:49 +0000221}
222
Sadik Armagan1625efc2021-06-10 18:24:34 +0100223TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000224{
Nikhil Rajd1340932018-10-18 14:27:50 +0100225 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
226 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100227}
telsoa014fcda012018-03-09 14:13:49 +0000228
Sadik Armagan1625efc2021-06-10 18:24:34 +0100229TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100230{
Nikhil Rajd1340932018-10-18 14:27:50 +0100231 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
232 armnn::DataType::Float16>(DataLayout::NCHW);
233}
234
Sadik Armagan1625efc2021-06-10 18:24:34 +0100235TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100236{
237 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
238 armnn::DataType::Float32>(DataLayout::NHWC);
239}
240
Sadik Armagan1625efc2021-06-10 18:24:34 +0100241TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationNhwcFloat16NhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100242{
243 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
244 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100245}
246
Sadik Armagan1625efc2021-06-10 18:24:34 +0100247TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp16ToFp32Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100248{
249 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000250 ClWorkloadFactory factory =
251 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
252
telsoa01c577f2c2018-08-31 09:22:23 +0100253 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
254
255 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100256 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
257 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100258 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100259 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100260 predResult = CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100261 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
262 CHECK((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
263 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
telsoa01c577f2c2018-08-31 09:22:23 +0100264}
265
Sadik Armagan1625efc2021-06-10 18:24:34 +0100266TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp32ToFp16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100267{
268 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000269 ClWorkloadFactory factory =
270 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
271
telsoa01c577f2c2018-08-31 09:22:23 +0100272 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
273
274 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100275 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
276 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100277
Colm Donelan25ab3a82021-05-17 13:01:52 +0100278 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100279 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100280 predResult = CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100281 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
282 CHECK((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
283 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
telsoa01c577f2c2018-08-31 09:22:23 +0100284}
285
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100286template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
287static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100288{
289 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000290 ClWorkloadFactory factory =
291 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
292
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100293 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
294 graph,
295 dataLayout);
296
Mike Kellydb482882019-06-14 12:35:24 +0100297 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
298 : std::initializer_list<unsigned int>({2, 8, 16, 3});
299 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
300 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100301
302 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000303 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100304 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
305 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100306 CHECK((inputHandle->GetShape() == inputShape));
307 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000308}
309
Sadik Armagan1625efc2021-06-10 18:24:34 +0100310TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000311{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100312 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100313}
314
Sadik Armagan1625efc2021-06-10 18:24:34 +0100315TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100316{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100317 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000318}
319
Sadik Armagan1625efc2021-06-10 18:24:34 +0100320TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NchwWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100321{
322 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
323}
324
Sadik Armagan1625efc2021-06-10 18:24:34 +0100325TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NhwcWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100326{
327 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
328}
329
Sadik Armagan1625efc2021-06-10 18:24:34 +0100330TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFastMathEnabledWorkload")
Sadik Armagan04a72972020-09-14 15:44:18 +0100331{
332 Graph graph;
333
334 using ModelOptions = std::vector<BackendOptions>;
335 ModelOptions modelOptions = {};
336 BackendOptions gpuAcc("GpuAcc",
337 {
338 { "FastMathEnabled", true }
339 });
340 modelOptions.push_back(gpuAcc);
341
342 ClWorkloadFactory factory =
343 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
344
345 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100346 CreateConvolution2dWorkloadFastMathTest<ClConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100347 graph,
348 DataLayout::NCHW,
349 modelOptions);
350
351 ARMNN_ASSERT(workload != nullptr);
352 auto conv2dWorkload = PolymorphicDowncast<ClConvolution2dWorkload*>(workload.get());
353 IgnoreUnused(conv2dWorkload);
354 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100355 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100356}
357
Sadik Armagan1625efc2021-06-10 18:24:34 +0100358TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dClCompiledContextWorkload")
Sadik Armagane9444752020-12-02 11:28:58 +0000359{
360 using namespace armnn;
361
362 const DataType inputType = DataType::QAsymmU8;
363 const DataType kernelType = DataType::QSymmS8;
364 const DataType biasType = DataType::Signed32;
365
366 TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128);
367 TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128);
368
369 const std::vector<float> quantScales{ 0.5f, 0.75f, 1.0f };
370 constexpr unsigned int quantDimension = 0;
371
372 TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension);
373
374 const std::vector<float> biasQuantScales{ 0.25f, 0.375f, 0.5f };
375 TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension);
376
377 std::vector<uint8_t> inputData =
378 {
379 138, 108, 138, 108, 138, 108
380 };
381
382 std::vector<int8_t> kernelData =
383 {
384 1, 2, 1, 2, 1, 2
385 };
386
387 std::vector<int32_t> biasData =
388 {
389 4, 4, 4
390 };
391
392 std::vector<uint8_t> expectedOutputData =
393 {
394 121, 118, 115, 121, 118, 115, 121, 118, 115
395 };
396
397
398 Convolution2dDescriptor descriptor;
399 descriptor.m_StrideX = 1;
400 descriptor.m_StrideY = 1;
401 descriptor.m_PadLeft = 0;
402 descriptor.m_PadRight = 0;
403 descriptor.m_PadTop = 0;
404 descriptor.m_PadBottom = 0;
405 descriptor.m_BiasEnabled = true;
406 descriptor.m_DataLayout = DataLayout::NHWC;
407
408 auto memoryManager = ClWorkloadFactoryHelper::GetMemoryManager();
409 auto clMemoryManager = armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager);
410 auto tensorHandleFactory = ClWorkloadFactoryHelper::GetTensorHandleFactory(memoryManager);
411
412 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
413 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
414
415
416 WorkloadInfo workloadInfo;
James Conroy1f58f032021-04-27 17:13:27 +0100417 ScopedTensorHandle weightTensor(kernelInfo);
418 ScopedTensorHandle biasTensor(biasInfo);
Sadik Armagane9444752020-12-02 11:28:58 +0000419
420 AllocateAndCopyDataToITensorHandle(&weightTensor, kernelData.data());
421 AllocateAndCopyDataToITensorHandle(&biasTensor, biasData.data());
422
423 Convolution2dQueueDescriptor queueDescriptor;
424 queueDescriptor.m_Parameters = descriptor;
425 queueDescriptor.m_Weight = &weightTensor;
426 queueDescriptor.m_Bias = &biasTensor;
427
428 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
429 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
430
431 // Initialize our m_CLCompileContext using default device and context
432 auto context = arm_compute::CLKernelLibrary::get().context();
433 auto device = arm_compute::CLKernelLibrary::get().get_device();
434 auto clCompileContext = arm_compute::CLCompileContext(context, device);
435
436
437
438 // Check built programs are empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100439 CHECK(clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000440
441 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
442 workloadInfo,
443 clMemoryManager->GetIntraLayerManager(),
444 clCompileContext);
445 ARMNN_ASSERT(workload != nullptr);
446 // Check built programs are not empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100447 CHECK(!clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000448}
449
Nikhil Rajcec6b652018-10-12 13:51:57 +0100450template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
451static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
452{
453 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000454 ClWorkloadFactory factory =
455 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100456
457 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
458 (factory, graph, dataLayout);
459
460 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
461 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100462 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
463 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100464
Mike Kellydb482882019-06-14 12:35:24 +0100465 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
466 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
467 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
468 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100469
Sadik Armagan1625efc2021-06-10 18:24:34 +0100470 CHECK((inputHandle->GetShape() == inputShape));
471 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100472}
473
Sadik Armagan1625efc2021-06-10 18:24:34 +0100474TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDepthwiseConvolutionFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100475{
476 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
477}
478
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100479template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100480static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000481{
telsoa01c577f2c2018-08-31 09:22:23 +0100482 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000483 ClWorkloadFactory factory =
484 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
485
Matthew Benthamd8067922018-10-03 17:18:04 +0100486 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000487
telsoa01c577f2c2018-08-31 09:22:23 +0100488 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000489 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100490 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
491 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100492 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100493 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100494 predResult = CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100495 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000496}
497
Sadik Armagan1625efc2021-06-10 18:24:34 +0100498TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000499{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100500 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100501}
502
Sadik Armagan1625efc2021-06-10 18:24:34 +0100503TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100504{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100505 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000506}
507
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000509{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000510 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000511}
512
telsoa01c577f2c2018-08-31 09:22:23 +0100513template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
514static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000515{
telsoa01c577f2c2018-08-31 09:22:23 +0100516 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000517 ClWorkloadFactory factory =
518 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
519
telsoa01c577f2c2018-08-31 09:22:23 +0100520 auto workload =
521 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000522
telsoa01c577f2c2018-08-31 09:22:23 +0100523 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000524 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100525 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
526 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100527 auto predResult = CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100528 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100529 predResult = CompareIClTensorHandleShape(outputHandle, {3, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100530 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000531}
532
telsoa01c577f2c2018-08-31 09:22:23 +0100533
Sadik Armagan1625efc2021-06-10 18:24:34 +0100534TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloatWorkloadTest")
telsoa014fcda012018-03-09 14:13:49 +0000535{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100536 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100537}
538
Sadik Armagan1625efc2021-06-10 18:24:34 +0100539TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100540{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100541 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100542}
543
telsoa01c577f2c2018-08-31 09:22:23 +0100544template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100545static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100546{
547 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000548 ClWorkloadFactory factory =
549 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
550
Matteo Martincigha160b242018-10-18 10:33:23 +0100551 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000552
telsoa01c577f2c2018-08-31 09:22:23 +0100553 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000554 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100555 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
556 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000557
Mike Kellydb482882019-06-14 12:35:24 +0100558 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
559 : std::initializer_list<unsigned int>({3, 1, 5, 5});
560 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
561 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100562
Sadik Armagan1625efc2021-06-10 18:24:34 +0100563 CHECK((inputHandle->GetShape() == inputShape));
564 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000565}
566
Sadik Armagan1625efc2021-06-10 18:24:34 +0100567TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000568{
narpra0155a97bc2018-10-02 14:35:53 +0100569 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100570}
571
Sadik Armagan1625efc2021-06-10 18:24:34 +0100572TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100573{
narpra0155a97bc2018-10-02 14:35:53 +0100574 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
575}
576
Sadik Armagan1625efc2021-06-10 18:24:34 +0100577TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100578{
579 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
580}
581
Sadik Armagan1625efc2021-06-10 18:24:34 +0100582TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100583{
584 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100585}
586
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100587template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100588static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100589{
590 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000591 ClWorkloadFactory factory =
592 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000593
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100594 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100595
Mike Kellydb482882019-06-14 12:35:24 +0100596 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
597 : std::initializer_list<unsigned int>({3, 5, 5, 2});
598 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
599 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000600
telsoa01c577f2c2018-08-31 09:22:23 +0100601 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000602 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100603 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
604 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000605
Sadik Armagan1625efc2021-06-10 18:24:34 +0100606 CHECK((inputHandle->GetShape() == inputShape));
607 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000608}
609
Sadik Armagan1625efc2021-06-10 18:24:34 +0100610TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100611{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100612 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100613}
614
Sadik Armagan1625efc2021-06-10 18:24:34 +0100615TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100616{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100617 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100618}
619
Sadik Armagan1625efc2021-06-10 18:24:34 +0100620TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100621{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100622 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100623}
624
Sadik Armagan1625efc2021-06-10 18:24:34 +0100625TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100626{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100627 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100628}
629
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100630static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
631 const armnn::TensorShape& alphaShape,
632 const armnn::TensorShape& outputShape,
633 armnn::DataType dataType)
634{
635 Graph graph;
636 ClWorkloadFactory factory =
637 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
638
639 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
640 graph,
641 inputShape,
642 alphaShape,
643 outputShape,
644 dataType);
645
646 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
647 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100648 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
649 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
650 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100651
Sadik Armagan1625efc2021-06-10 18:24:34 +0100652 CHECK((inputHandle->GetShape() == inputShape));
653 CHECK((alphaHandle->GetShape() == alphaShape));
654 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100655}
656
Sadik Armagan1625efc2021-06-10 18:24:34 +0100657TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloat16Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100658{
659 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
660}
661
Sadik Armagan1625efc2021-06-10 18:24:34 +0100662TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloatWorkload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100663{
664 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
665}
666
Sadik Armagan1625efc2021-06-10 18:24:34 +0100667TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluUint8Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100668{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000669 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100670}
671
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100672template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000673static void ClCreateReshapeWorkloadTest()
674{
telsoa01c577f2c2018-08-31 09:22:23 +0100675 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000676 ClWorkloadFactory factory =
677 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000678
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100679 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000680
telsoa01c577f2c2018-08-31 09:22:23 +0100681 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000682 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100683 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
684 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000685
Colm Donelan25ab3a82021-05-17 13:01:52 +0100686 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100687 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100688 predResult = CompareIClTensorHandleShape(outputHandle, {1, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100689 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000690}
691
Sadik Armagan1625efc2021-06-10 18:24:34 +0100692TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000693{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100694 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100695}
696
Sadik Armagan1625efc2021-06-10 18:24:34 +0100697TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100698{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100699 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000700}
701
Sadik Armagan1625efc2021-06-10 18:24:34 +0100702TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000703{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000704 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000705}
706
telsoa01c577f2c2018-08-31 09:22:23 +0100707template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
708static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000709{
telsoa01c577f2c2018-08-31 09:22:23 +0100710 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000711 ClWorkloadFactory factory =
712 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000713
telsoa01c577f2c2018-08-31 09:22:23 +0100714 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000715
arovir019e53a352018-08-31 15:26:35 +0100716 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000717 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100718 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
719 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000720
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100721 armnn::TensorInfo tensorInfo({4, 1}, DataType);
722 if (DataType == armnn::DataType::QAsymmU8)
723 {
724 tensorInfo.SetQuantizationOffset(0);
725 tensorInfo.SetQuantizationScale(1.f / 256);
726 }
727 else if (DataType == armnn::DataType::QAsymmS8)
728 {
729 tensorInfo.SetQuantizationOffset(-128);
730 tensorInfo.SetQuantizationScale(1.f / 256);
731 }
732
Colm Donelan25ab3a82021-05-17 13:01:52 +0100733 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100734 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100735 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100736 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000737}
738
telsoa01c577f2c2018-08-31 09:22:23 +0100739
Sadik Armagan1625efc2021-06-10 18:24:34 +0100740TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat32WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100741{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100742 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100743}
744
Sadik Armagan1625efc2021-06-10 18:24:34 +0100745TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100746{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100747 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
748}
749
Sadik Armagan1625efc2021-06-10 18:24:34 +0100750TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmU8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100751{
752 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
753}
754
Sadik Armagan1625efc2021-06-10 18:24:34 +0100755TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmS8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100756{
757 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100758}
759
Matthew Bentham29cadb32018-10-01 17:22:32 +0100760template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100761static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000762{
763 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000764 ClWorkloadFactory factory =
765 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000766
Matthew Bentham29cadb32018-10-01 17:22:32 +0100767 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000768
telsoa01c577f2c2018-08-31 09:22:23 +0100769 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000770 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100771 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100772 auto predResult = CompareIClTensorHandleShape(inputHandle, {5, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100773 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100774
Jan Eilersbb446e52020-04-02 13:56:54 +0100775 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100776 predResult = CompareIClTensorHandleShape(outputHandle1, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100777 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100778
Jan Eilersbb446e52020-04-02 13:56:54 +0100779 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100780 predResult = CompareIClTensorHandleShape(outputHandle2, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100781 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100782
Jan Eilersbb446e52020-04-02 13:56:54 +0100783 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100784 predResult = CompareIClTensorHandleShape(outputHandle0, {1, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100785 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000786}
787
Sadik Armagan1625efc2021-06-10 18:24:34 +0100788TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000789{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100790 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100791}
792
Sadik Armagan1625efc2021-06-10 18:24:34 +0100793TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100794{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100795 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100796}
797
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100798template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100799static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100800{
801 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100802 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000803 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100804 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
805 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000806
807 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000808 ClWorkloadFactory factory =
809 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000810
811 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100812 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100813 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000814
815 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100816 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000817
telsoa01c577f2c2018-08-31 09:22:23 +0100818 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000819 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
820 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100821 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
822 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000823
Sadik Armagan1625efc2021-06-10 18:24:34 +0100824 CHECK(sOut0);
825 CHECK(sOut1);
826 CHECK(mIn0);
827 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000828
telsoa01c577f2c2018-08-31 09:22:23 +0100829 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000830 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000832
833
telsoa01c577f2c2018-08-31 09:22:23 +0100834 //Also make sure that the inputs are subtensors of one tensor and outputs are sub tensors of another tensor.
telsoa014fcda012018-03-09 14:13:49 +0000835 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
836 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
837
Sadik Armagan1625efc2021-06-10 18:24:34 +0100838 CHECK(validSubTensorParents);
telsoa014fcda012018-03-09 14:13:49 +0000839}
840
Sadik Armagan1625efc2021-06-10 18:24:34 +0100841TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100842{
Jim Flynne242f2d2019-05-22 14:24:13 +0100843 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100844}
845
Sadik Armagan1625efc2021-06-10 18:24:34 +0100846TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100847{
Jim Flynne242f2d2019-05-22 14:24:13 +0100848 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100849}
850
851
Sadik Armagan1625efc2021-06-10 18:24:34 +0100852TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000853{
854 // Test that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100855 // We create a splitter with two outputs. That each of those outputs is used by two different activation layers.
telsoa014fcda012018-03-09 14:13:49 +0000856
857 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000858 ClWorkloadFactory factory =
859 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
860
Matthew Bentham29cadb32018-10-01 17:22:32 +0100861 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100862 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
863 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
864 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
865 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000866
Matthew Bentham29cadb32018-10-01 17:22:32 +0100867 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100868 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100869 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000870
telsoa01c577f2c2018-08-31 09:22:23 +0100871 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000872 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
873 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
874 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
875 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
876 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
877 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
878
879
Sadik Armagan1625efc2021-06-10 18:24:34 +0100880 CHECK(sOut0);
881 CHECK(sOut1);
882 CHECK(activ0_0Im);
883 CHECK(activ0_1Im);
884 CHECK(activ1_0Im);
885 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000886
887 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
888 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
889
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000891}
892
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100893#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100894
895// This test unit needs the reference backend, it's not available if the reference backend is not built
896
Sadik Armagan1625efc2021-06-10 18:24:34 +0100897TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMemCopyWorkloadsCl")
telsoa014fcda012018-03-09 14:13:49 +0000898{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000899 ClWorkloadFactory factory =
900 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
901
telsoa01c577f2c2018-08-31 09:22:23 +0100902 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000903}
904
Matteo Martincighe67edb22019-08-14 14:05:46 +0100905#endif
906
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100907template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
908static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000909{
telsoa01c577f2c2018-08-31 09:22:23 +0100910 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000911 ClWorkloadFactory factory =
912 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
913
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100914 auto workload =
915 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000916
telsoa01c577f2c2018-08-31 09:22:23 +0100917 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000918 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100919 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
920 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000921
Mike Kellydb482882019-06-14 12:35:24 +0100922 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
923 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
924 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
925 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100926
Sadik Armagan1625efc2021-06-10 18:24:34 +0100927 CHECK((inputHandle->GetShape() == inputShape));
928 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000929}
930
Sadik Armagan1625efc2021-06-10 18:24:34 +0100931TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100932{
933 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
934}
935
Sadik Armagan1625efc2021-06-10 18:24:34 +0100936TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100937{
938 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
939}
940
Sadik Armagan1625efc2021-06-10 18:24:34 +0100941TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100942{
943 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
944}
945
Sadik Armagan1625efc2021-06-10 18:24:34 +0100946TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100947{
948 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
949}
950
Teresa Charlin8398edc2020-07-20 14:23:02 +0100951template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
952static void ClCreateLogSoftmaxWorkloadTest()
953{
954 Graph graph;
955 ClWorkloadFactory factory =
956 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
957
958 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
959
960 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
961 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
962 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
963 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
964
Colm Donelan25ab3a82021-05-17 13:01:52 +0100965 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100966 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100967 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100968 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Teresa Charlin8398edc2020-07-20 14:23:02 +0100969}
970
Sadik Armagan1625efc2021-06-10 18:24:34 +0100971TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLogSoftmaxFloat32WorkloadTest")
Teresa Charlin8398edc2020-07-20 14:23:02 +0100972{
973 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
974}
975
telsoa01c577f2c2018-08-31 09:22:23 +0100976template <typename LstmWorkloadType>
977static void ClCreateLstmWorkloadTest()
978{
979 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000980 ClWorkloadFactory factory =
981 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
982
telsoa01c577f2c2018-08-31 09:22:23 +0100983 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
984
985 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100986 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
987 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100988 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 2});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100989 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100990 predResult = CompareIClTensorHandleShape(outputHandle, {2, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100991 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa01c577f2c2018-08-31 09:22:23 +0100992}
993
Sadik Armagan1625efc2021-06-10 18:24:34 +0100994TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLSTMWorkloadFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100995{
arovir019e53a352018-08-31 15:26:35 +0100996 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100997}
998
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100999template <typename ResizeWorkloadType, typename armnn::DataType DataType>
1000static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +01001001{
1002 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001003 ClWorkloadFactory factory =
1004 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +01001005
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001006 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +01001007
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001008 auto queueDescriptor = workload->GetData();
1009
Jan Eilersbb446e52020-04-02 13:56:54 +01001010 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1011 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +01001012
Colm Donelan25ab3a82021-05-17 13:01:52 +01001013 armnn::PredicateResult predResult(true);
James Conroy074f3712018-10-03 09:32:03 +01001014 switch (dataLayout)
1015 {
1016 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +01001017 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001018 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001019 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001020 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001021 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +01001022 default: // DataLayout::NCHW
1023 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001024 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001025 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001026 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001027 }
1028}
1029
Sadik Armagan1625efc2021-06-10 18:24:34 +01001030TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001031{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001032 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001033}
1034
Sadik Armagan1625efc2021-06-10 18:24:34 +01001035TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001036{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001037 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001038}
1039
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001041{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001042 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001043}
1044
Sadik Armagan1625efc2021-06-10 18:24:34 +01001045TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NhwcWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001046{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001047 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1048}
1049
Sadik Armagan1625efc2021-06-10 18:24:34 +01001050TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001051{
1052 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1053}
1054
Sadik Armagan1625efc2021-06-10 18:24:34 +01001055TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001056{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001057 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001058}
telsoa01c577f2c2018-08-31 09:22:23 +01001059
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001060template <typename MeanWorkloadType, typename armnn::DataType DataType>
1061static void ClMeanWorkloadTest()
1062{
1063 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001064 ClWorkloadFactory factory =
1065 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1066
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001067 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1068
1069 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1070 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001071 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1072 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001073
1074 // The first dimension (batch size) in both input and output is singular thus it has been reduced by ACL.
Colm Donelan25ab3a82021-05-17 13:01:52 +01001075 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001076 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001077 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001078 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001079}
1080
Sadik Armagan1625efc2021-06-10 18:24:34 +01001081TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat32Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001082{
1083 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1084}
1085
Sadik Armagan1625efc2021-06-10 18:24:34 +01001086TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat16Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001087{
1088 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1089}
1090
Sadik Armagan1625efc2021-06-10 18:24:34 +01001091TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanUint8Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001092{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001093 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001094}
1095
Jim Flynne242f2d2019-05-22 14:24:13 +01001096template <typename ConcatWorkloadType, armnn::DataType DataType>
1097static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001098 unsigned int concatAxis)
1099{
1100 Graph graph;
1101 ClWorkloadFactory factory =
1102 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1103
Jim Flynne242f2d2019-05-22 14:24:13 +01001104 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001105
Jim Flynne242f2d2019-05-22 14:24:13 +01001106 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001107 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1108 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1109 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001110
Colm Donelan25ab3a82021-05-17 13:01:52 +01001111 auto predResult = CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001112 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001113 predResult = CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001114 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001115 predResult = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001116 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
narpra015cdda352018-11-19 15:30:27 +00001117}
1118
Sadik Armagan1625efc2021-06-10 18:24:34 +01001119TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001120{
Jim Flynne242f2d2019-05-22 14:24:13 +01001121 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001122}
1123
Sadik Armagan1625efc2021-06-10 18:24:34 +01001124TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001125{
Jim Flynne242f2d2019-05-22 14:24:13 +01001126 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001127}
1128
Sadik Armagan1625efc2021-06-10 18:24:34 +01001129TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001130{
Jim Flynne242f2d2019-05-22 14:24:13 +01001131 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001132}
1133
Sadik Armagan1625efc2021-06-10 18:24:34 +01001134TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001135{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001136 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001137}
1138
Sadik Armagan1625efc2021-06-10 18:24:34 +01001139TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001140{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001141 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001142}
1143
Sadik Armagan1625efc2021-06-10 18:24:34 +01001144TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001145{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001146 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001147}
1148
James Conroy60597842019-07-02 10:57:56 +01001149template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1150static void ClSpaceToDepthWorkloadTest()
1151{
1152 Graph graph;
1153 ClWorkloadFactory factory =
1154 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1155
1156 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1157
1158 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001159 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1160 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001161
Colm Donelan25ab3a82021-05-17 13:01:52 +01001162 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001163 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001164 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001165 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy60597842019-07-02 10:57:56 +01001166}
1167
Sadik Armagan1625efc2021-06-10 18:24:34 +01001168TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat32Workload")
James Conroy60597842019-07-02 10:57:56 +01001169{
1170 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1171}
1172
Sadik Armagan1625efc2021-06-10 18:24:34 +01001173TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat16Workload")
James Conroy60597842019-07-02 10:57:56 +01001174{
1175 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1176}
1177
Sadik Armagan1625efc2021-06-10 18:24:34 +01001178TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQAsymm8Workload")
James Conroy60597842019-07-02 10:57:56 +01001179{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001180 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001181}
1182
Sadik Armagan1625efc2021-06-10 18:24:34 +01001183TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQSymm16Workload")
James Conroy60597842019-07-02 10:57:56 +01001184{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001185 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001186}
1187
Matthew Jacksond5166102019-07-31 14:06:28 +01001188template <armnn::DataType DataType>
1189static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1190 const std::initializer_list<unsigned int>& outputShape,
1191 unsigned int axis,
1192 unsigned int numInputs)
1193{
1194 armnn::Graph graph;
1195 ClWorkloadFactory factory =
1196 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1197
1198 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1199 graph,
1200 TensorShape(inputShape),
1201 TensorShape(outputShape),
1202 axis,
1203 numInputs);
1204
1205 // Check inputs and output are as expected
1206 StackQueueDescriptor queueDescriptor = workload->GetData();
1207 for (unsigned int i = 0; i < numInputs; ++i)
1208 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001209 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001210 auto predResult1 = CompareIClTensorHandleShape(inputHandle, inputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001211 CHECK_MESSAGE(predResult1.m_Result, predResult1.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001212 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001213 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001214 auto predResult2 = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001215 CHECK_MESSAGE(predResult2.m_Result, predResult2.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001216}
1217
Sadik Armagan1625efc2021-06-10 18:24:34 +01001218TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat32Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001219{
1220 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1221}
1222
Sadik Armagan1625efc2021-06-10 18:24:34 +01001223TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +01001224{
1225 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1226}
1227
Sadik Armagan1625efc2021-06-10 18:24:34 +01001228TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackUint8Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001229{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001230 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001231}
1232
Ryan OShea2323af42020-05-13 16:36:19 +01001233
1234template <typename QLstmWorkloadType>
1235static void ClCreateQLstmWorkloadTest()
1236{
1237 Graph graph;
1238 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1239
1240 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1241 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1242
1243 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001244 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1245 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001246
1247 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001248 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1249 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ryan OShea2323af42020-05-13 16:36:19 +01001250
1251 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001252 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1253 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001254}
1255
Sadik Armagan1625efc2021-06-10 18:24:34 +01001256TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQLstmWorkloadTest")
Ryan OShea2323af42020-05-13 16:36:19 +01001257{
1258 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1259}
1260
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001261template <typename QuantizedLstmWorkloadType>
1262static void ClCreateQuantizedLstmWorkloadTest()
1263{
1264 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001265
1266 Graph graph;
1267 ClWorkloadFactory factory =
1268 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1269
1270 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1271
1272 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1273
Jan Eilersbb446e52020-04-02 13:56:54 +01001274 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001275 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1276 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001277
Jan Eilersbb446e52020-04-02 13:56:54 +01001278 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001279 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1280 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001281
Jan Eilersbb446e52020-04-02 13:56:54 +01001282 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001283 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1284 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001285
Jan Eilersbb446e52020-04-02 13:56:54 +01001286 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001287 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1288 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001289
Jan Eilersbb446e52020-04-02 13:56:54 +01001290 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001291 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1292 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001293}
1294
Sadik Armagan1625efc2021-06-10 18:24:34 +01001295TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQuantizedLstmWorkload")
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001296{
1297 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1298}
1299
Sadik Armagan1625efc2021-06-10 18:24:34 +01001300}