blob: 51ea0dc5d36daad3d171b7e237995a9067ce402b [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Mike Kelly3ec30772023-03-08 13:47:17 +00002// Copyright © 2017-2023 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,
David Beck4a8692c2018-09-07 16:19:24 +010069 armnn::DataType DataType>
Mike Kelly3ec30772023-03-08 13:47:17 +000070static void ClCreateElementwiseWorkloadTest(BinaryOperation binaryOperator)
telsoa014fcda012018-03-09 14:13:49 +000071{
72 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000073 ClWorkloadFactory factory =
74 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
75
Mike Kelly3ec30772023-03-08 13:47:17 +000076 auto workload = CreateElementwiseBinaryWorkloadTest<WorkloadType, DataType>(factory, graph, binaryOperator);
telsoa014fcda012018-03-09 14:13:49 +000077
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
Mike Kelly3ec30772023-03-08 13:47:17 +000079 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010080 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
81 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
82 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +010083 auto predResult = CompareIClTensorHandleShape(inputHandle1, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010084 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +010085 predResult = CompareIClTensorHandleShape(inputHandle2, {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(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +000089}
90
Sadik Armagan1625efc2021-06-10 18:24:34 +010091TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +000092{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000093 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +000094 armnn::DataType::Float32>(BinaryOperation::Add);
telsoa01c577f2c2018-08-31 09:22:23 +010095}
96
Sadik Armagan1625efc2021-06-10 18:24:34 +010097TEST_CASE_FIXTURE(ClContextControlFixture, "CreateAdditionFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +010098{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000099 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000100 armnn::DataType::Float16>(BinaryOperation::Add);
David Beck4a8692c2018-09-07 16:19:24 +0100101}
102
Sadik Armagan1625efc2021-06-10 18:24:34 +0100103TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloatWorkload")
David Beck4a8692c2018-09-07 16:19:24 +0100104{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000105 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000106 armnn::DataType::Float32>(BinaryOperation::Sub);
David Beck4a8692c2018-09-07 16:19:24 +0100107}
108
Sadik Armagan1625efc2021-06-10 18:24:34 +0100109TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSubtractionFloat16Workload")
David Beck4a8692c2018-09-07 16:19:24 +0100110{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000111 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000112 armnn::DataType::Float16>(BinaryOperation::Sub);
David Beck4a8692c2018-09-07 16:19:24 +0100113}
114
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100116{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000117 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000118 armnn::DataType::Float32>(BinaryOperation::Mul);
David Beck4a8692c2018-09-07 16:19:24 +0100119}
120
Sadik Armagan1625efc2021-06-10 18:24:34 +0100121TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100122{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000123 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000124 armnn::DataType::Float16>(BinaryOperation::Mul);
David Beck4a8692c2018-09-07 16:19:24 +0100125}
126
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMultiplicationUint8WorkloadTest")
Matthew Benthame2ec3302018-10-01 11:32:48 +0100128{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000129 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000130 armnn::DataType::QAsymmU8>(BinaryOperation::Mul);
Matthew Benthame2ec3302018-10-01 11:32:48 +0100131}
132
Sadik Armagan1625efc2021-06-10 18:24:34 +0100133TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloatWorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100134{
Teresa Charline11e63d2021-04-21 12:56:45 +0100135 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000136 armnn::DataType::Float32>(BinaryOperation::Div);
David Beck4a8692c2018-09-07 16:19:24 +0100137}
138
Sadik Armagan1625efc2021-06-10 18:24:34 +0100139TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDivisionFloat16WorkloadTest")
David Beck4a8692c2018-09-07 16:19:24 +0100140{
Teresa Charline11e63d2021-04-21 12:56:45 +0100141 ClCreateElementwiseWorkloadTest<ClDivisionWorkload,
Mike Kelly3ec30772023-03-08 13:47:17 +0000142 armnn::DataType::Float16>(BinaryOperation::Div);
telsoa01c577f2c2018-08-31 09:22:23 +0100143}
144
josh minor4a3c6102020-01-06 16:40:46 -0600145template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100146 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100147 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600148static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100149{
150 Graph graph;
151 ClWorkloadFactory factory =
152 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
153
josh minor4a3c6102020-01-06 16:40:46 -0600154 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100155
156 DescriptorType queueDescriptor = workload->GetData();
157
Jan Eilersbb446e52020-04-02 13:56:54 +0100158 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
159 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100160
Colm Donelan25ab3a82021-05-17 13:01:52 +0100161 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100162 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100163
164 predResult = CompareIClTensorHandleShape(outputHandle, {2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100165 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100166}
167
Sadik Armagan1625efc2021-06-10 18:24:34 +0100168TEST_CASE_FIXTURE(ClContextControlFixture, "CreateRsqrtFloat32WorkloadTest")
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100169{
josh minor4a3c6102020-01-06 16:40:46 -0600170 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
171 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100172}
173
telsoa01c577f2c2018-08-31 09:22:23 +0100174template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100175static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100176{
177 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000178 ClWorkloadFactory factory =
179 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000180
telsoa01c577f2c2018-08-31 09:22:23 +0100181 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100182 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000183
telsoa01c577f2c2018-08-31 09:22:23 +0100184 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000185 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100186 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
187 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000188
Colm Donelan25ab3a82021-05-17 13:01:52 +0100189 armnn::PredicateResult predResult(true);
190 switch (dataLayout)
Nikhil Rajd1340932018-10-18 14:27:50 +0100191 {
192 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +0100193 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100194 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100195 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100196 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100197 break;
198 default: // NCHW
Colm Donelan25ab3a82021-05-17 13:01:52 +0100199 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100200 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100201 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100202 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Nikhil Rajd1340932018-10-18 14:27:50 +0100203 }
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
Sadik Armagan1625efc2021-06-10 18:24:34 +0100206TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000207{
Nikhil Rajd1340932018-10-18 14:27:50 +0100208 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
209 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100210}
telsoa014fcda012018-03-09 14:13:49 +0000211
Sadik Armagan1625efc2021-06-10 18:24:34 +0100212TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100213{
Nikhil Rajd1340932018-10-18 14:27:50 +0100214 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
215 armnn::DataType::Float16>(DataLayout::NCHW);
216}
217
Sadik Armagan1625efc2021-06-10 18:24:34 +0100218TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationFloatNhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100219{
220 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
221 armnn::DataType::Float32>(DataLayout::NHWC);
222}
223
Sadik Armagan1625efc2021-06-10 18:24:34 +0100224TEST_CASE_FIXTURE(ClContextControlFixture, "CreateBatchNormalizationNhwcFloat16NhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100225{
226 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
227 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100228}
229
Sadik Armagan1625efc2021-06-10 18:24:34 +0100230TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp16ToFp32Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100231{
232 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000233 ClWorkloadFactory factory =
234 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
235
telsoa01c577f2c2018-08-31 09:22:23 +0100236 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
237
238 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100239 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
240 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100241 auto predResult = CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100242 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100243 predResult = CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100244 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
245 CHECK((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
246 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
telsoa01c577f2c2018-08-31 09:22:23 +0100247}
248
Sadik Armagan1625efc2021-06-10 18:24:34 +0100249TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvertFp32ToFp16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100250{
251 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000252 ClWorkloadFactory factory =
253 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
254
telsoa01c577f2c2018-08-31 09:22:23 +0100255 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
256
257 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100258 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
259 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100260
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::F32));
266 CHECK((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
telsoa01c577f2c2018-08-31 09:22:23 +0100267}
268
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100269template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
270static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100271{
272 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000273 ClWorkloadFactory factory =
274 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
275
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100276 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
277 graph,
278 dataLayout);
279
Mike Kellydb482882019-06-14 12:35:24 +0100280 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
281 : std::initializer_list<unsigned int>({2, 8, 16, 3});
282 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
283 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100284
285 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000286 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100287 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
288 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100289 CHECK((inputHandle->GetShape() == inputShape));
290 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000291}
292
Sadik Armagan1625efc2021-06-10 18:24:34 +0100293TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000294{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100295 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100296}
297
Sadik Armagan1625efc2021-06-10 18:24:34 +0100298TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100299{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100300 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000301}
302
Sadik Armagan1625efc2021-06-10 18:24:34 +0100303TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NchwWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100304{
305 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
306}
307
Sadik Armagan1625efc2021-06-10 18:24:34 +0100308TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFloat16NhwcWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100309{
310 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
311}
312
Sadik Armagan1625efc2021-06-10 18:24:34 +0100313TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dFastMathEnabledWorkload")
Sadik Armagan04a72972020-09-14 15:44:18 +0100314{
315 Graph graph;
316
317 using ModelOptions = std::vector<BackendOptions>;
318 ModelOptions modelOptions = {};
319 BackendOptions gpuAcc("GpuAcc",
320 {
321 { "FastMathEnabled", true }
322 });
323 modelOptions.push_back(gpuAcc);
324
325 ClWorkloadFactory factory =
326 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
327
328 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100329 CreateConvolution2dWorkloadFastMathTest<ClConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100330 graph,
331 DataLayout::NCHW,
332 modelOptions);
333
334 ARMNN_ASSERT(workload != nullptr);
335 auto conv2dWorkload = PolymorphicDowncast<ClConvolution2dWorkload*>(workload.get());
336 IgnoreUnused(conv2dWorkload);
337 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100338 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100339}
340
Narumol Prangnawarate2af6f42022-01-28 17:59:18 +0000341TEST_CASE_FIXTURE(ClContextControlFixture, "ClReplaceInputOutputConvolution2dWorkload")
342{
343 // Create Convolution2dWorkload with ClTensorHandle input and output
344 // Then replace the input and output with ClImportTensorHandle
345 Graph graph;
346 ClWorkloadFactory factory =
347 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
348
349 auto workload =
350 CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType::Float32>(factory,
351 graph,
352 DataLayout::NHWC);
353
354 TensorShape inputShape = std::initializer_list<unsigned int>({2, 8, 16, 3});
355 TensorShape outputShape = std::initializer_list<unsigned int>({2, 2, 10, 2});
356
357 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
358 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
359 auto inputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Inputs[0]);
360 auto outputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Outputs[0]);
361 CHECK((inputHandle->GetShape() == inputShape));
362 CHECK((outputHandle->GetShape() == outputShape));
363 // The input and output handles are created correctly as ClTensorHandle
364 CHECK((dynamic_cast<ClTensorHandle*>(inputHandle) != nullptr));
365 CHECK((dynamic_cast<ClTensorHandle*>(outputHandle) != nullptr));
366
367 // Replace with ImportTensorHandle
368 ClImportTensorHandleFactory importFactory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
369 static_cast<MemorySourceFlags>(MemorySource::Malloc));
370
371 TensorInfo inputInfo({ 2, 8, 16, 3 }, DataType::Float32);
372 TensorInfo outputInfo({ 2, 2, 10, 2 }, DataType::Float32);
373
374 // create TensorHandle for memory import
375 auto inputImportHandle = importFactory.CreateTensorHandle(inputInfo);
376 auto outputImportHandle = importFactory.CreateTensorHandle(outputInfo);
377
378 // Calling ReplaceInputTensorHandle and ReplaceOutputTensorHandle does not throw exception
379 // as Reconfigure function is implemented
380 workload->ReplaceInputTensorHandle(inputImportHandle.get(), 0);
381 workload->ReplaceOutputTensorHandle(outputImportHandle.get(), 0);
382
383 // Correctly replaced with the import handles with correct information
384 queueDescriptor = workload->GetData();
385 auto replacedInputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Inputs[0]);
386 auto replacedOutputHandle = PolymorphicDowncast<ITensorHandle*>(queueDescriptor.m_Outputs[0]);
387 CHECK((replacedInputHandle->GetShape() == inputShape));
388 CHECK((replacedOutputHandle->GetShape() == outputShape));
389
390 CHECK((inputImportHandle.get() == replacedInputHandle));
391 CHECK((inputImportHandle.get() == replacedInputHandle));
392
393 CHECK((dynamic_cast<ClTensorHandle*>(replacedInputHandle) == nullptr));
394 CHECK((dynamic_cast<ClImportTensorHandle*>(replacedInputHandle) != nullptr));
395 CHECK((dynamic_cast<ClTensorHandle*>(replacedOutputHandle) == nullptr));
396 CHECK((dynamic_cast<ClImportTensorHandle*>(replacedOutputHandle) != nullptr));
397}
398
Sadik Armagan1625efc2021-06-10 18:24:34 +0100399TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConvolution2dClCompiledContextWorkload")
Sadik Armagane9444752020-12-02 11:28:58 +0000400{
401 using namespace armnn;
402
403 const DataType inputType = DataType::QAsymmU8;
404 const DataType kernelType = DataType::QSymmS8;
405 const DataType biasType = DataType::Signed32;
406
407 TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128);
408 TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128);
409
410 const std::vector<float> quantScales{ 0.5f, 0.75f, 1.0f };
411 constexpr unsigned int quantDimension = 0;
412
Teresa Charlinee1497c2023-03-30 13:56:34 +0100413 TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension, true);
Sadik Armagane9444752020-12-02 11:28:58 +0000414
415 const std::vector<float> biasQuantScales{ 0.25f, 0.375f, 0.5f };
Teresa Charlinee1497c2023-03-30 13:56:34 +0100416 TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension, true);
Sadik Armagane9444752020-12-02 11:28:58 +0000417
418 std::vector<uint8_t> inputData =
419 {
420 138, 108, 138, 108, 138, 108
421 };
422
423 std::vector<int8_t> kernelData =
424 {
425 1, 2, 1, 2, 1, 2
426 };
427
428 std::vector<int32_t> biasData =
429 {
430 4, 4, 4
431 };
432
433 std::vector<uint8_t> expectedOutputData =
434 {
435 121, 118, 115, 121, 118, 115, 121, 118, 115
436 };
437
438
439 Convolution2dDescriptor descriptor;
440 descriptor.m_StrideX = 1;
441 descriptor.m_StrideY = 1;
442 descriptor.m_PadLeft = 0;
443 descriptor.m_PadRight = 0;
444 descriptor.m_PadTop = 0;
445 descriptor.m_PadBottom = 0;
446 descriptor.m_BiasEnabled = true;
447 descriptor.m_DataLayout = DataLayout::NHWC;
448
449 auto memoryManager = ClWorkloadFactoryHelper::GetMemoryManager();
450 auto clMemoryManager = armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager);
451 auto tensorHandleFactory = ClWorkloadFactoryHelper::GetTensorHandleFactory(memoryManager);
452
453 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100454 std::unique_ptr<armnn::ITensorHandle> weightsHandle = tensorHandleFactory.CreateTensorHandle(kernelInfo);
455 std::unique_ptr<armnn::ITensorHandle> biasHandle = tensorHandleFactory.CreateTensorHandle(biasInfo);
Sadik Armagane9444752020-12-02 11:28:58 +0000456 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
457
458
459 WorkloadInfo workloadInfo;
Sadik Armagane9444752020-12-02 11:28:58 +0000460
461 Convolution2dQueueDescriptor queueDescriptor;
462 queueDescriptor.m_Parameters = descriptor;
Sadik Armagane9444752020-12-02 11:28:58 +0000463
464 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
Keith Davisb4dd5cc2022-04-07 11:32:00 +0100465 AddInputToWorkload(queueDescriptor, workloadInfo, kernelInfo, weightsHandle.get());
466 AddInputToWorkload(queueDescriptor, workloadInfo, biasInfo, biasHandle.get());
Sadik Armagane9444752020-12-02 11:28:58 +0000467 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
468
469 // Initialize our m_CLCompileContext using default device and context
470 auto context = arm_compute::CLKernelLibrary::get().context();
471 auto device = arm_compute::CLKernelLibrary::get().get_device();
472 auto clCompileContext = arm_compute::CLCompileContext(context, device);
473
474
475
476 // Check built programs are empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100477 CHECK(clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000478
479 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
480 workloadInfo,
481 clMemoryManager->GetIntraLayerManager(),
482 clCompileContext);
483 ARMNN_ASSERT(workload != nullptr);
484 // Check built programs are not empty in context
Sadik Armagan1625efc2021-06-10 18:24:34 +0100485 CHECK(!clCompileContext.get_built_programs().empty());
Sadik Armagane9444752020-12-02 11:28:58 +0000486}
487
Nikhil Rajcec6b652018-10-12 13:51:57 +0100488template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
489static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
490{
491 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000492 ClWorkloadFactory factory =
493 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100494
495 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
496 (factory, graph, dataLayout);
497
498 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
499 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100500 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
501 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100502
Mike Kellydb482882019-06-14 12:35:24 +0100503 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
504 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
505 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
506 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100507
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508 CHECK((inputHandle->GetShape() == inputShape));
509 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100510}
511
Sadik Armagan1625efc2021-06-10 18:24:34 +0100512TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDepthwiseConvolutionFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100513{
514 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
515}
516
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100517template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100518static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000519{
telsoa01c577f2c2018-08-31 09:22:23 +0100520 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000521 ClWorkloadFactory factory =
522 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
523
Matthew Benthamd8067922018-10-03 17:18:04 +0100524 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000525
telsoa01c577f2c2018-08-31 09:22:23 +0100526 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000527 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100528 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
529 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100530 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100531 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100532 predResult = CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100533 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000534}
535
Sadik Armagan1625efc2021-06-10 18:24:34 +0100536TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000537{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100538 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100539}
540
Sadik Armagan1625efc2021-06-10 18:24:34 +0100541TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100542{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100543 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000544}
545
Sadik Armagan1625efc2021-06-10 18:24:34 +0100546TEST_CASE_FIXTURE(ClContextControlFixture, "CreateDirectConvolution2dUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000547{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000548 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000549}
550
telsoa01c577f2c2018-08-31 09:22:23 +0100551template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
552static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000553{
telsoa01c577f2c2018-08-31 09:22:23 +0100554 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000555 ClWorkloadFactory factory =
556 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
557
telsoa01c577f2c2018-08-31 09:22:23 +0100558 auto workload =
559 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000560
telsoa01c577f2c2018-08-31 09:22:23 +0100561 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000562 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100563 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
564 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100565 auto predResult = CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100566 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100567 predResult = CompareIClTensorHandleShape(outputHandle, {3, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100568 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000569}
570
telsoa01c577f2c2018-08-31 09:22:23 +0100571
Sadik Armagan1625efc2021-06-10 18:24:34 +0100572TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloatWorkloadTest")
telsoa014fcda012018-03-09 14:13:49 +0000573{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100574 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100575}
576
Sadik Armagan1625efc2021-06-10 18:24:34 +0100577TEST_CASE_FIXTURE(ClContextControlFixture, "CreateFullyConnectedFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100578{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100579 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100580}
581
telsoa01c577f2c2018-08-31 09:22:23 +0100582template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100583static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100584{
585 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000586 ClWorkloadFactory factory =
587 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
588
Matteo Martincigha160b242018-10-18 10:33:23 +0100589 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000590
telsoa01c577f2c2018-08-31 09:22:23 +0100591 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000592 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100593 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
594 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000595
Mike Kellydb482882019-06-14 12:35:24 +0100596 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
597 : std::initializer_list<unsigned int>({3, 1, 5, 5});
598 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
599 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100600
Sadik Armagan1625efc2021-06-10 18:24:34 +0100601 CHECK((inputHandle->GetShape() == inputShape));
602 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000603}
604
Sadik Armagan1625efc2021-06-10 18:24:34 +0100605TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NchwWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000606{
narpra0155a97bc2018-10-02 14:35:53 +0100607 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100608}
609
Sadik Armagan1625efc2021-06-10 18:24:34 +0100610TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100611{
narpra0155a97bc2018-10-02 14:35:53 +0100612 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
613}
614
Sadik Armagan1625efc2021-06-10 18:24:34 +0100615TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat32NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100616{
617 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
618}
619
Sadik Armagan1625efc2021-06-10 18:24:34 +0100620TEST_CASE_FIXTURE(ClContextControlFixture, "CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100621{
622 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100623}
624
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100625template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100626static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100627{
628 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000629 ClWorkloadFactory factory =
630 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000631
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100632 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100633
Mike Kellydb482882019-06-14 12:35:24 +0100634 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
635 : std::initializer_list<unsigned int>({3, 5, 5, 2});
636 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
637 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000638
telsoa01c577f2c2018-08-31 09:22:23 +0100639 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000640 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100641 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
642 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000643
Sadik Armagan1625efc2021-06-10 18:24:34 +0100644 CHECK((inputHandle->GetShape() == inputShape));
645 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000646}
647
Sadik Armagan1625efc2021-06-10 18:24:34 +0100648TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100649{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100650 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100651}
652
Sadik Armagan1625efc2021-06-10 18:24:34 +0100653TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100654{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100655 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100656}
657
Sadik Armagan1625efc2021-06-10 18:24:34 +0100658TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100659{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100660 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100661}
662
Sadik Armagan1625efc2021-06-10 18:24:34 +0100663TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePooling2dFloat16NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100664{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100665 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100666}
667
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100668static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
669 const armnn::TensorShape& alphaShape,
670 const armnn::TensorShape& outputShape,
671 armnn::DataType dataType)
672{
673 Graph graph;
674 ClWorkloadFactory factory =
675 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
676
677 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
678 graph,
679 inputShape,
680 alphaShape,
681 outputShape,
682 dataType);
683
684 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
685 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100686 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
687 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
688 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100689
Sadik Armagan1625efc2021-06-10 18:24:34 +0100690 CHECK((inputHandle->GetShape() == inputShape));
691 CHECK((alphaHandle->GetShape() == alphaShape));
692 CHECK((outputHandle->GetShape() == outputShape));
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100693}
694
Sadik Armagan1625efc2021-06-10 18:24:34 +0100695TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloat16Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100696{
697 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
698}
699
Sadik Armagan1625efc2021-06-10 18:24:34 +0100700TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluFloatWorkload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100701{
702 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
703}
704
Sadik Armagan1625efc2021-06-10 18:24:34 +0100705TEST_CASE_FIXTURE(ClContextControlFixture, "CreatePreluUint8Workload")
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100706{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000707 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100708}
709
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100710template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000711static void ClCreateReshapeWorkloadTest()
712{
telsoa01c577f2c2018-08-31 09:22:23 +0100713 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000714 ClWorkloadFactory factory =
715 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000716
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100717 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000718
telsoa01c577f2c2018-08-31 09:22:23 +0100719 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000720 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100721 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
722 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000723
Colm Donelan25ab3a82021-05-17 13:01:52 +0100724 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100725 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100726 predResult = CompareIClTensorHandleShape(outputHandle, {1, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100727 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000728}
729
Sadik Armagan1625efc2021-06-10 18:24:34 +0100730TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000731{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100732 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100733}
734
Sadik Armagan1625efc2021-06-10 18:24:34 +0100735TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100736{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100737 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000738}
739
Sadik Armagan1625efc2021-06-10 18:24:34 +0100740TEST_CASE_FIXTURE(ClContextControlFixture, "CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000741{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000742 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000743}
744
telsoa01c577f2c2018-08-31 09:22:23 +0100745template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
746static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000747{
telsoa01c577f2c2018-08-31 09:22:23 +0100748 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000749 ClWorkloadFactory factory =
750 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000751
telsoa01c577f2c2018-08-31 09:22:23 +0100752 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000753
arovir019e53a352018-08-31 15:26:35 +0100754 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000755 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100756 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
757 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000758
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100759 armnn::TensorInfo tensorInfo({4, 1}, DataType);
760 if (DataType == armnn::DataType::QAsymmU8)
761 {
762 tensorInfo.SetQuantizationOffset(0);
763 tensorInfo.SetQuantizationScale(1.f / 256);
764 }
765 else if (DataType == armnn::DataType::QAsymmS8)
766 {
767 tensorInfo.SetQuantizationOffset(-128);
768 tensorInfo.SetQuantizationScale(1.f / 256);
769 }
770
Colm Donelan25ab3a82021-05-17 13:01:52 +0100771 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100772 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100773 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100774 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000775}
776
telsoa01c577f2c2018-08-31 09:22:23 +0100777
Sadik Armagan1625efc2021-06-10 18:24:34 +0100778TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat32WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100779{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100780 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100781}
782
Sadik Armagan1625efc2021-06-10 18:24:34 +0100783TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxFloat16WorkloadTest")
telsoa01c577f2c2018-08-31 09:22:23 +0100784{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100785 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
786}
787
Sadik Armagan1625efc2021-06-10 18:24:34 +0100788TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmU8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100789{
790 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
791}
792
Sadik Armagan1625efc2021-06-10 18:24:34 +0100793TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSoftmaxQAsymmS8Workload")
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100794{
795 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100796}
797
Matthew Bentham29cadb32018-10-01 17:22:32 +0100798template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100799static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000800{
801 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000802 ClWorkloadFactory factory =
803 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000804
Matthew Bentham29cadb32018-10-01 17:22:32 +0100805 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000806
telsoa01c577f2c2018-08-31 09:22:23 +0100807 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000808 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100809 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100810 auto predResult = CompareIClTensorHandleShape(inputHandle, {5, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100811 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100812
Jan Eilersbb446e52020-04-02 13:56:54 +0100813 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100814 predResult = CompareIClTensorHandleShape(outputHandle1, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100815 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100816
Jan Eilersbb446e52020-04-02 13:56:54 +0100817 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100818 predResult = CompareIClTensorHandleShape(outputHandle2, {2, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100819 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
surmeh013537c2c2018-05-18 16:31:43 +0100820
Jan Eilersbb446e52020-04-02 13:56:54 +0100821 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +0100822 predResult = CompareIClTensorHandleShape(outputHandle0, {1, 7, 7});
Sadik Armagan1625efc2021-06-10 18:24:34 +0100823 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa014fcda012018-03-09 14:13:49 +0000824}
825
Sadik Armagan1625efc2021-06-10 18:24:34 +0100826TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000827{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100828 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100829}
830
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100832{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100833 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100834}
835
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100836template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100837static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100838{
839 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100840 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000841 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100842 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
843 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000844
845 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000846 ClWorkloadFactory factory =
847 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000848
849 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100850 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100851 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000852
853 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100854 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000855
telsoa01c577f2c2018-08-31 09:22:23 +0100856 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000857 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
858 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100859 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
860 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000861
Sadik Armagan1625efc2021-06-10 18:24:34 +0100862 CHECK(sOut0);
863 CHECK(sOut1);
864 CHECK(mIn0);
865 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000866
telsoa01c577f2c2018-08-31 09:22:23 +0100867 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000868 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100869 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000870
871
telsoa01c577f2c2018-08-31 09:22:23 +0100872 //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 +0000873 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
874 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
875
Sadik Armagan1625efc2021-06-10 18:24:34 +0100876 CHECK(validSubTensorParents);
telsoa014fcda012018-03-09 14:13:49 +0000877}
878
Sadik Armagan1625efc2021-06-10 18:24:34 +0100879TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100880{
Jim Flynne242f2d2019-05-22 14:24:13 +0100881 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100882}
883
Sadik Armagan1625efc2021-06-10 18:24:34 +0100884TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSplitterConcatFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100885{
Jim Flynne242f2d2019-05-22 14:24:13 +0100886 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100887}
888
889
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000891{
892 // 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 +0100893 // 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 +0000894
895 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000896 ClWorkloadFactory factory =
897 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
898
Matthew Bentham29cadb32018-10-01 17:22:32 +0100899 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100900 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
901 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
902 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
903 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000904
Matthew Bentham29cadb32018-10-01 17:22:32 +0100905 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100906 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100907 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000908
telsoa01c577f2c2018-08-31 09:22:23 +0100909 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000910 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
911 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
912 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
913 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
914 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
915 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
916
917
Sadik Armagan1625efc2021-06-10 18:24:34 +0100918 CHECK(sOut0);
919 CHECK(sOut1);
920 CHECK(activ0_0Im);
921 CHECK(activ0_1Im);
922 CHECK(activ1_0Im);
923 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000924
925 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
926 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
927
Sadik Armagan1625efc2021-06-10 18:24:34 +0100928 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000929}
930
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100931#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100932
933// This test unit needs the reference backend, it's not available if the reference backend is not built
934
Sadik Armagan1625efc2021-06-10 18:24:34 +0100935TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMemCopyWorkloadsCl")
telsoa014fcda012018-03-09 14:13:49 +0000936{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000937 ClWorkloadFactory factory =
938 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
939
telsoa01c577f2c2018-08-31 09:22:23 +0100940 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000941}
942
Matteo Martincighe67edb22019-08-14 14:05:46 +0100943#endif
944
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100945template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
946static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000947{
telsoa01c577f2c2018-08-31 09:22:23 +0100948 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000949 ClWorkloadFactory factory =
950 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
951
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100952 auto workload =
953 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000954
telsoa01c577f2c2018-08-31 09:22:23 +0100955 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000956 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100957 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
958 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000959
Mike Kellydb482882019-06-14 12:35:24 +0100960 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
961 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
962 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
963 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100964
Sadik Armagan1625efc2021-06-10 18:24:34 +0100965 CHECK((inputHandle->GetShape() == inputShape));
966 CHECK((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000967}
968
Sadik Armagan1625efc2021-06-10 18:24:34 +0100969TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100970{
971 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
972}
973
Sadik Armagan1625efc2021-06-10 18:24:34 +0100974TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloatNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100975{
976 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
977}
978
Sadik Armagan1625efc2021-06-10 18:24:34 +0100979TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100980{
981 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
982}
983
Sadik Armagan1625efc2021-06-10 18:24:34 +0100984TEST_CASE_FIXTURE(ClContextControlFixture, "CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100985{
986 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
987}
988
Teresa Charlin8398edc2020-07-20 14:23:02 +0100989template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
990static void ClCreateLogSoftmaxWorkloadTest()
991{
992 Graph graph;
993 ClWorkloadFactory factory =
994 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
995
996 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
997
998 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
999 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
1000 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1001 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
1002
Colm Donelan25ab3a82021-05-17 13:01:52 +01001003 auto predResult = CompareIClTensorHandleShape(inputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001004 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001005 predResult = CompareIClTensorHandleShape(outputHandle, {4, 1});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001006 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Teresa Charlin8398edc2020-07-20 14:23:02 +01001007}
1008
Sadik Armagan1625efc2021-06-10 18:24:34 +01001009TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLogSoftmaxFloat32WorkloadTest")
Teresa Charlin8398edc2020-07-20 14:23:02 +01001010{
1011 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
1012}
1013
telsoa01c577f2c2018-08-31 09:22:23 +01001014template <typename LstmWorkloadType>
1015static void ClCreateLstmWorkloadTest()
1016{
1017 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001018 ClWorkloadFactory factory =
1019 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1020
telsoa01c577f2c2018-08-31 09:22:23 +01001021 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
1022
1023 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001024 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1025 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001026 auto predResult = CompareIClTensorHandleShape(inputHandle, {2, 2});
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, {2, 4});
Sadik Armagan1625efc2021-06-10 18:24:34 +01001029 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
telsoa01c577f2c2018-08-31 09:22:23 +01001030}
1031
Sadik Armagan1625efc2021-06-10 18:24:34 +01001032TEST_CASE_FIXTURE(ClContextControlFixture, "CreateLSTMWorkloadFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +01001033{
arovir019e53a352018-08-31 15:26:35 +01001034 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +01001035}
1036
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001037template <typename ResizeWorkloadType, typename armnn::DataType DataType>
1038static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +01001039{
1040 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001041 ClWorkloadFactory factory =
1042 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +01001043
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001044 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +01001045
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +01001046 auto queueDescriptor = workload->GetData();
1047
Jan Eilersbb446e52020-04-02 13:56:54 +01001048 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1049 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +01001050
Colm Donelan25ab3a82021-05-17 13:01:52 +01001051 armnn::PredicateResult predResult(true);
James Conroy074f3712018-10-03 09:32:03 +01001052 switch (dataLayout)
1053 {
1054 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +01001055 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001056 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001057 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001058 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001059 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +01001060 default: // DataLayout::NCHW
1061 predResult = CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001062 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001063 predResult = CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001064 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy074f3712018-10-03 09:32:03 +01001065 }
1066}
1067
Sadik Armagan1625efc2021-06-10 18:24:34 +01001068TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001069{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001070 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001071}
1072
Sadik Armagan1625efc2021-06-10 18:24:34 +01001073TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001074{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001075 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001076}
1077
Sadik Armagan1625efc2021-06-10 18:24:34 +01001078TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NchwWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001079{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001080 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001081}
1082
Sadik Armagan1625efc2021-06-10 18:24:34 +01001083TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat32NhwcWorkload")
James Conroy074f3712018-10-03 09:32:03 +01001084{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001085 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1086}
1087
Sadik Armagan1625efc2021-06-10 18:24:34 +01001088TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeFloat16NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001089{
1090 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1091}
1092
Sadik Armagan1625efc2021-06-10 18:24:34 +01001093TEST_CASE_FIXTURE(ClContextControlFixture, "CreateResizeUint8NhwcWorkload")
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001094{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001095 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001096}
telsoa01c577f2c2018-08-31 09:22:23 +01001097
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001098template <typename MeanWorkloadType, typename armnn::DataType DataType>
1099static void ClMeanWorkloadTest()
1100{
1101 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001102 ClWorkloadFactory factory =
1103 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1104
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001105 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1106
1107 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1108 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001109 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1110 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001111
1112 // 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 +01001113 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001114 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001115 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001116 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001117}
1118
Sadik Armagan1625efc2021-06-10 18:24:34 +01001119TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat32Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001120{
1121 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1122}
1123
Sadik Armagan1625efc2021-06-10 18:24:34 +01001124TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanFloat16Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001125{
1126 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1127}
1128
Sadik Armagan1625efc2021-06-10 18:24:34 +01001129TEST_CASE_FIXTURE(ClContextControlFixture, "CreateMeanUint8Workload")
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001130{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001131 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001132}
1133
Jim Flynne242f2d2019-05-22 14:24:13 +01001134template <typename ConcatWorkloadType, armnn::DataType DataType>
1135static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001136 unsigned int concatAxis)
1137{
1138 Graph graph;
1139 ClWorkloadFactory factory =
1140 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1141
Jim Flynne242f2d2019-05-22 14:24:13 +01001142 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001143
Jim Flynne242f2d2019-05-22 14:24:13 +01001144 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001145 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1146 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1147 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001148
Colm Donelan25ab3a82021-05-17 13:01:52 +01001149 auto predResult = CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001150 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001151 predResult = CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001152 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001153 predResult = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001154 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
narpra015cdda352018-11-19 15:30:27 +00001155}
1156
Sadik Armagan1625efc2021-06-10 18:24:34 +01001157TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001158{
Jim Flynne242f2d2019-05-22 14:24:13 +01001159 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001160}
1161
Sadik Armagan1625efc2021-06-10 18:24:34 +01001162TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001163{
Jim Flynne242f2d2019-05-22 14:24:13 +01001164 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001165}
1166
Sadik Armagan1625efc2021-06-10 18:24:34 +01001167TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +00001168{
Jim Flynne242f2d2019-05-22 14:24:13 +01001169 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001170}
1171
Sadik Armagan1625efc2021-06-10 18:24:34 +01001172TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001173{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001174 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001175}
1176
Sadik Armagan1625efc2021-06-10 18:24:34 +01001177TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001178{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001179 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001180}
1181
Sadik Armagan1625efc2021-06-10 18:24:34 +01001182TEST_CASE_FIXTURE(ClContextControlFixture, "CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +00001183{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001184 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001185}
1186
James Conroy60597842019-07-02 10:57:56 +01001187template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1188static void ClSpaceToDepthWorkloadTest()
1189{
1190 Graph graph;
1191 ClWorkloadFactory factory =
1192 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1193
1194 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1195
1196 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001197 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1198 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001199
Colm Donelan25ab3a82021-05-17 13:01:52 +01001200 auto predResult = CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001201 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +01001202 predResult = CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +01001203 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
James Conroy60597842019-07-02 10:57:56 +01001204}
1205
Sadik Armagan1625efc2021-06-10 18:24:34 +01001206TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat32Workload")
James Conroy60597842019-07-02 10:57:56 +01001207{
1208 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1209}
1210
Sadik Armagan1625efc2021-06-10 18:24:34 +01001211TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthFloat16Workload")
James Conroy60597842019-07-02 10:57:56 +01001212{
1213 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1214}
1215
Sadik Armagan1625efc2021-06-10 18:24:34 +01001216TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQAsymm8Workload")
James Conroy60597842019-07-02 10:57:56 +01001217{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001218 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001219}
1220
Sadik Armagan1625efc2021-06-10 18:24:34 +01001221TEST_CASE_FIXTURE(ClContextControlFixture, "CreateSpaceToDepthQSymm16Workload")
James Conroy60597842019-07-02 10:57:56 +01001222{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001223 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001224}
1225
Matthew Jacksond5166102019-07-31 14:06:28 +01001226template <armnn::DataType DataType>
1227static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1228 const std::initializer_list<unsigned int>& outputShape,
1229 unsigned int axis,
1230 unsigned int numInputs)
1231{
1232 armnn::Graph graph;
1233 ClWorkloadFactory factory =
1234 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1235
1236 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1237 graph,
1238 TensorShape(inputShape),
1239 TensorShape(outputShape),
1240 axis,
1241 numInputs);
1242
1243 // Check inputs and output are as expected
1244 StackQueueDescriptor queueDescriptor = workload->GetData();
1245 for (unsigned int i = 0; i < numInputs; ++i)
1246 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001247 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001248 auto predResult1 = CompareIClTensorHandleShape(inputHandle, inputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001249 CHECK_MESSAGE(predResult1.m_Result, predResult1.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001250 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001251 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Colm Donelan25ab3a82021-05-17 13:01:52 +01001252 auto predResult2 = CompareIClTensorHandleShape(outputHandle, outputShape);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001253 CHECK_MESSAGE(predResult2.m_Result, predResult2.m_Message.str());
Matthew Jacksond5166102019-07-31 14:06:28 +01001254}
1255
Sadik Armagan1625efc2021-06-10 18:24:34 +01001256TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat32Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001257{
1258 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1259}
1260
Sadik Armagan1625efc2021-06-10 18:24:34 +01001261TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +01001262{
1263 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1264}
1265
Sadik Armagan1625efc2021-06-10 18:24:34 +01001266TEST_CASE_FIXTURE(ClContextControlFixture, "CreateStackUint8Workload")
Matthew Jacksond5166102019-07-31 14:06:28 +01001267{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001268 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001269}
1270
Ryan OShea2323af42020-05-13 16:36:19 +01001271
1272template <typename QLstmWorkloadType>
1273static void ClCreateQLstmWorkloadTest()
1274{
1275 Graph graph;
1276 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1277
1278 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1279 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1280
1281 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001282 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1283 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001284
1285 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001286 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1287 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ryan OShea2323af42020-05-13 16:36:19 +01001288
1289 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001290 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1291 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
Ryan OShea2323af42020-05-13 16:36:19 +01001292}
1293
Sadik Armagan1625efc2021-06-10 18:24:34 +01001294TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQLstmWorkloadTest")
Ryan OShea2323af42020-05-13 16:36:19 +01001295{
1296 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1297}
1298
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001299template <typename QuantizedLstmWorkloadType>
1300static void ClCreateQuantizedLstmWorkloadTest()
1301{
1302 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001303
1304 Graph graph;
1305 ClWorkloadFactory factory =
1306 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1307
1308 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1309
1310 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1311
Jan Eilersbb446e52020-04-02 13:56:54 +01001312 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001313 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1314 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001315
Jan Eilersbb446e52020-04-02 13:56:54 +01001316 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001317 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1318 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001319
Jan Eilersbb446e52020-04-02 13:56:54 +01001320 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001321 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1322 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001323
Jan Eilersbb446e52020-04-02 13:56:54 +01001324 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001325 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1326 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001327
Jan Eilersbb446e52020-04-02 13:56:54 +01001328 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001329 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1330 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001331}
1332
Sadik Armagan1625efc2021-06-10 18:24:34 +01001333TEST_CASE_FIXTURE(ClContextControlFixture, "CreateQuantizedLstmWorkload")
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001334{
1335 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1336}
1337
Teresa Charlin98b0dcb2022-01-18 22:09:29 +00001338template <armnn::DataType DataType>
1339static void ClCreateActivationWorkloadReplaceFunctionsTest()
1340{
1341 std::shared_ptr<ClMemoryManager> memoryManager = std::make_shared<ClMemoryManager>(
1342 std::make_unique<arm_compute::CLBufferAllocator>());
1343
1344 Graph graph;
1345 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(memoryManager);
1346 // input and output are created as armnn::TensorInfo tensorInfo({1, 1}, DataType)
1347 auto workloadPtr = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
1348
1349 // new input and output tensor handlers are created and then replace in the workload
1350 const ClTensorHandleFactory tensorHandleFactory(memoryManager);
1351 TensorInfo inputInfo({2 , 2}, DataType::Float16);
1352 TensorInfo outputInfo({2 , 2}, DataType::Float16);
1353 unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo, true);
1354 inputHandle->Manage();
1355 inputHandle->Allocate();
1356 unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo, true);
1357 outputHandle->Manage();
1358 outputHandle->Allocate();
1359
1360 unsigned int slot = 0;
1361 CHECK_THROWS_AS(workloadPtr->ReplaceInputTensorHandle(inputHandle.get(), slot), UnimplementedException);
1362 CHECK_THROWS_AS(workloadPtr->ReplaceOutputTensorHandle(outputHandle.get(), slot), UnimplementedException);
1363}
1364
1365TEST_CASE("ClReplaceFunctionsfromFloat32toFloat16ActivationWorkload")
1366{
1367 ClCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::Float32>();
1368}
1369
Sadik Armagan1625efc2021-06-10 18:24:34 +01001370}