blob: 4f53b921d0501b5b78b69646602f00d3433cb8b7 [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);
474 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
475
476
477 WorkloadInfo workloadInfo;
James Conroy1f58f032021-04-27 17:13:27 +0100478 ScopedTensorHandle weightTensor(kernelInfo);
479 ScopedTensorHandle biasTensor(biasInfo);
Sadik Armagane9444752020-12-02 11:28:58 +0000480
481 AllocateAndCopyDataToITensorHandle(&weightTensor, kernelData.data());
482 AllocateAndCopyDataToITensorHandle(&biasTensor, biasData.data());
483
484 Convolution2dQueueDescriptor queueDescriptor;
485 queueDescriptor.m_Parameters = descriptor;
486 queueDescriptor.m_Weight = &weightTensor;
487 queueDescriptor.m_Bias = &biasTensor;
488
489 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
490 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
491
492 // Initialize our m_CLCompileContext using default device and context
493 auto context = arm_compute::CLKernelLibrary::get().context();
494 auto device = arm_compute::CLKernelLibrary::get().get_device();
495 auto clCompileContext = arm_compute::CLCompileContext(context, device);
496
497
498
499 // Check built programs are empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100500 CHECK(clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000501
502 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
503 workloadInfo,
504 clMemoryManager->GetIntraLayerManager(),
505 clCompileContext);
506 ARMNN_ASSERT(workload != nullptr);
507 // Check built programs are not empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508 CHECK(!clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000509}
510
Nikhil Rajcec6b652018-10-12 13:51:57 +0100511template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
512static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
513{
514 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000515 ClWorkloadFactory factory =
516 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100517
518 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
519 (factory, graph, dataLayout);
520
521 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
522 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100523 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
524 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100525
Mike Kellydb482882019-06-14 12:35:24 +0100526 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
527 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
528 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
529 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100530
Sadik Armagan1625efc2021-06-10 18:24:34 +0100531 CHECK((inputHandle->GetShape() == inputShape));
532 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100533}
534
Sadik Armagan1625efc2021-06-10 18:24:34 +0100535TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDepthwiseConvolutionFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100536{
537 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
538}
539
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100540template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100541static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000542{
telsoa01c577f2c2018-08-31 09:22:23 +0100543 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000544 ClWorkloadFactory factory =
545 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
546
Matthew Benthamd8067922018-10-03 17:18:04 +0100547 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000548
telsoa01c577f2c2018-08-31 09:22:23 +0100549 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000550 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100551 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
552 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100553 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100554 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100555 predResult = CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100556 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000557}
558
Sadik Armagan1625efc2021-06-10 18:24:34 +0100559TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000560{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100561 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100562}
563
Sadik Armagan1625efc2021-06-10 18:24:34 +0100564TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100565{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100566 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000567}
568
Sadik Armagan1625efc2021-06-10 18:24:34 +0100569TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000570{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000571 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000572}
573
telsoa01c577f2c2018-08-31 09:22:23 +0100574template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
575static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000576{
telsoa01c577f2c2018-08-31 09:22:23 +0100577 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000578 ClWorkloadFactory factory =
579 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
580
telsoa01c577f2c2018-08-31 09:22:23 +0100581 auto workload =
582 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000583
telsoa01c577f2c2018-08-31 09:22:23 +0100584 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000585 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100586 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
587 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100588 auto predResult = CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100589 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100590 predResult = CompareIClTensorHandleShape(outputHandle, {3, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100591 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000592}
593
telsoa01c577f2c2018-08-31 09:22:23 +0100594
Sadik Armagan1625efc2021-06-10 18:24:34 +0100595TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloatWorkloadTest")
telsoa014fcda012018-03-09 14:13:49 +0000596{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100597 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100598}
599
Sadik Armagan1625efc2021-06-10 18:24:34 +0100600TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100601{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100602 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100603}
604
telsoa01c577f2c2018-08-31 09:22:23 +0100605template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100606static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100607{
608 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000609 ClWorkloadFactory factory =
610 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
611
Matteo Martincigha160b242018-10-18 10:33:23 +0100612 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000613
telsoa01c577f2c2018-08-31 09:22:23 +0100614 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000615 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100616 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
617 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000618
Mike Kellydb482882019-06-14 12:35:24 +0100619 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
620 : std::initializer_list<unsigned int>({3, 1, 5, 5});
621 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
622 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100623
Sadik Armagan1625efc2021-06-10 18:24:34 +0100624 CHECK((inputHandle->GetShape() == inputShape));
625 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000626}
627
Sadik Armagan1625efc2021-06-10 18:24:34 +0100628TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000629{
narpra0155a97bc2018-10-02 14:35:53 +0100630 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100631}
632
Sadik Armagan1625efc2021-06-10 18:24:34 +0100633TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100634{
narpra0155a97bc2018-10-02 14:35:53 +0100635 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
636}
637
Sadik Armagan1625efc2021-06-10 18:24:34 +0100638TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100639{
640 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
641}
642
Sadik Armagan1625efc2021-06-10 18:24:34 +0100643TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100644{
645 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100646}
647
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100648template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100649static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100650{
651 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000652 ClWorkloadFactory factory =
653 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000654
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100655 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100656
Mike Kellydb482882019-06-14 12:35:24 +0100657 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
658 : std::initializer_list<unsigned int>({3, 5, 5, 2});
659 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
660 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000661
telsoa01c577f2c2018-08-31 09:22:23 +0100662 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000663 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100664 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
665 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000666
Sadik Armagan1625efc2021-06-10 18:24:34 +0100667 CHECK((inputHandle->GetShape() == inputShape));
668 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000669}
670
Sadik Armagan1625efc2021-06-10 18:24:34 +0100671TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100672{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100673 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100674}
675
Sadik Armagan1625efc2021-06-10 18:24:34 +0100676TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100677{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100678 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100679}
680
Sadik Armagan1625efc2021-06-10 18:24:34 +0100681TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100682{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100683 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100684}
685
Sadik Armagan1625efc2021-06-10 18:24:34 +0100686TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100687{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100688 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100689}
690
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100691static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
692 const armnn::TensorShape& alphaShape,
693 const armnn::TensorShape& outputShape,
694 armnn::DataType dataType)
695{
696 Graph graph;
697 ClWorkloadFactory factory =
698 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
699
700 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
701 graph,
702 inputShape,
703 alphaShape,
704 outputShape,
705 dataType);
706
707 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
708 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100709 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
710 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
711 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100712
Sadik Armagan1625efc2021-06-10 18:24:34 +0100713 CHECK((inputHandle->GetShape() == inputShape));
714 CHECK((alphaHandle->GetShape() == alphaShape));
715 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100716}
717
Sadik Armagan1625efc2021-06-10 18:24:34 +0100718TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloat16Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100719{
720 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
721}
722
Sadik Armagan1625efc2021-06-10 18:24:34 +0100723TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloatWorkload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100724{
725 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
726}
727
Sadik Armagan1625efc2021-06-10 18:24:34 +0100728TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluUint8Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100729{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000730 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100731}
732
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100733template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000734static void ClCreateReshapeWorkloadTest()
735{
telsoa01c577f2c2018-08-31 09:22:23 +0100736 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000737 ClWorkloadFactory factory =
738 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000739
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100740 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000741
telsoa01c577f2c2018-08-31 09:22:23 +0100742 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000743 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100744 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
745 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000746
Colm Donelan25ab3a82021-05-17 13:01:52 +0100747 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100748 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100749 predResult = CompareIClTensorHandleShape(outputHandle, {1, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100750 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000751}
752
Sadik Armagan1625efc2021-06-10 18:24:34 +0100753TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000754{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100755 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100756}
757
Sadik Armagan1625efc2021-06-10 18:24:34 +0100758TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100759{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100760 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000761}
762
Sadik Armagan1625efc2021-06-10 18:24:34 +0100763TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000764{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000765 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000766}
767
telsoa01c577f2c2018-08-31 09:22:23 +0100768template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
769static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000770{
telsoa01c577f2c2018-08-31 09:22:23 +0100771 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000772 ClWorkloadFactory factory =
773 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000774
telsoa01c577f2c2018-08-31 09:22:23 +0100775 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000776
arovir019e53a352018-08-31 15:26:35 +0100777 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000778 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100779 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
780 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000781
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100782 armnn::TensorInfo tensorInfo({4, 1}, DataType);
783 if (DataType == armnn::DataType::QAsymmU8)
784 {
785 tensorInfo.SetQuantizationOffset(0);
786 tensorInfo.SetQuantizationScale(1.f / 256);
787 }
788 else if (DataType == armnn::DataType::QAsymmS8)
789 {
790 tensorInfo.SetQuantizationOffset(-128);
791 tensorInfo.SetQuantizationScale(1.f / 256);
792 }
793
Colm Donelan25ab3a82021-05-17 13:01:52 +0100794 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100795 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100796 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100797 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000798}
799
telsoa01c577f2c2018-08-31 09:22:23 +0100800
Sadik Armagan1625efc2021-06-10 18:24:34 +0100801TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat32WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100802{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100803 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100804}
805
Sadik Armagan1625efc2021-06-10 18:24:34 +0100806TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100807{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100808 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
809}
810
Sadik Armagan1625efc2021-06-10 18:24:34 +0100811TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmU8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100812{
813 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
814}
815
Sadik Armagan1625efc2021-06-10 18:24:34 +0100816TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmS8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100817{
818 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100819}
820
Matthew Bentham29cadb32018-10-01 17:22:32 +0100821template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100822static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000823{
824 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000825 ClWorkloadFactory factory =
826 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000827
Matthew Bentham29cadb32018-10-01 17:22:32 +0100828 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000829
telsoa01c577f2c2018-08-31 09:22:23 +0100830 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000831 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100832 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100833 auto predResult = CompareIClTensorHandleShape(inputHandle, {5, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100834 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100835
Jan Eilersbb446e52020-04-02 13:56:54 +0100836 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100837 predResult = CompareIClTensorHandleShape(outputHandle1, {2, 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 outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100841 predResult = CompareIClTensorHandleShape(outputHandle2, {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 outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100845 predResult = CompareIClTensorHandleShape(outputHandle0, {1, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100846 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000847}
848
Sadik Armagan1625efc2021-06-10 18:24:34 +0100849TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000850{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100851 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100852}
853
Sadik Armagan1625efc2021-06-10 18:24:34 +0100854TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100855{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100856 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100857}
858
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100859template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100860static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100861{
862 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100863 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000864 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100865 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
866 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000867
868 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000869 ClWorkloadFactory factory =
870 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000871
872 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100874 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000875
876 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100877 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000878
telsoa01c577f2c2018-08-31 09:22:23 +0100879 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000880 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
881 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100882 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
883 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000884
Sadik Armagan1625efc2021-06-10 18:24:34 +0100885 CHECK(sOut0);
886 CHECK(sOut1);
887 CHECK(mIn0);
888 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000889
telsoa01c577f2c2018-08-31 09:22:23 +0100890 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000891 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100892 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000893
894
telsoa01c577f2c2018-08-31 09:22:23 +0100895 //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 +0000896 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
897 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
898
Sadik Armagan1625efc2021-06-10 18:24:34 +0100899 CHECK(validSubTensorParents);
telsoa014fcda012018-03-09 14:13:49 +0000900}
901
Sadik Armagan1625efc2021-06-10 18:24:34 +0100902TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100903{
Jim Flynne242f2d2019-05-22 14:24:13 +0100904 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100905}
906
Sadik Armagan1625efc2021-06-10 18:24:34 +0100907TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100908{
Jim Flynne242f2d2019-05-22 14:24:13 +0100909 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100910}
911
912
Sadik Armagan1625efc2021-06-10 18:24:34 +0100913TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000914{
915 // 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 +0100916 // 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 +0000917
918 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000919 ClWorkloadFactory factory =
920 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
921
Matthew Bentham29cadb32018-10-01 17:22:32 +0100922 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100923 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
924 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
925 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
926 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000927
Matthew Bentham29cadb32018-10-01 17:22:32 +0100928 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100929 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100930 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000931
telsoa01c577f2c2018-08-31 09:22:23 +0100932 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000933 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
934 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
935 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
936 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
937 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
938 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
939
940
Sadik Armagan1625efc2021-06-10 18:24:34 +0100941 CHECK(sOut0);
942 CHECK(sOut1);
943 CHECK(activ0_0Im);
944 CHECK(activ0_1Im);
945 CHECK(activ1_0Im);
946 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000947
948 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
949 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
950
Sadik Armagan1625efc2021-06-10 18:24:34 +0100951 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000952}
953
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100954#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100955
956// This test unit needs the reference backend, it's not available if the reference backend is not built
957
Sadik Armagan1625efc2021-06-10 18:24:34 +0100958TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMemCopyWorkloadsCl")
telsoa014fcda012018-03-09 14:13:49 +0000959{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000960 ClWorkloadFactory factory =
961 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
962
telsoa01c577f2c2018-08-31 09:22:23 +0100963 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000964}
965
Matteo Martincighe67edb22019-08-14 14:05:46 +0100966#endif
967
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100968template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
969static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000970{
telsoa01c577f2c2018-08-31 09:22:23 +0100971 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000972 ClWorkloadFactory factory =
973 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
974
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100975 auto workload =
976 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000977
telsoa01c577f2c2018-08-31 09:22:23 +0100978 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000979 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100980 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
981 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000982
Mike Kellydb482882019-06-14 12:35:24 +0100983 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
984 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
985 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
986 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100987
Sadik Armagan1625efc2021-06-10 18:24:34 +0100988 CHECK((inputHandle->GetShape() == inputShape));
989 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000990}
991
Sadik Armagan1625efc2021-06-10 18:24:34 +0100992TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100993{
994 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
995}
996
Sadik Armagan1625efc2021-06-10 18:24:34 +0100997TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100998{
999 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1000}
1001
Sadik Armagan1625efc2021-06-10 18:24:34 +01001002TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001003{
1004 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
1005}
1006
Sadik Armagan1625efc2021-06-10 18:24:34 +01001007TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001008{
1009 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1010}
1011
Teresa Charlin8398edc2020-07-20 14:23:02 +01001012template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
1013static void ClCreateLogSoftmaxWorkloadTest()
1014{
1015 Graph graph;
1016 ClWorkloadFactory factory =
1017 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1018
1019 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
1020
1021 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
1022 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
1023 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1024 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
1025
Colm Donelan25ab3a82021-05-17 13:01:52 +01001026 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001027 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001028 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001029 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Teresa Charlin8398edc2020-07-20 14:23:02 +01001030}
1031
Sadik Armagan1625efc2021-06-10 18:24:34 +01001032TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLogSoftmaxFloat32WorkloadTest")
Teresa Charlin8398edc2020-07-20 14:23:02 +01001033{
1034 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
1035}
1036
telsoa01c577f2c2018-08-31 09:22:23 +01001037template <typename LstmWorkloadType>
1038static void ClCreateLstmWorkloadTest()
1039{
1040 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001041 ClWorkloadFactory factory =
1042 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1043
telsoa01c577f2c2018-08-31 09:22:23 +01001044 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
1045
1046 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001047 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1048 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001049 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 2});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001050 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001051 predResult = CompareIClTensorHandleShape(outputHandle, {2, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001052 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa01c577f2c2018-08-31 09:22:23 +01001053}
1054
Sadik Armagan1625efc2021-06-10 18:24:34 +01001055TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLSTMWorkloadFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +01001056{
arovir019e53a352018-08-31 15:26:35 +01001057 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +01001058}
1059
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001060template <typename ResizeWorkloadType, typename armnn::DataType DataType>
1061static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +01001062{
1063 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001064 ClWorkloadFactory factory =
1065 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +01001066
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001067 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +01001068
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001069 auto queueDescriptor = workload->GetData();
1070
Jan Eilersbb446e52020-04-02 13:56:54 +01001071 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1072 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +01001073
Colm Donelan25ab3a82021-05-17 13:01:52 +01001074 armnn::PredicateResult predResult(true);
James Conroy074f3712018-10-03 09:32:03 +01001075 switch (dataLayout)
1076 {
1077 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +01001078 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001079 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001080 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001081 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001082 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +01001083 default: // DataLayout::NCHW
1084 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001085 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001086 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001087 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001088 }
1089}
1090
Sadik Armagan1625efc2021-06-10 18:24:34 +01001091TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001092{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001093 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001094}
1095
Sadik Armagan1625efc2021-06-10 18:24:34 +01001096TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001097{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001098 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001099}
1100
Sadik Armagan1625efc2021-06-10 18:24:34 +01001101TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001102{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001103 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001104}
1105
Sadik Armagan1625efc2021-06-10 18:24:34 +01001106TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NhwcWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001107{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001108 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1109}
1110
Sadik Armagan1625efc2021-06-10 18:24:34 +01001111TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001112{
1113 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1114}
1115
Sadik Armagan1625efc2021-06-10 18:24:34 +01001116TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001117{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001118 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001119}
telsoa01c577f2c2018-08-31 09:22:23 +01001120
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001121template <typename MeanWorkloadType, typename armnn::DataType DataType>
1122static void ClMeanWorkloadTest()
1123{
1124 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001125 ClWorkloadFactory factory =
1126 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1127
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001128 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1129
1130 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1131 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001132 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1133 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001134
1135 // 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 +01001136 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001137 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001138 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001139 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001140}
1141
Sadik Armagan1625efc2021-06-10 18:24:34 +01001142TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat32Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001143{
1144 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1145}
1146
Sadik Armagan1625efc2021-06-10 18:24:34 +01001147TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat16Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001148{
1149 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1150}
1151
Sadik Armagan1625efc2021-06-10 18:24:34 +01001152TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanUint8Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001153{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001154 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001155}
1156
Jim Flynne242f2d2019-05-22 14:24:13 +01001157template <typename ConcatWorkloadType, armnn::DataType DataType>
1158static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001159 unsigned int concatAxis)
1160{
1161 Graph graph;
1162 ClWorkloadFactory factory =
1163 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1164
Jim Flynne242f2d2019-05-22 14:24:13 +01001165 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001166
Jim Flynne242f2d2019-05-22 14:24:13 +01001167 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001168 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1169 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1170 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001171
Colm Donelan25ab3a82021-05-17 13:01:52 +01001172 auto predResult = CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001173 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001174 predResult = CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001175 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001176 predResult = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
narpra015cdda352018-11-19 15:30:27 +00001178}
1179
Sadik Armagan1625efc2021-06-10 18:24:34 +01001180TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001181{
Jim Flynne242f2d2019-05-22 14:24:13 +01001182 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001183}
1184
Sadik Armagan1625efc2021-06-10 18:24:34 +01001185TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001186{
Jim Flynne242f2d2019-05-22 14:24:13 +01001187 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001188}
1189
Sadik Armagan1625efc2021-06-10 18:24:34 +01001190TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001191{
Jim Flynne242f2d2019-05-22 14:24:13 +01001192 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001193}
1194
Sadik Armagan1625efc2021-06-10 18:24:34 +01001195TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001196{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001197 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001198}
1199
Sadik Armagan1625efc2021-06-10 18:24:34 +01001200TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001201{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001202 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001203}
1204
Sadik Armagan1625efc2021-06-10 18:24:34 +01001205TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001206{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001207 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001208}
1209
James Conroy60597842019-07-02 10:57:56 +01001210template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1211static void ClSpaceToDepthWorkloadTest()
1212{
1213 Graph graph;
1214 ClWorkloadFactory factory =
1215 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1216
1217 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1218
1219 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001220 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1221 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001222
Colm Donelan25ab3a82021-05-17 13:01:52 +01001223 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001224 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001225 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001226 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy60597842019-07-02 10:57:56 +01001227}
1228
Sadik Armagan1625efc2021-06-10 18:24:34 +01001229TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat32Workload")
James Conroy60597842019-07-02 10:57:56 +01001230{
1231 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1232}
1233
Sadik Armagan1625efc2021-06-10 18:24:34 +01001234TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat16Workload")
James Conroy60597842019-07-02 10:57:56 +01001235{
1236 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1237}
1238
Sadik Armagan1625efc2021-06-10 18:24:34 +01001239TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQAsymm8Workload")
James Conroy60597842019-07-02 10:57:56 +01001240{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001241 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001242}
1243
Sadik Armagan1625efc2021-06-10 18:24:34 +01001244TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQSymm16Workload")
James Conroy60597842019-07-02 10:57:56 +01001245{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001246 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001247}
1248
Matthew Jacksond5166102019-07-31 14:06:28 +01001249template <armnn::DataType DataType>
1250static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1251 const std::initializer_list<unsigned int>& outputShape,
1252 unsigned int axis,
1253 unsigned int numInputs)
1254{
1255 armnn::Graph graph;
1256 ClWorkloadFactory factory =
1257 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1258
1259 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1260 graph,
1261 TensorShape(inputShape),
1262 TensorShape(outputShape),
1263 axis,
1264 numInputs);
1265
1266 // Check inputs and output are as expected
1267 StackQueueDescriptor queueDescriptor = workload->GetData();
1268 for (unsigned int i = 0; i < numInputs; ++i)
1269 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001270 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001271 auto predResult1 = CompareIClTensorHandleShape(inputHandle, inputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001272 CHECK_MESSAGE(predResult1.m_Result, predResult1.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001273 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001274 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001275 auto predResult2 = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001276 CHECK_MESSAGE(predResult2.m_Result, predResult2.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001277}
1278
Sadik Armagan1625efc2021-06-10 18:24:34 +01001279TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat32Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001280{
1281 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1282}
1283
Sadik Armagan1625efc2021-06-10 18:24:34 +01001284TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +01001285{
1286 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1287}
1288
Sadik Armagan1625efc2021-06-10 18:24:34 +01001289TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackUint8Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001290{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001291 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001292}
1293
Ryan OShea2323af42020-05-13 16:36:19 +01001294
1295template <typename QLstmWorkloadType>
1296static void ClCreateQLstmWorkloadTest()
1297{
1298 Graph graph;
1299 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1300
1301 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1302 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1303
1304 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001305 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1306 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001307
1308 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001309 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1310 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ryan OShea2323af42020-05-13 16:36:19 +01001311
1312 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001313 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1314 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001315}
1316
Sadik Armagan1625efc2021-06-10 18:24:34 +01001317TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQLstmWorkloadTest")
Ryan OShea2323af42020-05-13 16:36:19 +01001318{
1319 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1320}
1321
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001322template <typename QuantizedLstmWorkloadType>
1323static void ClCreateQuantizedLstmWorkloadTest()
1324{
1325 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001326
1327 Graph graph;
1328 ClWorkloadFactory factory =
1329 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1330
1331 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1332
1333 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1334
Jan Eilersbb446e52020-04-02 13:56:54 +01001335 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001336 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1337 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001338
Jan Eilersbb446e52020-04-02 13:56:54 +01001339 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001340 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1341 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001342
Jan Eilersbb446e52020-04-02 13:56:54 +01001343 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001344 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1345 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001346
Jan Eilersbb446e52020-04-02 13:56:54 +01001347 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001348 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1349 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001350
Jan Eilersbb446e52020-04-02 13:56:54 +01001351 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001352 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1353 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001354}
1355
Sadik Armagan1625efc2021-06-10 18:24:34 +01001356TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQuantizedLstmWorkload")
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001357{
1358 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1359}
1360
Teresa Charlin98b0dcb2022-01-18 22:09:29 +00001361template <armnn::DataType DataType>
1362static void ClCreateActivationWorkloadReplaceFunctionsTest()
1363{
1364 std::shared_ptr<ClMemoryManager> memoryManager = std::make_shared<ClMemoryManager>(
1365 std::make_unique<arm_compute::CLBufferAllocator>());
1366
1367 Graph graph;
1368 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(memoryManager);
1369 // input and output are created as armnn::TensorInfo tensorInfo({1, 1}, DataType)
1370 auto workloadPtr = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
1371
1372 // new input and output tensor handlers are created and then replace in the workload
1373 const ClTensorHandleFactory tensorHandleFactory(memoryManager);
1374 TensorInfo inputInfo({2 , 2}, DataType::Float16);
1375 TensorInfo outputInfo({2 , 2}, DataType::Float16);
1376 unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo, true);
1377 inputHandle->Manage();
1378 inputHandle->Allocate();
1379 unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo, true);
1380 outputHandle->Manage();
1381 outputHandle->Allocate();
1382
1383 unsigned int slot = 0;
1384 CHECK_THROWS_AS(workloadPtr->ReplaceInputTensorHandle(inputHandle.get(), slot), UnimplementedException);
1385 CHECK_THROWS_AS(workloadPtr->ReplaceOutputTensorHandle(outputHandle.get(), slot), UnimplementedException);
1386}
1387
1388TEST_CASE("ClReplaceFunctionsfromFloat32toFloat16ActivationWorkload")
1389{
1390 ClCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::Float32>();
1391}
1392
Sadik Armagan1625efc2021-06-10 18:24:34 +01001393}