xref: /aosp_15_r20/external/armnn/src/backends/neon/test/NeonTimerTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "NeonWorkloadFactoryHelper.hpp"
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/TensorHelpers.hpp>
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/TensorHandle.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/WorkloadFactory.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonTimer.hpp>
15*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonWorkloadFactory.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <backendsCommon/test/LayerTests.hpp>
18*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/TensorCopyUtils.hpp>
19*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/WorkloadTestUtils.hpp>
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
22*89c4ff92SAndroid Build Coastguard Worker 
23*89c4ff92SAndroid Build Coastguard Worker #include <cstdlib>
24*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker using namespace armnn;
27*89c4ff92SAndroid Build Coastguard Worker 
28*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("NeonTimerInstrument")
29*89c4ff92SAndroid Build Coastguard Worker {
30*89c4ff92SAndroid Build Coastguard Worker 
31*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("NeonTimerGetName")
32*89c4ff92SAndroid Build Coastguard Worker {
33*89c4ff92SAndroid Build Coastguard Worker     NeonTimer neonTimer;
34*89c4ff92SAndroid Build Coastguard Worker     CHECK_EQ(std::string(neonTimer.GetName()), "NeonKernelTimer");
35*89c4ff92SAndroid Build Coastguard Worker }
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("NeonTimerMeasure")
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker     NeonWorkloadFactory workloadFactory =
40*89c4ff92SAndroid Build Coastguard Worker         NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
41*89c4ff92SAndroid Build Coastguard Worker 
42*89c4ff92SAndroid Build Coastguard Worker     unsigned int inputWidth = 2000u;
43*89c4ff92SAndroid Build Coastguard Worker     unsigned int inputHeight = 2000u;
44*89c4ff92SAndroid Build Coastguard Worker     unsigned int inputChannels = 1u;
45*89c4ff92SAndroid Build Coastguard Worker     unsigned int inputBatchSize = 1u;
46*89c4ff92SAndroid Build Coastguard Worker 
47*89c4ff92SAndroid Build Coastguard Worker     float upperBound = 1.0f;
48*89c4ff92SAndroid Build Coastguard Worker     float lowerBound = -1.0f;
49*89c4ff92SAndroid Build Coastguard Worker 
50*89c4ff92SAndroid Build Coastguard Worker     size_t inputSize = inputWidth * inputHeight * inputChannels * inputBatchSize;
51*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> inputData(inputSize, 0.f);
__anon0ef174230102()52*89c4ff92SAndroid Build Coastguard Worker     std::generate(inputData.begin(), inputData.end(), [](){
53*89c4ff92SAndroid Build Coastguard Worker         return (static_cast<float>(rand()) / static_cast<float>(RAND_MAX / 3)) + 1.f; });
54*89c4ff92SAndroid Build Coastguard Worker 
55*89c4ff92SAndroid Build Coastguard Worker     unsigned int outputWidth = inputWidth;
56*89c4ff92SAndroid Build Coastguard Worker     unsigned int outputHeight = inputHeight;
57*89c4ff92SAndroid Build Coastguard Worker     unsigned int outputChannels = inputChannels;
58*89c4ff92SAndroid Build Coastguard Worker     unsigned int outputBatchSize = inputBatchSize;
59*89c4ff92SAndroid Build Coastguard Worker 
60*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
61*89c4ff92SAndroid Build Coastguard Worker         armnn::DataType::Float32);
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker     armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
64*89c4ff92SAndroid Build Coastguard Worker         armnn::DataType::Float32);
65*89c4ff92SAndroid Build Coastguard Worker 
66*89c4ff92SAndroid Build Coastguard Worker     ARMNN_NO_DEPRECATE_WARN_BEGIN
67*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
68*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
69*89c4ff92SAndroid Build Coastguard Worker     ARMNN_NO_DEPRECATE_WARN_END
70*89c4ff92SAndroid Build Coastguard Worker 
71*89c4ff92SAndroid Build Coastguard Worker     // Setup bounded ReLu
72*89c4ff92SAndroid Build Coastguard Worker     armnn::ActivationQueueDescriptor descriptor;
73*89c4ff92SAndroid Build Coastguard Worker     armnn::WorkloadInfo workloadInfo;
74*89c4ff92SAndroid Build Coastguard Worker     AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
75*89c4ff92SAndroid Build Coastguard Worker     AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
76*89c4ff92SAndroid Build Coastguard Worker 
77*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
78*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_Parameters.m_A = upperBound;
79*89c4ff92SAndroid Build Coastguard Worker     descriptor.m_Parameters.m_B = lowerBound;
80*89c4ff92SAndroid Build Coastguard Worker 
81*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<armnn::IWorkload> workload
82*89c4ff92SAndroid Build Coastguard Worker             = workloadFactory.CreateWorkload(LayerType::Activation, descriptor, workloadInfo);
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker     inputHandle->Allocate();
85*89c4ff92SAndroid Build Coastguard Worker     outputHandle->Allocate();
86*89c4ff92SAndroid Build Coastguard Worker 
87*89c4ff92SAndroid Build Coastguard Worker     CopyDataToITensorHandle(inputHandle.get(), inputData.data());
88*89c4ff92SAndroid Build Coastguard Worker 
89*89c4ff92SAndroid Build Coastguard Worker     NeonTimer neonTimer;
90*89c4ff92SAndroid Build Coastguard Worker     // Start the timer.
91*89c4ff92SAndroid Build Coastguard Worker     neonTimer.Start();
92*89c4ff92SAndroid Build Coastguard Worker     // Execute the workload.
93*89c4ff92SAndroid Build Coastguard Worker     workload->Execute();
94*89c4ff92SAndroid Build Coastguard Worker     // Stop the timer.
95*89c4ff92SAndroid Build Coastguard Worker     neonTimer.Stop();
96*89c4ff92SAndroid Build Coastguard Worker 
97*89c4ff92SAndroid Build Coastguard Worker     std::vector<Measurement> measurements = neonTimer.GetMeasurements();
98*89c4ff92SAndroid Build Coastguard Worker 
99*89c4ff92SAndroid Build Coastguard Worker     CHECK(measurements.size() <= 2);
100*89c4ff92SAndroid Build Coastguard Worker     if (measurements.size() > 1)
101*89c4ff92SAndroid Build Coastguard Worker     {
102*89c4ff92SAndroid Build Coastguard Worker         CHECK_EQ(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel");
103*89c4ff92SAndroid Build Coastguard Worker         CHECK(measurements[0].m_Value > 0.0);
104*89c4ff92SAndroid Build Coastguard Worker     }
105*89c4ff92SAndroid Build Coastguard Worker     std::ostringstream oss_neon;
106*89c4ff92SAndroid Build Coastguard Worker     std::ostringstream oss_cpu;
107*89c4ff92SAndroid Build Coastguard Worker     oss_neon << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel";
108*89c4ff92SAndroid Build Coastguard Worker     oss_cpu << "NeonKernelTimer/" << measurements.size()-1 << ": CpuActivationKernel";
109*89c4ff92SAndroid Build Coastguard Worker     bool kernelCheck = ((measurements[measurements.size()-1].m_Name.find(oss_neon.str()) != std::string::npos)
110*89c4ff92SAndroid Build Coastguard Worker                         || (measurements[measurements.size()-1].m_Name.find(oss_cpu.str()) != std::string::npos));
111*89c4ff92SAndroid Build Coastguard Worker     CHECK(kernelCheck);
112*89c4ff92SAndroid Build Coastguard Worker     CHECK(measurements[measurements.size()-1].m_Value > 0.0);
113*89c4ff92SAndroid Build Coastguard Worker }
114*89c4ff92SAndroid Build Coastguard Worker 
115*89c4ff92SAndroid Build Coastguard Worker }
116