blob: 7d73df83bd5b4a6a0a647491cbb3fc94f0b8a945 [file] [log] [blame]
telsoa01c577f2c2018-08-31 09:22:23 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa01c577f2c2018-08-31 09:22:23 +01004//
5
Aron Virginas-Tar56055192018-11-12 18:10:43 +00006#include "NeonWorkloadFactoryHelper.hpp"
7
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +01008
Sadik Armagana097d2a2021-11-24 15:47:28 +00009#include <TensorHelpers.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010010
Colm Donelan0c479742021-12-10 12:43:54 +000011#include <armnn/backends/TensorHandle.hpp>
12#include <armnn/backends/WorkloadFactory.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <neon/NeonTimer.hpp>
15#include <neon/NeonWorkloadFactory.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010016
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000017#include <backendsCommon/test/LayerTests.hpp>
Sadik Armagana097d2a2021-11-24 15:47:28 +000018#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000019#include <armnnTestUtils/WorkloadTestUtils.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010020
Sadik Armagan1625efc2021-06-10 18:24:34 +010021#include <doctest/doctest.h>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010022
telsoa01c577f2c2018-08-31 09:22:23 +010023#include <cstdlib>
24#include <algorithm>
25
26using namespace armnn;
27
Sadik Armagan1625efc2021-06-10 18:24:34 +010028TEST_SUITE("NeonTimerInstrument")
29{
telsoa01c577f2c2018-08-31 09:22:23 +010030
Sadik Armagan1625efc2021-06-10 18:24:34 +010031TEST_CASE("NeonTimerGetName")
telsoa01c577f2c2018-08-31 09:22:23 +010032{
33 NeonTimer neonTimer;
Sadik Armagan1625efc2021-06-10 18:24:34 +010034 CHECK_EQ(std::string(neonTimer.GetName()), "NeonKernelTimer");
telsoa01c577f2c2018-08-31 09:22:23 +010035}
36
Sadik Armagan1625efc2021-06-10 18:24:34 +010037TEST_CASE("NeonTimerMeasure")
telsoa01c577f2c2018-08-31 09:22:23 +010038{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000039 NeonWorkloadFactory workloadFactory =
40 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa01c577f2c2018-08-31 09:22:23 +010041
Conor Kennedyf341d7f2019-05-27 13:20:38 +010042 unsigned int inputWidth = 2000u;
43 unsigned int inputHeight = 2000u;
telsoa01c577f2c2018-08-31 09:22:23 +010044 unsigned int inputChannels = 1u;
45 unsigned int inputBatchSize = 1u;
46
47 float upperBound = 1.0f;
48 float lowerBound = -1.0f;
49
50 size_t inputSize = inputWidth * inputHeight * inputChannels * inputBatchSize;
51 std::vector<float> inputData(inputSize, 0.f);
52 std::generate(inputData.begin(), inputData.end(), [](){
53 return (static_cast<float>(rand()) / static_cast<float>(RAND_MAX / 3)) + 1.f; });
54
55 unsigned int outputWidth = inputWidth;
56 unsigned int outputHeight = inputHeight;
57 unsigned int outputChannels = inputChannels;
58 unsigned int outputBatchSize = inputBatchSize;
59
60 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000061 armnn::DataType::Float32);
telsoa01c577f2c2018-08-31 09:22:23 +010062
63 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000064 armnn::DataType::Float32);
telsoa01c577f2c2018-08-31 09:22:23 +010065
Teresa Charline2a3b3f2020-08-17 23:22:11 +010066 ARMNN_NO_DEPRECATE_WARN_BEGIN
telsoa01c577f2c2018-08-31 09:22:23 +010067 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
68 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charline2a3b3f2020-08-17 23:22:11 +010069 ARMNN_NO_DEPRECATE_WARN_END
telsoa01c577f2c2018-08-31 09:22:23 +010070
71 // Setup bounded ReLu
72 armnn::ActivationQueueDescriptor descriptor;
73 armnn::WorkloadInfo workloadInfo;
74 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
75 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
76
77 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
78 descriptor.m_Parameters.m_A = upperBound;
79 descriptor.m_Parameters.m_B = lowerBound;
80
Teresa Charlin611c7fb2022-01-07 09:47:29 +000081 std::unique_ptr<armnn::IWorkload> workload
82 = workloadFactory.CreateWorkload(LayerType::Activation, descriptor, workloadInfo);
telsoa01c577f2c2018-08-31 09:22:23 +010083
84 inputHandle->Allocate();
85 outputHandle->Allocate();
86
Sadik Armagan483c8112021-06-01 09:24:52 +010087 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
telsoa01c577f2c2018-08-31 09:22:23 +010088
89 NeonTimer neonTimer;
90 // Start the timer.
91 neonTimer.Start();
92 // Execute the workload.
93 workload->Execute();
94 // Stop the timer.
95 neonTimer.Stop();
96
97 std::vector<Measurement> measurements = neonTimer.GetMeasurements();
98
Sadik Armagan1625efc2021-06-10 18:24:34 +010099 CHECK(measurements.size() <= 2);
Matthew Bentham679efda2018-12-10 13:14:37 +0000100 if (measurements.size() > 1)
101 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100102 CHECK_EQ(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel");
103 CHECK(measurements[0].m_Value > 0.0);
Matthew Bentham679efda2018-12-10 13:14:37 +0000104 }
Nikhil Raj13816cd2021-01-12 14:29:18 +0000105 std::ostringstream oss_neon;
106 std::ostringstream oss_cpu;
107 oss_neon << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel";
108 oss_cpu << "NeonKernelTimer/" << measurements.size()-1 << ": CpuActivationKernel";
Nikhil Raj7af2fd72021-06-30 11:51:10 +0100109 bool kernelCheck = ((measurements[measurements.size()-1].m_Name.find(oss_neon.str()) != std::string::npos)
110 || (measurements[measurements.size()-1].m_Name.find(oss_cpu.str()) != std::string::npos));
111 CHECK(kernelCheck);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100112 CHECK(measurements[measurements.size()-1].m_Value > 0.0);
telsoa01c577f2c2018-08-31 09:22:23 +0100113}
114
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115}