blob: adea733582e1f1a9f01b161369b3da40f50d2a9c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Mike Kellyec67a0f2022-11-25 13:55:24 +00002// Copyright © 2017,2022 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;
Sadik Armagane9444752020-12-02 11:28:58 +0000480
481 Convolution2dQueueDescriptor queueDescriptor;
482 queueDescriptor.m_Parameters = descriptor;
Sadik Armagane9444752020-12-02 11:28:58 +0000483
484 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100485 AddInputToWorkload(queueDescriptor, workloadInfo, kernelInfo, weightsHandle.get());
486 AddInputToWorkload(queueDescriptor, workloadInfo, biasInfo, biasHandle.get());
Sadik Armagane9444752020-12-02 11:28:58 +0000487 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
488
489 // Initialize our m_CLCompileContext using default device and context
490 auto context = arm_compute::CLKernelLibrary::get().context();
491 auto device = arm_compute::CLKernelLibrary::get().get_device();
492 auto clCompileContext = arm_compute::CLCompileContext(context, device);
493
494
495
496 // Check built programs are empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100497 CHECK(clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000498
499 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
500 workloadInfo,
501 clMemoryManager->GetIntraLayerManager(),
502 clCompileContext);
503 ARMNN_ASSERT(workload != nullptr);
504 // Check built programs are not empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100505 CHECK(!clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000506}
507
Nikhil Rajcec6b652018-10-12 13:51:57 +0100508template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
509static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
510{
511 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000512 ClWorkloadFactory factory =
513 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100514
515 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
516 (factory, graph, dataLayout);
517
518 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
519 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100520 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
521 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100522
Mike Kellydb482882019-06-14 12:35:24 +0100523 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
524 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
525 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
526 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100527
Sadik Armagan1625efc2021-06-10 18:24:34 +0100528 CHECK((inputHandle->GetShape() == inputShape));
529 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100530}
531
Sadik Armagan1625efc2021-06-10 18:24:34 +0100532TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDepthwiseConvolutionFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100533{
534 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
535}
536
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100537template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100538static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000539{
telsoa01c577f2c2018-08-31 09:22:23 +0100540 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000541 ClWorkloadFactory factory =
542 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
543
Matthew Benthamd8067922018-10-03 17:18:04 +0100544 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000545
telsoa01c577f2c2018-08-31 09:22:23 +0100546 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000547 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100548 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
549 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100550 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100551 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100552 predResult = CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100553 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000554}
555
Sadik Armagan1625efc2021-06-10 18:24:34 +0100556TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000557{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100558 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100559}
560
Sadik Armagan1625efc2021-06-10 18:24:34 +0100561TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100562{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100563 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000564}
565
Sadik Armagan1625efc2021-06-10 18:24:34 +0100566TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000567{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000568 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000569}
570
telsoa01c577f2c2018-08-31 09:22:23 +0100571template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
572static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000573{
telsoa01c577f2c2018-08-31 09:22:23 +0100574 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000575 ClWorkloadFactory factory =
576 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
577
telsoa01c577f2c2018-08-31 09:22:23 +0100578 auto workload =
579 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000580
telsoa01c577f2c2018-08-31 09:22:23 +0100581 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000582 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100583 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
584 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100585 auto predResult = CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100586 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100587 predResult = CompareIClTensorHandleShape(outputHandle, {3, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100588 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000589}
590
telsoa01c577f2c2018-08-31 09:22:23 +0100591
Sadik Armagan1625efc2021-06-10 18:24:34 +0100592TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloatWorkloadTest")
telsoa014fcda012018-03-09 14:13:49 +0000593{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100594 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100595}
596
Sadik Armagan1625efc2021-06-10 18:24:34 +0100597TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100598{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100599 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100600}
601
telsoa01c577f2c2018-08-31 09:22:23 +0100602template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100603static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100604{
605 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000606 ClWorkloadFactory factory =
607 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
608
Matteo Martincigha160b242018-10-18 10:33:23 +0100609 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000610
telsoa01c577f2c2018-08-31 09:22:23 +0100611 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000612 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100613 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
614 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000615
Mike Kellydb482882019-06-14 12:35:24 +0100616 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
617 : std::initializer_list<unsigned int>({3, 1, 5, 5});
618 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
619 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100620
Sadik Armagan1625efc2021-06-10 18:24:34 +0100621 CHECK((inputHandle->GetShape() == inputShape));
622 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000623}
624
Sadik Armagan1625efc2021-06-10 18:24:34 +0100625TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000626{
narpra0155a97bc2018-10-02 14:35:53 +0100627 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100628}
629
Sadik Armagan1625efc2021-06-10 18:24:34 +0100630TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100631{
narpra0155a97bc2018-10-02 14:35:53 +0100632 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
633}
634
Sadik Armagan1625efc2021-06-10 18:24:34 +0100635TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100636{
637 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
638}
639
Sadik Armagan1625efc2021-06-10 18:24:34 +0100640TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100641{
642 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100643}
644
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100645template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100646static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100647{
648 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000649 ClWorkloadFactory factory =
650 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000651
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100652 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100653
Mike Kellydb482882019-06-14 12:35:24 +0100654 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
655 : std::initializer_list<unsigned int>({3, 5, 5, 2});
656 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
657 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000658
telsoa01c577f2c2018-08-31 09:22:23 +0100659 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000660 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100661 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
662 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000663
Sadik Armagan1625efc2021-06-10 18:24:34 +0100664 CHECK((inputHandle->GetShape() == inputShape));
665 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000666}
667
Sadik Armagan1625efc2021-06-10 18:24:34 +0100668TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100669{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100670 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100671}
672
Sadik Armagan1625efc2021-06-10 18:24:34 +0100673TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100674{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100675 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100676}
677
Sadik Armagan1625efc2021-06-10 18:24:34 +0100678TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100679{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100680 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100681}
682
Sadik Armagan1625efc2021-06-10 18:24:34 +0100683TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100684{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100685 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100686}
687
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100688static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
689 const armnn::TensorShape& alphaShape,
690 const armnn::TensorShape& outputShape,
691 armnn::DataType dataType)
692{
693 Graph graph;
694 ClWorkloadFactory factory =
695 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
696
697 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
698 graph,
699 inputShape,
700 alphaShape,
701 outputShape,
702 dataType);
703
704 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
705 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100706 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
707 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
708 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100709
Sadik Armagan1625efc2021-06-10 18:24:34 +0100710 CHECK((inputHandle->GetShape() == inputShape));
711 CHECK((alphaHandle->GetShape() == alphaShape));
712 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100713}
714
Sadik Armagan1625efc2021-06-10 18:24:34 +0100715TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloat16Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100716{
717 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
718}
719
Sadik Armagan1625efc2021-06-10 18:24:34 +0100720TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloatWorkload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100721{
722 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
723}
724
Sadik Armagan1625efc2021-06-10 18:24:34 +0100725TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluUint8Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100726{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000727 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100728}
729
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100730template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000731static void ClCreateReshapeWorkloadTest()
732{
telsoa01c577f2c2018-08-31 09:22:23 +0100733 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000734 ClWorkloadFactory factory =
735 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000736
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100737 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000738
telsoa01c577f2c2018-08-31 09:22:23 +0100739 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000740 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100741 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
742 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000743
Colm Donelan25ab3a82021-05-17 13:01:52 +0100744 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100745 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100746 predResult = CompareIClTensorHandleShape(outputHandle, {1, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100747 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000748}
749
Sadik Armagan1625efc2021-06-10 18:24:34 +0100750TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000751{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100752 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100753}
754
Sadik Armagan1625efc2021-06-10 18:24:34 +0100755TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100756{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100757 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000758}
759
Sadik Armagan1625efc2021-06-10 18:24:34 +0100760TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000761{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000762 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000763}
764
telsoa01c577f2c2018-08-31 09:22:23 +0100765template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
766static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000767{
telsoa01c577f2c2018-08-31 09:22:23 +0100768 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000769 ClWorkloadFactory factory =
770 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000771
telsoa01c577f2c2018-08-31 09:22:23 +0100772 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000773
arovir019e53a352018-08-31 15:26:35 +0100774 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000775 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100776 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
777 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000778
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100779 armnn::TensorInfo tensorInfo({4, 1}, DataType);
780 if (DataType == armnn::DataType::QAsymmU8)
781 {
782 tensorInfo.SetQuantizationOffset(0);
783 tensorInfo.SetQuantizationScale(1.f / 256);
784 }
785 else if (DataType == armnn::DataType::QAsymmS8)
786 {
787 tensorInfo.SetQuantizationOffset(-128);
788 tensorInfo.SetQuantizationScale(1.f / 256);
789 }
790
Colm Donelan25ab3a82021-05-17 13:01:52 +0100791 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100792 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100793 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100794 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000795}
796
telsoa01c577f2c2018-08-31 09:22:23 +0100797
Sadik Armagan1625efc2021-06-10 18:24:34 +0100798TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat32WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100799{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100800 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100801}
802
Sadik Armagan1625efc2021-06-10 18:24:34 +0100803TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100804{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100805 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
806}
807
Sadik Armagan1625efc2021-06-10 18:24:34 +0100808TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmU8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100809{
810 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
811}
812
Sadik Armagan1625efc2021-06-10 18:24:34 +0100813TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmS8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100814{
815 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100816}
817
Matthew Bentham29cadb32018-10-01 17:22:32 +0100818template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100819static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000820{
821 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000822 ClWorkloadFactory factory =
823 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000824
Matthew Bentham29cadb32018-10-01 17:22:32 +0100825 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000826
telsoa01c577f2c2018-08-31 09:22:23 +0100827 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000828 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100829 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100830 auto predResult = CompareIClTensorHandleShape(inputHandle, {5, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100832
Jan Eilersbb446e52020-04-02 13:56:54 +0100833 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100834 predResult = CompareIClTensorHandleShape(outputHandle1, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100835 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100836
Jan Eilersbb446e52020-04-02 13:56:54 +0100837 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100838 predResult = CompareIClTensorHandleShape(outputHandle2, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100839 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100840
Jan Eilersbb446e52020-04-02 13:56:54 +0100841 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100842 predResult = CompareIClTensorHandleShape(outputHandle0, {1, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100843 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000844}
845
Sadik Armagan1625efc2021-06-10 18:24:34 +0100846TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000847{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100848 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100849}
850
Sadik Armagan1625efc2021-06-10 18:24:34 +0100851TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100852{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100853 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100854}
855
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100856template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100857static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100858{
859 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100860 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000861 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100862 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
863 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000864
865 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000866 ClWorkloadFactory factory =
867 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000868
869 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100870 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100871 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000872
873 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100874 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000875
telsoa01c577f2c2018-08-31 09:22:23 +0100876 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000877 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
878 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100879 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
880 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000881
Sadik Armagan1625efc2021-06-10 18:24:34 +0100882 CHECK(sOut0);
883 CHECK(sOut1);
884 CHECK(mIn0);
885 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000886
telsoa01c577f2c2018-08-31 09:22:23 +0100887 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000888 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100889 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000890
891
telsoa01c577f2c2018-08-31 09:22:23 +0100892 //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 +0000893 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
894 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
895
Sadik Armagan1625efc2021-06-10 18:24:34 +0100896 CHECK(validSubTensorParents);
telsoa014fcda012018-03-09 14:13:49 +0000897}
898
Sadik Armagan1625efc2021-06-10 18:24:34 +0100899TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100900{
Jim Flynne242f2d2019-05-22 14:24:13 +0100901 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100902}
903
Sadik Armagan1625efc2021-06-10 18:24:34 +0100904TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100905{
Jim Flynne242f2d2019-05-22 14:24:13 +0100906 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100907}
908
909
Sadik Armagan1625efc2021-06-10 18:24:34 +0100910TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000911{
912 // 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 +0100913 // 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 +0000914
915 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000916 ClWorkloadFactory factory =
917 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
918
Matthew Bentham29cadb32018-10-01 17:22:32 +0100919 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100920 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
921 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
922 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
923 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000924
Matthew Bentham29cadb32018-10-01 17:22:32 +0100925 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100926 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100927 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000928
telsoa01c577f2c2018-08-31 09:22:23 +0100929 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000930 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
931 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
932 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
933 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
934 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
935 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
936
937
Sadik Armagan1625efc2021-06-10 18:24:34 +0100938 CHECK(sOut0);
939 CHECK(sOut1);
940 CHECK(activ0_0Im);
941 CHECK(activ0_1Im);
942 CHECK(activ1_0Im);
943 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000944
945 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
946 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
947
Sadik Armagan1625efc2021-06-10 18:24:34 +0100948 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000949}
950
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100951#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100952
953// This test unit needs the reference backend, it's not available if the reference backend is not built
954
Sadik Armagan1625efc2021-06-10 18:24:34 +0100955TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMemCopyWorkloadsCl")
telsoa014fcda012018-03-09 14:13:49 +0000956{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000957 ClWorkloadFactory factory =
958 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
959
telsoa01c577f2c2018-08-31 09:22:23 +0100960 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000961}
962
Matteo Martincighe67edb22019-08-14 14:05:46 +0100963#endif
964
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100965template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
966static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000967{
telsoa01c577f2c2018-08-31 09:22:23 +0100968 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000969 ClWorkloadFactory factory =
970 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
971
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100972 auto workload =
973 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000974
telsoa01c577f2c2018-08-31 09:22:23 +0100975 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000976 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100977 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
978 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000979
Mike Kellydb482882019-06-14 12:35:24 +0100980 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
981 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
982 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
983 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100984
Sadik Armagan1625efc2021-06-10 18:24:34 +0100985 CHECK((inputHandle->GetShape() == inputShape));
986 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000987}
988
Sadik Armagan1625efc2021-06-10 18:24:34 +0100989TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100990{
991 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
992}
993
Sadik Armagan1625efc2021-06-10 18:24:34 +0100994TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100995{
996 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
997}
998
Sadik Armagan1625efc2021-06-10 18:24:34 +0100999TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001000{
1001 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
1002}
1003
Sadik Armagan1625efc2021-06-10 18:24:34 +01001004TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +01001005{
1006 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1007}
1008
Teresa Charlin8398edc2020-07-20 14:23:02 +01001009template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
1010static void ClCreateLogSoftmaxWorkloadTest()
1011{
1012 Graph graph;
1013 ClWorkloadFactory factory =
1014 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1015
1016 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
1017
1018 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
1019 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
1020 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1021 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
1022
Colm Donelan25ab3a82021-05-17 13:01:52 +01001023 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001024 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001025 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001026 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Teresa Charlin8398edc2020-07-20 14:23:02 +01001027}
1028
Sadik Armagan1625efc2021-06-10 18:24:34 +01001029TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLogSoftmaxFloat32WorkloadTest")
Teresa Charlin8398edc2020-07-20 14:23:02 +01001030{
1031 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
1032}
1033
telsoa01c577f2c2018-08-31 09:22:23 +01001034template <typename LstmWorkloadType>
1035static void ClCreateLstmWorkloadTest()
1036{
1037 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001038 ClWorkloadFactory factory =
1039 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1040
telsoa01c577f2c2018-08-31 09:22:23 +01001041 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
1042
1043 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001044 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1045 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001046 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 2});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001047 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001048 predResult = CompareIClTensorHandleShape(outputHandle, {2, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001049 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa01c577f2c2018-08-31 09:22:23 +01001050}
1051
Sadik Armagan1625efc2021-06-10 18:24:34 +01001052TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLSTMWorkloadFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +01001053{
arovir019e53a352018-08-31 15:26:35 +01001054 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +01001055}
1056
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001057template <typename ResizeWorkloadType, typename armnn::DataType DataType>
1058static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +01001059{
1060 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001061 ClWorkloadFactory factory =
1062 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +01001063
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001064 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +01001065
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001066 auto queueDescriptor = workload->GetData();
1067
Jan Eilersbb446e52020-04-02 13:56:54 +01001068 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1069 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +01001070
Colm Donelan25ab3a82021-05-17 13:01:52 +01001071 armnn::PredicateResult predResult(true);
James Conroy074f3712018-10-03 09:32:03 +01001072 switch (dataLayout)
1073 {
1074 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +01001075 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001076 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001077 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001078 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001079 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +01001080 default: // DataLayout::NCHW
1081 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001082 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001083 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001084 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001085 }
1086}
1087
Sadik Armagan1625efc2021-06-10 18:24:34 +01001088TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001089{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001090 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001091}
1092
Sadik Armagan1625efc2021-06-10 18:24:34 +01001093TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001094{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001095 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001096}
1097
Sadik Armagan1625efc2021-06-10 18:24:34 +01001098TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001099{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001100 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001101}
1102
Sadik Armagan1625efc2021-06-10 18:24:34 +01001103TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NhwcWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001104{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001105 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1106}
1107
Sadik Armagan1625efc2021-06-10 18:24:34 +01001108TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001109{
1110 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1111}
1112
Sadik Armagan1625efc2021-06-10 18:24:34 +01001113TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001114{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001115 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001116}
telsoa01c577f2c2018-08-31 09:22:23 +01001117
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001118template <typename MeanWorkloadType, typename armnn::DataType DataType>
1119static void ClMeanWorkloadTest()
1120{
1121 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001122 ClWorkloadFactory factory =
1123 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1124
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001125 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1126
1127 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1128 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001129 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1130 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001131
1132 // 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 +01001133 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001134 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001135 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001136 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001137}
1138
Sadik Armagan1625efc2021-06-10 18:24:34 +01001139TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat32Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001140{
1141 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1142}
1143
Sadik Armagan1625efc2021-06-10 18:24:34 +01001144TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat16Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001145{
1146 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1147}
1148
Sadik Armagan1625efc2021-06-10 18:24:34 +01001149TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanUint8Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001150{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001151 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001152}
1153
Jim Flynne242f2d2019-05-22 14:24:13 +01001154template <typename ConcatWorkloadType, armnn::DataType DataType>
1155static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001156 unsigned int concatAxis)
1157{
1158 Graph graph;
1159 ClWorkloadFactory factory =
1160 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1161
Jim Flynne242f2d2019-05-22 14:24:13 +01001162 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001163
Jim Flynne242f2d2019-05-22 14:24:13 +01001164 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001165 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1166 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1167 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001168
Colm Donelan25ab3a82021-05-17 13:01:52 +01001169 auto predResult = CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001170 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001171 predResult = CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001172 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001173 predResult = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001174 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
narpra015cdda352018-11-19 15:30:27 +00001175}
1176
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001178{
Jim Flynne242f2d2019-05-22 14:24:13 +01001179 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001180}
1181
Sadik Armagan1625efc2021-06-10 18:24:34 +01001182TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001183{
Jim Flynne242f2d2019-05-22 14:24:13 +01001184 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001185}
1186
Sadik Armagan1625efc2021-06-10 18:24:34 +01001187TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001188{
Jim Flynne242f2d2019-05-22 14:24:13 +01001189 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001190}
1191
Sadik Armagan1625efc2021-06-10 18:24:34 +01001192TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001193{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001194 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001195}
1196
Sadik Armagan1625efc2021-06-10 18:24:34 +01001197TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001198{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001199 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001200}
1201
Sadik Armagan1625efc2021-06-10 18:24:34 +01001202TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001203{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001204 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001205}
1206
James Conroy60597842019-07-02 10:57:56 +01001207template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1208static void ClSpaceToDepthWorkloadTest()
1209{
1210 Graph graph;
1211 ClWorkloadFactory factory =
1212 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1213
1214 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1215
1216 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001217 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1218 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001219
Colm Donelan25ab3a82021-05-17 13:01:52 +01001220 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001221 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001222 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001223 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy60597842019-07-02 10:57:56 +01001224}
1225
Sadik Armagan1625efc2021-06-10 18:24:34 +01001226TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat32Workload")
James Conroy60597842019-07-02 10:57:56 +01001227{
1228 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1229}
1230
Sadik Armagan1625efc2021-06-10 18:24:34 +01001231TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat16Workload")
James Conroy60597842019-07-02 10:57:56 +01001232{
1233 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1234}
1235
Sadik Armagan1625efc2021-06-10 18:24:34 +01001236TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQAsymm8Workload")
James Conroy60597842019-07-02 10:57:56 +01001237{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001238 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001239}
1240
Sadik Armagan1625efc2021-06-10 18:24:34 +01001241TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQSymm16Workload")
James Conroy60597842019-07-02 10:57:56 +01001242{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001243 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001244}
1245
Matthew Jacksond5166102019-07-31 14:06:28 +01001246template <armnn::DataType DataType>
1247static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1248 const std::initializer_list<unsigned int>& outputShape,
1249 unsigned int axis,
1250 unsigned int numInputs)
1251{
1252 armnn::Graph graph;
1253 ClWorkloadFactory factory =
1254 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1255
1256 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1257 graph,
1258 TensorShape(inputShape),
1259 TensorShape(outputShape),
1260 axis,
1261 numInputs);
1262
1263 // Check inputs and output are as expected
1264 StackQueueDescriptor queueDescriptor = workload->GetData();
1265 for (unsigned int i = 0; i < numInputs; ++i)
1266 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001267 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001268 auto predResult1 = CompareIClTensorHandleShape(inputHandle, inputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001269 CHECK_MESSAGE(predResult1.m_Result, predResult1.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001270 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001271 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001272 auto predResult2 = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001273 CHECK_MESSAGE(predResult2.m_Result, predResult2.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001274}
1275
Sadik Armagan1625efc2021-06-10 18:24:34 +01001276TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat32Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001277{
1278 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1279}
1280
Sadik Armagan1625efc2021-06-10 18:24:34 +01001281TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +01001282{
1283 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1284}
1285
Sadik Armagan1625efc2021-06-10 18:24:34 +01001286TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackUint8Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001287{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001288 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001289}
1290
Ryan OShea2323af42020-05-13 16:36:19 +01001291
1292template <typename QLstmWorkloadType>
1293static void ClCreateQLstmWorkloadTest()
1294{
1295 Graph graph;
1296 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1297
1298 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1299 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1300
1301 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001302 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1303 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001304
1305 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001306 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1307 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ryan OShea2323af42020-05-13 16:36:19 +01001308
1309 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001310 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1311 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001312}
1313
Sadik Armagan1625efc2021-06-10 18:24:34 +01001314TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQLstmWorkloadTest")
Ryan OShea2323af42020-05-13 16:36:19 +01001315{
1316 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1317}
1318
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001319template <typename QuantizedLstmWorkloadType>
1320static void ClCreateQuantizedLstmWorkloadTest()
1321{
1322 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001323
1324 Graph graph;
1325 ClWorkloadFactory factory =
1326 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1327
1328 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1329
1330 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1331
Jan Eilersbb446e52020-04-02 13:56:54 +01001332 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001333 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1334 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001335
Jan Eilersbb446e52020-04-02 13:56:54 +01001336 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001337 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1338 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001339
Jan Eilersbb446e52020-04-02 13:56:54 +01001340 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001341 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1342 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001343
Jan Eilersbb446e52020-04-02 13:56:54 +01001344 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001345 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1346 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001347
Jan Eilersbb446e52020-04-02 13:56:54 +01001348 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001349 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1350 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001351}
1352
Sadik Armagan1625efc2021-06-10 18:24:34 +01001353TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQuantizedLstmWorkload")
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001354{
1355 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1356}
1357
Teresa Charlin98b0dcb2022-01-18 22:09:29 +00001358template <armnn::DataType DataType>
1359static void ClCreateActivationWorkloadReplaceFunctionsTest()
1360{
1361 std::shared_ptr<ClMemoryManager> memoryManager = std::make_shared<ClMemoryManager>(
1362 std::make_unique<arm_compute::CLBufferAllocator>());
1363
1364 Graph graph;
1365 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(memoryManager);
1366 // input and output are created as armnn::TensorInfo tensorInfo({1, 1}, DataType)
1367 auto workloadPtr = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
1368
1369 // new input and output tensor handlers are created and then replace in the workload
1370 const ClTensorHandleFactory tensorHandleFactory(memoryManager);
1371 TensorInfo inputInfo({2 , 2}, DataType::Float16);
1372 TensorInfo outputInfo({2 , 2}, DataType::Float16);
1373 unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo, true);
1374 inputHandle->Manage();
1375 inputHandle->Allocate();
1376 unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo, true);
1377 outputHandle->Manage();
1378 outputHandle->Allocate();
1379
1380 unsigned int slot = 0;
1381 CHECK_THROWS_AS(workloadPtr->ReplaceInputTensorHandle(inputHandle.get(), slot), UnimplementedException);
1382 CHECK_THROWS_AS(workloadPtr->ReplaceOutputTensorHandle(outputHandle.get(), slot), UnimplementedException);
1383}
1384
1385TEST_CASE("ClReplaceFunctionsfromFloat32toFloat16ActivationWorkload")
1386{
1387 ClCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::Float32>();
1388}
1389
Sadik Armagan1625efc2021-06-10 18:24:34 +01001390}