IVGCVSW-2467 Remove GetDataType<T> function
[platform/upstream/armnn.git] / src / backends / neon / test / NeonTimerTest.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "NeonWorkloadFactoryHelper.hpp"
7
8 #include <armnn/ArmNN.hpp>
9
10 #include <test/TensorHelpers.hpp>
11
12 #include <backendsCommon/CpuTensorHandle.hpp>
13 #include <backendsCommon/WorkloadFactory.hpp>
14
15 #include <neon/NeonTimer.hpp>
16 #include <neon/NeonWorkloadFactory.hpp>
17
18 #include <backendsCommon/test/LayerTests.hpp>
19 #include <backendsCommon/test/TensorCopyUtils.hpp>
20 #include <backendsCommon/test/WorkloadTestUtils.hpp>
21
22 #include <boost/test/unit_test.hpp>
23
24 #include <cstdlib>
25 #include <algorithm>
26
27 using namespace armnn;
28
29 BOOST_AUTO_TEST_SUITE(NeonTimerInstrument)
30
31
32 BOOST_AUTO_TEST_CASE(NeonTimerGetName)
33 {
34     NeonTimer neonTimer;
35     BOOST_CHECK_EQUAL(neonTimer.GetName(), "NeonKernelTimer");
36 }
37
38 BOOST_AUTO_TEST_CASE(NeonTimerMeasure)
39 {
40     NeonWorkloadFactory workloadFactory =
41         NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
42
43     unsigned int inputWidth = 4000u;
44     unsigned int inputHeight = 5000u;
45     unsigned int inputChannels = 1u;
46     unsigned int inputBatchSize = 1u;
47
48     float upperBound = 1.0f;
49     float lowerBound = -1.0f;
50
51     size_t inputSize = inputWidth * inputHeight * inputChannels * inputBatchSize;
52     std::vector<float> inputData(inputSize, 0.f);
53     std::generate(inputData.begin(), inputData.end(), [](){
54         return (static_cast<float>(rand()) / static_cast<float>(RAND_MAX / 3)) + 1.f; });
55
56     unsigned int outputWidth = inputWidth;
57     unsigned int outputHeight = inputHeight;
58     unsigned int outputChannels = inputChannels;
59     unsigned int outputBatchSize = inputBatchSize;
60
61     armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
62         armnn::DataType::Float32);
63
64     armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
65         armnn::DataType::Float32);
66
67     LayerTestResult<float, 4> result(inputTensorInfo);
68
69     auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
70
71     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
72     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
73
74     // Setup bounded ReLu
75     armnn::ActivationQueueDescriptor descriptor;
76     armnn::WorkloadInfo workloadInfo;
77     AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
78     AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
79
80     descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
81     descriptor.m_Parameters.m_A = upperBound;
82     descriptor.m_Parameters.m_B = lowerBound;
83
84     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
85
86     inputHandle->Allocate();
87     outputHandle->Allocate();
88
89     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
90
91     NeonTimer neonTimer;
92     // Start the timer.
93     neonTimer.Start();
94     // Execute the workload.
95     workload->Execute();
96     // Stop the timer.
97     neonTimer.Stop();
98
99     std::vector<Measurement> measurements = neonTimer.GetMeasurements();
100
101     BOOST_CHECK(measurements.size() <= 2);
102     if (measurements.size() > 1)
103     {
104         BOOST_CHECK_EQUAL(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel");
105         BOOST_CHECK(measurements[0].m_Value > 0.0);
106     }
107     std::ostringstream oss;
108     oss << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel";
109     BOOST_CHECK_EQUAL(measurements[measurements.size()-1].m_Name, oss.str());
110     BOOST_CHECK(measurements[measurements.size()-1].m_Value > 0.0);
111 }
112
113 BOOST_AUTO_TEST_SUITE_END()