blob: 3a757f88207e0c7422de213435e9eaab148da0e7 [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>
Colm Donelan0c479742021-12-10 12:43:54 +000012#include <armnn/backends/MemCopyWorkload.hpp>
Sadik Armagana097d2a2021-11-24 15:47:28 +000013#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelanc42a9872022-02-02 16:35:09 +000014#include <armnnTestUtils/TensorHelpers.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000015#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010016
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000017#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010018#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010019
Narumol Prangnawarate2af6f42022-01-28 17:59:18 +000020#include <cl/ClImportTensorHandle.hpp>
21#include <cl/ClImportTensorHandleFactory.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000022#include <cl/ClTensorHandle.hpp>
23#include <cl/ClWorkloadFactory.hpp>
24#include <cl/workloads/ClWorkloads.hpp>
25#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010026
Sadik Armagan1625efc2021-06-10 18:24:34 +010027#include <doctest/doctest.h>
28
Colm Donelan25ab3a82021-05-17 13:01:52 +010029armnn::PredicateResult CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
30 std::initializer_list<unsigned int> expectedDimensions)
telsoa014fcda012018-03-09 14:13:49 +000031{
32 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
33}
34
Sadik Armagan1625efc2021-06-10 18:24:34 +010035TEST_SUITE("CreateWorkloadCl")
36{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010037template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010038static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000039{
40 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000041 ClWorkloadFactory factory =
42 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000043
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010044 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000045
telsoa01c577f2c2018-08-31 09:22:23 +010046 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000047 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010048 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
49 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000050
Colm Donelan25ab3a82021-05-17 13:01:52 +010051 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +010052 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010053
54 predResult = CompareIClTensorHandleShape(outputHandle, {1, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +010055 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +000056}
57
Sadik Armagan1625efc2021-06-10 18:24:34 +010058TEST_CASE_FIXTURE(ClContextControlFixture, "CreateActivationFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +010059{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010060 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010061}
62
Sadik Armagan1625efc2021-06-10 18:24:34 +010063TEST_CASE_FIXTURE(ClContextControlFixture, "CreateActivationFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +010064{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010065 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010066}
67
David Beck4a8692c2018-09-07 16:19:24 +010068template <typename WorkloadType,
69 typename DescriptorType,
70 typename LayerType,
71 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000072static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000073{
74 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000075 ClWorkloadFactory factory =
76 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
77
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000079
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000080 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010081 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010082 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
83 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
84 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +010085 auto predResult = CompareIClTensorHandleShape(inputHandle1, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010086 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010087 predResult = CompareIClTensorHandleShape(inputHandle2, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010089 predResult = CompareIClTensorHandleShape(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010090 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +000091}
92
Sadik Armagan1625efc2021-06-10 18:24:34 +010093TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +000094{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000095 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010096 AdditionQueueDescriptor,
97 AdditionLayer,
98 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010099}
100
Sadik Armagan1625efc2021-06-10 18:24:34 +0100101TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100102{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000103 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100104 AdditionQueueDescriptor,
105 AdditionLayer,
106 armnn::DataType::Float16>();
107}
108
Sadik Armagan1625efc2021-06-10 18:24:34 +0100109TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloatWorkload")
David Beck4a8692c2018-09-07 16:19:24 +0100110{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000111 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100112 SubtractionQueueDescriptor,
113 SubtractionLayer,
114 armnn::DataType::Float32>();
115}
116
Sadik Armagan1625efc2021-06-10 18:24:34 +0100117TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloat16Workload")
David Beck4a8692c2018-09-07 16:19:24 +0100118{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000119 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100120 SubtractionQueueDescriptor,
121 SubtractionLayer,
122 armnn::DataType::Float16>();
123}
124
Sadik Armagan1625efc2021-06-10 18:24:34 +0100125TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100126{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000127 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100128 MultiplicationQueueDescriptor,
129 MultiplicationLayer,
130 armnn::DataType::Float32>();
131}
132
Sadik Armagan1625efc2021-06-10 18:24:34 +0100133TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100134{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000135 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100136 MultiplicationQueueDescriptor,
137 MultiplicationLayer,
138 armnn::DataType::Float16>();
139}
140
Sadik Armagan1625efc2021-06-10 18:24:34 +0100141TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationUint8WorkloadTest")
Matthew Benthame2ec3302018-10-01 11:32:48 +0100142{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000143 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100144 MultiplicationQueueDescriptor,
145 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000146 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100147}
148
Sadik Armagan1625efc2021-06-10 18:24:34 +0100149TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100150{
Teresa Charline11e63d2021-04-21 12:56:45 +0100151 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100152 DivisionQueueDescriptor,
153 DivisionLayer,
154 armnn::DataType::Float32>();
155}
156
Sadik Armagan1625efc2021-06-10 18:24:34 +0100157TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100158{
Teresa Charline11e63d2021-04-21 12:56:45 +0100159 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100160 DivisionQueueDescriptor,
161 DivisionLayer,
162 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100163}
164
josh minor4a3c6102020-01-06 16:40:46 -0600165template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100166 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100167 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600168static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100169{
170 Graph graph;
171 ClWorkloadFactory factory =
172 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
173
josh minor4a3c6102020-01-06 16:40:46 -0600174 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100175
176 DescriptorType queueDescriptor = workload->GetData();
177
Jan Eilersbb446e52020-04-02 13:56:54 +0100178 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
179 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100180
Colm Donelan25ab3a82021-05-17 13:01:52 +0100181 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100182 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100183
184 predResult = CompareIClTensorHandleShape(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100185 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100186}
187
Sadik Armagan1625efc2021-06-10 18:24:34 +0100188TEST_CASE_FIXTURE(ClContextControlFixture, "CreateRsqrtFloat32WorkloadTest")
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100189{
josh minor4a3c6102020-01-06 16:40:46 -0600190 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
191 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100192}
193
telsoa01c577f2c2018-08-31 09:22:23 +0100194template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100195static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100196{
197 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000198 ClWorkloadFactory factory =
199 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000200
telsoa01c577f2c2018-08-31 09:22:23 +0100201 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100202 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000203
telsoa01c577f2c2018-08-31 09:22:23 +0100204 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000205 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100206 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
207 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000208
Colm Donelan25ab3a82021-05-17 13:01:52 +0100209 armnn::PredicateResult predResult(true);
210 switch (dataLayout)
Nikhil Rajd1340932018-10-18 14:27:50 +0100211 {
212 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +0100213 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100214 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100215 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100216 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100217 break;
218 default: // NCHW
Colm Donelan25ab3a82021-05-17 13:01:52 +0100219 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100220 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100221 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100222 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100223 }
telsoa014fcda012018-03-09 14:13:49 +0000224}
225
Sadik Armagan1625efc2021-06-10 18:24:34 +0100226TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000227{
Nikhil Rajd1340932018-10-18 14:27:50 +0100228 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
229 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100230}
telsoa014fcda012018-03-09 14:13:49 +0000231
Sadik Armagan1625efc2021-06-10 18:24:34 +0100232TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100233{
Nikhil Rajd1340932018-10-18 14:27:50 +0100234 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
235 armnn::DataType::Float16>(DataLayout::NCHW);
236}
237
Sadik Armagan1625efc2021-06-10 18:24:34 +0100238TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100239{
240 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
241 armnn::DataType::Float32>(DataLayout::NHWC);
242}
243
Sadik Armagan1625efc2021-06-10 18:24:34 +0100244TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationNhwcFloat16NhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100245{
246 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
247 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100248}
249
Sadik Armagan1625efc2021-06-10 18:24:34 +0100250TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp16ToFp32Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100251{
252 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000253 ClWorkloadFactory factory =
254 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
255
telsoa01c577f2c2018-08-31 09:22:23 +0100256 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
257
258 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100259 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
260 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100261 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100262 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100263 predResult = CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100264 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
265 CHECK((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
266 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
telsoa01c577f2c2018-08-31 09:22:23 +0100267}
268
Sadik Armagan1625efc2021-06-10 18:24:34 +0100269TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp32ToFp16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100270{
271 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000272 ClWorkloadFactory factory =
273 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
274
telsoa01c577f2c2018-08-31 09:22:23 +0100275 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
276
277 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100278 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
279 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100280
Colm Donelan25ab3a82021-05-17 13:01:52 +0100281 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100282 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100283 predResult = CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100284 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
285 CHECK((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
286 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
telsoa01c577f2c2018-08-31 09:22:23 +0100287}
288
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100289template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
290static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100291{
292 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000293 ClWorkloadFactory factory =
294 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
295
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100296 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
297 graph,
298 dataLayout);
299
Mike Kellydb482882019-06-14 12:35:24 +0100300 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
301 : std::initializer_list<unsigned int>({2, 8, 16, 3});
302 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
303 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100304
305 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000306 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100307 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
308 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100309 CHECK((inputHandle->GetShape() == inputShape));
310 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000311}
312
Sadik Armagan1625efc2021-06-10 18:24:34 +0100313TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000314{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100315 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100316}
317
Sadik Armagan1625efc2021-06-10 18:24:34 +0100318TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100319{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100320 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000321}
322
Sadik Armagan1625efc2021-06-10 18:24:34 +0100323TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NchwWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100324{
325 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
326}
327
Sadik Armagan1625efc2021-06-10 18:24:34 +0100328TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NhwcWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100329{
330 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
331}
332
Sadik Armagan1625efc2021-06-10 18:24:34 +0100333TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFastMathEnabledWorkload")
Sadik Armagan04a72972020-09-14 15:44:18 +0100334{
335 Graph graph;
336
337 using ModelOptions = std::vector<BackendOptions>;
338 ModelOptions modelOptions = {};
339 BackendOptions gpuAcc("GpuAcc",
340 {
341 { "FastMathEnabled", true }
342 });
343 modelOptions.push_back(gpuAcc);
344
345 ClWorkloadFactory factory =
346 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
347
348 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100349 CreateConvolution2dWorkloadFastMathTest<ClConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100350 graph,
351 DataLayout::NCHW,
352 modelOptions);
353
354 ARMNN_ASSERT(workload != nullptr);
355 auto conv2dWorkload = PolymorphicDowncast<ClConvolution2dWorkload*>(workload.get());
356 IgnoreUnused(conv2dWorkload);
357 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100358 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100359}
360
Narumol Prangnawarate2af6f42022-01-28 17:59:18 +0000361TEST_CASE_FIXTURE(ClContextControlFixture, "ClReplaceInputOutputConvolution2dWorkload")
362{
363 // Create Convolution2dWorkload with ClTensorHandle input and output
364 // Then replace the input and output with ClImportTensorHandle
365 Graph graph;
366 ClWorkloadFactory factory =
367 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
368
369 auto workload =
370 CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType::Float32>(factory,
371 graph,
372 DataLayout::NHWC);
373
374 TensorShape inputShape = std::initializer_list<unsigned int>({2, 8, 16, 3});
375 TensorShape outputShape = std::initializer_list<unsigned int>({2, 2, 10, 2});
376
377 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
378 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
379 auto inputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Inputs[0]);
380 auto outputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Outputs[0]);
381 CHECK((inputHandle->GetShape() == inputShape));
382 CHECK((outputHandle->GetShape() == outputShape));
383 // The input and output handles are created correctly as ClTensorHandle
384 CHECK((dynamic_cast<ClTensorHandle*>(inputHandle) != nullptr));
385 CHECK((dynamic_cast<ClTensorHandle*>(outputHandle) != nullptr));
386
387 // Replace with ImportTensorHandle
388 ClImportTensorHandleFactory importFactory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
389 static_cast<MemorySourceFlags>(MemorySource::Malloc));
390
391 TensorInfo inputInfo({ 2, 8, 16, 3 }, DataType::Float32);
392 TensorInfo outputInfo({ 2, 2, 10, 2 }, DataType::Float32);
393
394 // create TensorHandle for memory import
395 auto inputImportHandle = importFactory.CreateTensorHandle(inputInfo);
396 auto outputImportHandle = importFactory.CreateTensorHandle(outputInfo);
397
398 // Calling ReplaceInputTensorHandle and ReplaceOutputTensorHandle does not throw exception
399 // as Reconfigure function is implemented
400 workload->ReplaceInputTensorHandle(inputImportHandle.get(), 0);
401 workload->ReplaceOutputTensorHandle(outputImportHandle.get(), 0);
402
403 // Correctly replaced with the import handles with correct information
404 queueDescriptor = workload->GetData();
405 auto replacedInputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Inputs[0]);
406 auto replacedOutputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Outputs[0]);
407 CHECK((replacedInputHandle->GetShape() == inputShape));
408 CHECK((replacedOutputHandle->GetShape() == outputShape));
409
410 CHECK((inputImportHandle.get() == replacedInputHandle));
411 CHECK((inputImportHandle.get() == replacedInputHandle));
412
413 CHECK((dynamic_cast<ClTensorHandle*>(replacedInputHandle) == nullptr));
414 CHECK((dynamic_cast<ClImportTensorHandle*>(replacedInputHandle) != nullptr));
415 CHECK((dynamic_cast<ClTensorHandle*>(replacedOutputHandle) == nullptr));
416 CHECK((dynamic_cast<ClImportTensorHandle*>(replacedOutputHandle) != nullptr));
417}
418
Sadik Armagan1625efc2021-06-10 18:24:34 +0100419TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dClCompiledContextWorkload")
Sadik Armagane9444752020-12-02 11:28:58 +0000420{
421 using namespace armnn;
422
423 const DataType inputType = DataType::QAsymmU8;
424 const DataType kernelType = DataType::QSymmS8;
425 const DataType biasType = DataType::Signed32;
426
427 TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128);
428 TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128);
429
430 const std::vector<float> quantScales{ 0.5f, 0.75f, 1.0f };
431 constexpr unsigned int quantDimension = 0;
432
433 TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension);
434
435 const std::vector<float> biasQuantScales{ 0.25f, 0.375f, 0.5f };
436 TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension);
437
438 std::vector<uint8_t> inputData =
439 {
440 138, 108, 138, 108, 138, 108
441 };
442
443 std::vector<int8_t> kernelData =
444 {
445 1, 2, 1, 2, 1, 2
446 };
447
448 std::vector<int32_t> biasData =
449 {
450 4, 4, 4
451 };
452
453 std::vector<uint8_t> expectedOutputData =
454 {
455 121, 118, 115, 121, 118, 115, 121, 118, 115
456 };
457
458
459 Convolution2dDescriptor descriptor;
460 descriptor.m_StrideX = 1;
461 descriptor.m_StrideY = 1;
462 descriptor.m_PadLeft = 0;
463 descriptor.m_PadRight = 0;
464 descriptor.m_PadTop = 0;
465 descriptor.m_PadBottom = 0;
466 descriptor.m_BiasEnabled = true;
467 descriptor.m_DataLayout = DataLayout::NHWC;
468
469 auto memoryManager = ClWorkloadFactoryHelper::GetMemoryManager();
470 auto clMemoryManager = armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager);
471 auto tensorHandleFactory = ClWorkloadFactoryHelper::GetTensorHandleFactory(memoryManager);
472
473 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100474 std::unique_ptr<armnn::ITensorHandle> weightsHandle = tensorHandleFactory.CreateTensorHandle(kernelInfo);
475 std::unique_ptr<armnn::ITensorHandle> biasHandle = tensorHandleFactory.CreateTensorHandle(biasInfo);
Sadik Armagane9444752020-12-02 11:28:58 +0000476 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
477
478
479 WorkloadInfo workloadInfo;
James Conroy1f58f032021-04-27 17:13:27 +0100480 ScopedTensorHandle weightTensor(kernelInfo);
481 ScopedTensorHandle biasTensor(biasInfo);
Sadik Armagane9444752020-12-02 11:28:58 +0000482
483 AllocateAndCopyDataToITensorHandle(&weightTensor, kernelData.data());
484 AllocateAndCopyDataToITensorHandle(&biasTensor, biasData.data());
485
486 Convolution2dQueueDescriptor queueDescriptor;
487 queueDescriptor.m_Parameters = descriptor;
488 queueDescriptor.m_Weight = &weightTensor;
489 queueDescriptor.m_Bias = &biasTensor;
490
491 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100492 AddInputToWorkload(queueDescriptor, workloadInfo, kernelInfo, weightsHandle.get());
493 AddInputToWorkload(queueDescriptor, workloadInfo, biasInfo, biasHandle.get());
Sadik Armagane9444752020-12-02 11:28:58 +0000494 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
495
496 // Initialize our m_CLCompileContext using default device and context
497 auto context = arm_compute::CLKernelLibrary::get().context();
498 auto device = arm_compute::CLKernelLibrary::get().get_device();
499 auto clCompileContext = arm_compute::CLCompileContext(context, device);
500
501
502
503 // Check built programs are empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100504 CHECK(clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000505
506 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
507 workloadInfo,
508 clMemoryManager->GetIntraLayerManager(),
509 clCompileContext);
510 ARMNN_ASSERT(workload != nullptr);
511 // Check built programs are not empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100512 CHECK(!clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000513}
514
Nikhil Rajcec6b652018-10-12 13:51:57 +0100515template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
516static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
517{
518 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000519 ClWorkloadFactory factory =
520 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100521
522 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
523 (factory, graph, dataLayout);
524
525 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
526 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100527 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
528 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100529
Mike Kellydb482882019-06-14 12:35:24 +0100530 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
531 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
532 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
533 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100534
Sadik Armagan1625efc2021-06-10 18:24:34 +0100535 CHECK((inputHandle->GetShape() == inputShape));
536 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100537}
538
Sadik Armagan1625efc2021-06-10 18:24:34 +0100539TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDepthwiseConvolutionFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100540{
541 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
542}
543
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100544template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100545static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000546{
telsoa01c577f2c2018-08-31 09:22:23 +0100547 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000548 ClWorkloadFactory factory =
549 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
550
Matthew Benthamd8067922018-10-03 17:18:04 +0100551 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000552
telsoa01c577f2c2018-08-31 09:22:23 +0100553 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000554 Convolution2dQueueDescriptor 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]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100557 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100558 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100559 predResult = CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100560 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000561}
562
Sadik Armagan1625efc2021-06-10 18:24:34 +0100563TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000564{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100565 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100566}
567
Sadik Armagan1625efc2021-06-10 18:24:34 +0100568TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100569{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100570 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000571}
572
Sadik Armagan1625efc2021-06-10 18:24:34 +0100573TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000574{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000575 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000576}
577
telsoa01c577f2c2018-08-31 09:22:23 +0100578template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
579static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000580{
telsoa01c577f2c2018-08-31 09:22:23 +0100581 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000582 ClWorkloadFactory factory =
583 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
584
telsoa01c577f2c2018-08-31 09:22:23 +0100585 auto workload =
586 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000587
telsoa01c577f2c2018-08-31 09:22:23 +0100588 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000589 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100590 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
591 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100592 auto predResult = CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100593 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100594 predResult = CompareIClTensorHandleShape(outputHandle, {3, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100595 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000596}
597
telsoa01c577f2c2018-08-31 09:22:23 +0100598
Sadik Armagan1625efc2021-06-10 18:24:34 +0100599TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloatWorkloadTest")
telsoa014fcda012018-03-09 14:13:49 +0000600{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100601 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100602}
603
Sadik Armagan1625efc2021-06-10 18:24:34 +0100604TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100605{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100606 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100607}
608
telsoa01c577f2c2018-08-31 09:22:23 +0100609template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100610static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100611{
612 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000613 ClWorkloadFactory factory =
614 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
615
Matteo Martincigha160b242018-10-18 10:33:23 +0100616 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000617
telsoa01c577f2c2018-08-31 09:22:23 +0100618 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000619 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100620 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
621 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000622
Mike Kellydb482882019-06-14 12:35:24 +0100623 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
624 : std::initializer_list<unsigned int>({3, 1, 5, 5});
625 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
626 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100627
Sadik Armagan1625efc2021-06-10 18:24:34 +0100628 CHECK((inputHandle->GetShape() == inputShape));
629 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000630}
631
Sadik Armagan1625efc2021-06-10 18:24:34 +0100632TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000633{
narpra0155a97bc2018-10-02 14:35:53 +0100634 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100635}
636
Sadik Armagan1625efc2021-06-10 18:24:34 +0100637TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100638{
narpra0155a97bc2018-10-02 14:35:53 +0100639 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
640}
641
Sadik Armagan1625efc2021-06-10 18:24:34 +0100642TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100643{
644 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
645}
646
Sadik Armagan1625efc2021-06-10 18:24:34 +0100647TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100648{
649 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100650}
651
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100652template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100653static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100654{
655 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000656 ClWorkloadFactory factory =
657 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000658
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100659 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100660
Mike Kellydb482882019-06-14 12:35:24 +0100661 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
662 : std::initializer_list<unsigned int>({3, 5, 5, 2});
663 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
664 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000665
telsoa01c577f2c2018-08-31 09:22:23 +0100666 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000667 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100668 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
669 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000670
Sadik Armagan1625efc2021-06-10 18:24:34 +0100671 CHECK((inputHandle->GetShape() == inputShape));
672 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000673}
674
Sadik Armagan1625efc2021-06-10 18:24:34 +0100675TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100676{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100677 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100678}
679
Sadik Armagan1625efc2021-06-10 18:24:34 +0100680TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100681{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100682 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100683}
684
Sadik Armagan1625efc2021-06-10 18:24:34 +0100685TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100686{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100687 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100688}
689
Sadik Armagan1625efc2021-06-10 18:24:34 +0100690TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100691{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100692 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100693}
694
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100695static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
696 const armnn::TensorShape& alphaShape,
697 const armnn::TensorShape& outputShape,
698 armnn::DataType dataType)
699{
700 Graph graph;
701 ClWorkloadFactory factory =
702 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
703
704 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
705 graph,
706 inputShape,
707 alphaShape,
708 outputShape,
709 dataType);
710
711 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
712 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100713 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
714 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
715 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100716
Sadik Armagan1625efc2021-06-10 18:24:34 +0100717 CHECK((inputHandle->GetShape() == inputShape));
718 CHECK((alphaHandle->GetShape() == alphaShape));
719 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100720}
721
Sadik Armagan1625efc2021-06-10 18:24:34 +0100722TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloat16Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100723{
724 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
725}
726
Sadik Armagan1625efc2021-06-10 18:24:34 +0100727TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloatWorkload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100728{
729 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
730}
731
Sadik Armagan1625efc2021-06-10 18:24:34 +0100732TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluUint8Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100733{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000734 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100735}
736
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100737template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000738static void ClCreateReshapeWorkloadTest()
739{
telsoa01c577f2c2018-08-31 09:22:23 +0100740 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000741 ClWorkloadFactory factory =
742 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000743
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100744 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000745
telsoa01c577f2c2018-08-31 09:22:23 +0100746 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000747 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100748 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
749 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000750
Colm Donelan25ab3a82021-05-17 13:01:52 +0100751 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100752 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100753 predResult = CompareIClTensorHandleShape(outputHandle, {1, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100754 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000755}
756
Sadik Armagan1625efc2021-06-10 18:24:34 +0100757TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000758{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100759 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100760}
761
Sadik Armagan1625efc2021-06-10 18:24:34 +0100762TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100763{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100764 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000765}
766
Sadik Armagan1625efc2021-06-10 18:24:34 +0100767TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000768{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000769 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000770}
771
telsoa01c577f2c2018-08-31 09:22:23 +0100772template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
773static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000774{
telsoa01c577f2c2018-08-31 09:22:23 +0100775 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000776 ClWorkloadFactory factory =
777 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000778
telsoa01c577f2c2018-08-31 09:22:23 +0100779 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000780
arovir019e53a352018-08-31 15:26:35 +0100781 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000782 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100783 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
784 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000785
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100786 armnn::TensorInfo tensorInfo({4, 1}, DataType);
787 if (DataType == armnn::DataType::QAsymmU8)
788 {
789 tensorInfo.SetQuantizationOffset(0);
790 tensorInfo.SetQuantizationScale(1.f / 256);
791 }
792 else if (DataType == armnn::DataType::QAsymmS8)
793 {
794 tensorInfo.SetQuantizationOffset(-128);
795 tensorInfo.SetQuantizationScale(1.f / 256);
796 }
797
Colm Donelan25ab3a82021-05-17 13:01:52 +0100798 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100799 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100800 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100801 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000802}
803
telsoa01c577f2c2018-08-31 09:22:23 +0100804
Sadik Armagan1625efc2021-06-10 18:24:34 +0100805TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat32WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100806{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100807 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100808}
809
Sadik Armagan1625efc2021-06-10 18:24:34 +0100810TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100811{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100812 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
813}
814
Sadik Armagan1625efc2021-06-10 18:24:34 +0100815TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmU8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100816{
817 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
818}
819
Sadik Armagan1625efc2021-06-10 18:24:34 +0100820TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmS8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100821{
822 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100823}
824
Matthew Bentham29cadb32018-10-01 17:22:32 +0100825template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100826static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000827{
828 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000829 ClWorkloadFactory factory =
830 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000831
Matthew Bentham29cadb32018-10-01 17:22:32 +0100832 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000833
telsoa01c577f2c2018-08-31 09:22:23 +0100834 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000835 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100836 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100837 auto predResult = CompareIClTensorHandleShape(inputHandle, {5, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100838 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100839
Jan Eilersbb446e52020-04-02 13:56:54 +0100840 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100841 predResult = CompareIClTensorHandleShape(outputHandle1, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100842 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100843
Jan Eilersbb446e52020-04-02 13:56:54 +0100844 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100845 predResult = CompareIClTensorHandleShape(outputHandle2, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100846 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100847
Jan Eilersbb446e52020-04-02 13:56:54 +0100848 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100849 predResult = CompareIClTensorHandleShape(outputHandle0, {1, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100850 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000851}
852
Sadik Armagan1625efc2021-06-10 18:24:34 +0100853TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000854{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100855 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100856}
857
Sadik Armagan1625efc2021-06-10 18:24:34 +0100858TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100859{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100860 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100861}
862
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100863template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100864static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100865{
866 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100867 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000868 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100869 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
870 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000871
872 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000873 ClWorkloadFactory factory =
874 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000875
876 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100877 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100878 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000879
880 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100881 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000882
telsoa01c577f2c2018-08-31 09:22:23 +0100883 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000884 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
885 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100886 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
887 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000888
Sadik Armagan1625efc2021-06-10 18:24:34 +0100889 CHECK(sOut0);
890 CHECK(sOut1);
891 CHECK(mIn0);
892 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000893
telsoa01c577f2c2018-08-31 09:22:23 +0100894 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000895 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100896 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000897
898
telsoa01c577f2c2018-08-31 09:22:23 +0100899 //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 +0000900 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
901 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
902
Sadik Armagan1625efc2021-06-10 18:24:34 +0100903 CHECK(validSubTensorParents);
telsoa014fcda012018-03-09 14:13:49 +0000904}
905
Sadik Armagan1625efc2021-06-10 18:24:34 +0100906TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100907{
Jim Flynne242f2d2019-05-22 14:24:13 +0100908 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100909}
910
Sadik Armagan1625efc2021-06-10 18:24:34 +0100911TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100912{
Jim Flynne242f2d2019-05-22 14:24:13 +0100913 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100914}
915
916
Sadik Armagan1625efc2021-06-10 18:24:34 +0100917TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000918{
919 // 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 +0100920 // 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 +0000921
922 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000923 ClWorkloadFactory factory =
924 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
925
Matthew Bentham29cadb32018-10-01 17:22:32 +0100926 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100927 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
928 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
929 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
930 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000931
Matthew Bentham29cadb32018-10-01 17:22:32 +0100932 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100933 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100934 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000935
telsoa01c577f2c2018-08-31 09:22:23 +0100936 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000937 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
938 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
939 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
940 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
941 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
942 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
943
944
Sadik Armagan1625efc2021-06-10 18:24:34 +0100945 CHECK(sOut0);
946 CHECK(sOut1);
947 CHECK(activ0_0Im);
948 CHECK(activ0_1Im);
949 CHECK(activ1_0Im);
950 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000951
952 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
953 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
954
Sadik Armagan1625efc2021-06-10 18:24:34 +0100955 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000956}
957
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100958#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100959
960// This test unit needs the reference backend, it's not available if the reference backend is not built
961
Sadik Armagan1625efc2021-06-10 18:24:34 +0100962TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMemCopyWorkloadsCl")
telsoa014fcda012018-03-09 14:13:49 +0000963{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000964 ClWorkloadFactory factory =
965 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
966
telsoa01c577f2c2018-08-31 09:22:23 +0100967 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000968}
969
Matteo Martincighe67edb22019-08-14 14:05:46 +0100970#endif
971
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100972template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
973static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000974{
telsoa01c577f2c2018-08-31 09:22:23 +0100975 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000976 ClWorkloadFactory factory =
977 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
978
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100979 auto workload =
980 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000981
telsoa01c577f2c2018-08-31 09:22:23 +0100982 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000983 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100984 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
985 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000986
Mike Kellydb482882019-06-14 12:35:24 +0100987 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
988 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
989 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
990 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100991
Sadik Armagan1625efc2021-06-10 18:24:34 +0100992 CHECK((inputHandle->GetShape() == inputShape));
993 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000994}
995
Sadik Armagan1625efc2021-06-10 18:24:34 +0100996TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100997{
998 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
999}
1000
Sadik Armagan1625efc2021-06-10 18:24:34 +01001001TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001002{
1003 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1004}
1005
Sadik Armagan1625efc2021-06-10 18:24:34 +01001006TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001007{
1008 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
1009}
1010
Sadik Armagan1625efc2021-06-10 18:24:34 +01001011TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001012{
1013 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1014}
1015
Teresa Charlin8398edc2020-07-20 14:23:02 +01001016template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
1017static void ClCreateLogSoftmaxWorkloadTest()
1018{
1019 Graph graph;
1020 ClWorkloadFactory factory =
1021 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1022
1023 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
1024
1025 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
1026 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
1027 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1028 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
1029
Colm Donelan25ab3a82021-05-17 13:01:52 +01001030 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001031 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001032 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001033 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Teresa Charlin8398edc2020-07-20 14:23:02 +01001034}
1035
Sadik Armagan1625efc2021-06-10 18:24:34 +01001036TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLogSoftmaxFloat32WorkloadTest")
Teresa Charlin8398edc2020-07-20 14:23:02 +01001037{
1038 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
1039}
1040
telsoa01c577f2c2018-08-31 09:22:23 +01001041template <typename LstmWorkloadType>
1042static void ClCreateLstmWorkloadTest()
1043{
1044 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001045 ClWorkloadFactory factory =
1046 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1047
telsoa01c577f2c2018-08-31 09:22:23 +01001048 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
1049
1050 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001051 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1052 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001053 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 2});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001054 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001055 predResult = CompareIClTensorHandleShape(outputHandle, {2, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001056 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa01c577f2c2018-08-31 09:22:23 +01001057}
1058
Sadik Armagan1625efc2021-06-10 18:24:34 +01001059TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLSTMWorkloadFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +01001060{
arovir019e53a352018-08-31 15:26:35 +01001061 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +01001062}
1063
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001064template <typename ResizeWorkloadType, typename armnn::DataType DataType>
1065static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +01001066{
1067 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001068 ClWorkloadFactory factory =
1069 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +01001070
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001071 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +01001072
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001073 auto queueDescriptor = workload->GetData();
1074
Jan Eilersbb446e52020-04-02 13:56:54 +01001075 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1076 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +01001077
Colm Donelan25ab3a82021-05-17 13:01:52 +01001078 armnn::PredicateResult predResult(true);
James Conroy074f3712018-10-03 09:32:03 +01001079 switch (dataLayout)
1080 {
1081 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +01001082 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001083 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001084 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001085 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001086 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +01001087 default: // DataLayout::NCHW
1088 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001089 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001090 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001091 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001092 }
1093}
1094
Sadik Armagan1625efc2021-06-10 18:24:34 +01001095TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001096{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001097 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001098}
1099
Sadik Armagan1625efc2021-06-10 18:24:34 +01001100TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001101{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001102 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001103}
1104
Sadik Armagan1625efc2021-06-10 18:24:34 +01001105TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001106{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001107 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001108}
1109
Sadik Armagan1625efc2021-06-10 18:24:34 +01001110TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NhwcWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001111{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001112 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1113}
1114
Sadik Armagan1625efc2021-06-10 18:24:34 +01001115TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001116{
1117 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1118}
1119
Sadik Armagan1625efc2021-06-10 18:24:34 +01001120TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001121{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001122 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001123}
telsoa01c577f2c2018-08-31 09:22:23 +01001124
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001125template <typename MeanWorkloadType, typename armnn::DataType DataType>
1126static void ClMeanWorkloadTest()
1127{
1128 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001129 ClWorkloadFactory factory =
1130 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1131
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001132 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1133
1134 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1135 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001136 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1137 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001138
1139 // 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 +01001140 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001141 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001142 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001143 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001144}
1145
Sadik Armagan1625efc2021-06-10 18:24:34 +01001146TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat32Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001147{
1148 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1149}
1150
Sadik Armagan1625efc2021-06-10 18:24:34 +01001151TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat16Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001152{
1153 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1154}
1155
Sadik Armagan1625efc2021-06-10 18:24:34 +01001156TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanUint8Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001157{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001158 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001159}
1160
Jim Flynne242f2d2019-05-22 14:24:13 +01001161template <typename ConcatWorkloadType, armnn::DataType DataType>
1162static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001163 unsigned int concatAxis)
1164{
1165 Graph graph;
1166 ClWorkloadFactory factory =
1167 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1168
Jim Flynne242f2d2019-05-22 14:24:13 +01001169 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001170
Jim Flynne242f2d2019-05-22 14:24:13 +01001171 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001172 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1173 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1174 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001175
Colm Donelan25ab3a82021-05-17 13:01:52 +01001176 auto predResult = CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001178 predResult = CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001179 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001180 predResult = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001181 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
narpra015cdda352018-11-19 15:30:27 +00001182}
1183
Sadik Armagan1625efc2021-06-10 18:24:34 +01001184TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001185{
Jim Flynne242f2d2019-05-22 14:24:13 +01001186 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001187}
1188
Sadik Armagan1625efc2021-06-10 18:24:34 +01001189TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001190{
Jim Flynne242f2d2019-05-22 14:24:13 +01001191 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001192}
1193
Sadik Armagan1625efc2021-06-10 18:24:34 +01001194TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001195{
Jim Flynne242f2d2019-05-22 14:24:13 +01001196 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001197}
1198
Sadik Armagan1625efc2021-06-10 18:24:34 +01001199TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001200{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001201 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001202}
1203
Sadik Armagan1625efc2021-06-10 18:24:34 +01001204TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001205{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001206 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001207}
1208
Sadik Armagan1625efc2021-06-10 18:24:34 +01001209TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001210{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001211 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001212}
1213
James Conroy60597842019-07-02 10:57:56 +01001214template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1215static void ClSpaceToDepthWorkloadTest()
1216{
1217 Graph graph;
1218 ClWorkloadFactory factory =
1219 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1220
1221 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1222
1223 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001224 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1225 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001226
Colm Donelan25ab3a82021-05-17 13:01:52 +01001227 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001228 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001229 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001230 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy60597842019-07-02 10:57:56 +01001231}
1232
Sadik Armagan1625efc2021-06-10 18:24:34 +01001233TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat32Workload")
James Conroy60597842019-07-02 10:57:56 +01001234{
1235 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1236}
1237
Sadik Armagan1625efc2021-06-10 18:24:34 +01001238TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat16Workload")
James Conroy60597842019-07-02 10:57:56 +01001239{
1240 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1241}
1242
Sadik Armagan1625efc2021-06-10 18:24:34 +01001243TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQAsymm8Workload")
James Conroy60597842019-07-02 10:57:56 +01001244{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001245 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001246}
1247
Sadik Armagan1625efc2021-06-10 18:24:34 +01001248TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQSymm16Workload")
James Conroy60597842019-07-02 10:57:56 +01001249{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001250 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001251}
1252
Matthew Jacksond5166102019-07-31 14:06:28 +01001253template <armnn::DataType DataType>
1254static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1255 const std::initializer_list<unsigned int>& outputShape,
1256 unsigned int axis,
1257 unsigned int numInputs)
1258{
1259 armnn::Graph graph;
1260 ClWorkloadFactory factory =
1261 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1262
1263 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1264 graph,
1265 TensorShape(inputShape),
1266 TensorShape(outputShape),
1267 axis,
1268 numInputs);
1269
1270 // Check inputs and output are as expected
1271 StackQueueDescriptor queueDescriptor = workload->GetData();
1272 for (unsigned int i = 0; i < numInputs; ++i)
1273 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001274 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001275 auto predResult1 = CompareIClTensorHandleShape(inputHandle, inputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001276 CHECK_MESSAGE(predResult1.m_Result, predResult1.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001277 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001278 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001279 auto predResult2 = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001280 CHECK_MESSAGE(predResult2.m_Result, predResult2.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001281}
1282
Sadik Armagan1625efc2021-06-10 18:24:34 +01001283TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat32Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001284{
1285 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1286}
1287
Sadik Armagan1625efc2021-06-10 18:24:34 +01001288TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +01001289{
1290 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1291}
1292
Sadik Armagan1625efc2021-06-10 18:24:34 +01001293TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackUint8Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001294{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001295 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001296}
1297
Ryan OShea2323af42020-05-13 16:36:19 +01001298
1299template <typename QLstmWorkloadType>
1300static void ClCreateQLstmWorkloadTest()
1301{
1302 Graph graph;
1303 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1304
1305 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1306 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1307
1308 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001309 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1310 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001311
1312 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001313 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1314 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ryan OShea2323af42020-05-13 16:36:19 +01001315
1316 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001317 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1318 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001319}
1320
Sadik Armagan1625efc2021-06-10 18:24:34 +01001321TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQLstmWorkloadTest")
Ryan OShea2323af42020-05-13 16:36:19 +01001322{
1323 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1324}
1325
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001326template <typename QuantizedLstmWorkloadType>
1327static void ClCreateQuantizedLstmWorkloadTest()
1328{
1329 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001330
1331 Graph graph;
1332 ClWorkloadFactory factory =
1333 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1334
1335 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1336
1337 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1338
Jan Eilersbb446e52020-04-02 13:56:54 +01001339 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001340 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1341 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001342
Jan Eilersbb446e52020-04-02 13:56:54 +01001343 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001344 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1345 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001346
Jan Eilersbb446e52020-04-02 13:56:54 +01001347 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001348 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1349 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001350
Jan Eilersbb446e52020-04-02 13:56:54 +01001351 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001352 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1353 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001354
Jan Eilersbb446e52020-04-02 13:56:54 +01001355 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001356 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1357 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001358}
1359
Sadik Armagan1625efc2021-06-10 18:24:34 +01001360TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQuantizedLstmWorkload")
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001361{
1362 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1363}
1364
Teresa Charlin98b0dcb2022-01-18 22:09:29 +00001365template <armnn::DataType DataType>
1366static void ClCreateActivationWorkloadReplaceFunctionsTest()
1367{
1368 std::shared_ptr<ClMemoryManager> memoryManager = std::make_shared<ClMemoryManager>(
1369 std::make_unique<arm_compute::CLBufferAllocator>());
1370
1371 Graph graph;
1372 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(memoryManager);
1373 // input and output are created as armnn::TensorInfo tensorInfo({1, 1}, DataType)
1374 auto workloadPtr = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
1375
1376 // new input and output tensor handlers are created and then replace in the workload
1377 const ClTensorHandleFactory tensorHandleFactory(memoryManager);
1378 TensorInfo inputInfo({2 , 2}, DataType::Float16);
1379 TensorInfo outputInfo({2 , 2}, DataType::Float16);
1380 unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo, true);
1381 inputHandle->Manage();
1382 inputHandle->Allocate();
1383 unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo, true);
1384 outputHandle->Manage();
1385 outputHandle->Allocate();
1386
1387 unsigned int slot = 0;
1388 CHECK_THROWS_AS(workloadPtr->ReplaceInputTensorHandle(inputHandle.get(), slot), UnimplementedException);
1389 CHECK_THROWS_AS(workloadPtr->ReplaceOutputTensorHandle(outputHandle.get(), slot), UnimplementedException);
1390}
1391
1392TEST_CASE("ClReplaceFunctionsfromFloat32toFloat16ActivationWorkload")
1393{
1394 ClCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::Float32>();
1395}
1396
Sadik Armagan1625efc2021-06-10 18:24:34 +01001397}