• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "NeonWorkloadFactoryHelper.hpp"
7 
8 
9 #include <test/TensorHelpers.hpp>
10 
11 #include <backendsCommon/CpuTensorHandle.hpp>
12 #include <backendsCommon/WorkloadFactory.hpp>
13 
14 #include <neon/NeonTimer.hpp>
15 #include <neon/NeonWorkloadFactory.hpp>
16 
17 #include <backendsCommon/test/LayerTests.hpp>
18 #include <backendsCommon/test/TensorCopyUtils.hpp>
19 #include <backendsCommon/test/WorkloadTestUtils.hpp>
20 
21 #include <boost/test/unit_test.hpp>
22 
23 #include <cstdlib>
24 #include <algorithm>
25 
26 using namespace armnn;
27 
28 BOOST_AUTO_TEST_SUITE(NeonTimerInstrument)
29 
30 
BOOST_AUTO_TEST_CASE(NeonTimerGetName)31 BOOST_AUTO_TEST_CASE(NeonTimerGetName)
32 {
33     NeonTimer neonTimer;
34     BOOST_CHECK_EQUAL(neonTimer.GetName(), "NeonKernelTimer");
35 }
36 
BOOST_AUTO_TEST_CASE(NeonTimerMeasure)37 BOOST_AUTO_TEST_CASE(NeonTimerMeasure)
38 {
39     NeonWorkloadFactory workloadFactory =
40         NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
41 
42     unsigned int inputWidth = 2000u;
43     unsigned int inputHeight = 2000u;
44     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 },
61         armnn::DataType::Float32);
62 
63     armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
64         armnn::DataType::Float32);
65 
66     LayerTestResult<float, 4> result(inputTensorInfo);
67 
68     auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
69 
70     ARMNN_NO_DEPRECATE_WARN_BEGIN
71     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
72     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
73     ARMNN_NO_DEPRECATE_WARN_END
74 
75     // Setup bounded ReLu
76     armnn::ActivationQueueDescriptor descriptor;
77     armnn::WorkloadInfo workloadInfo;
78     AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
79     AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
80 
81     descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
82     descriptor.m_Parameters.m_A = upperBound;
83     descriptor.m_Parameters.m_B = lowerBound;
84 
85     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
86 
87     inputHandle->Allocate();
88     outputHandle->Allocate();
89 
90     CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
91 
92     NeonTimer neonTimer;
93     // Start the timer.
94     neonTimer.Start();
95     // Execute the workload.
96     workload->Execute();
97     // Stop the timer.
98     neonTimer.Stop();
99 
100     std::vector<Measurement> measurements = neonTimer.GetMeasurements();
101 
102     BOOST_CHECK(measurements.size() <= 2);
103     if (measurements.size() > 1)
104     {
105         BOOST_CHECK_EQUAL(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel");
106         BOOST_CHECK(measurements[0].m_Value > 0.0);
107     }
108     std::ostringstream oss;
109     oss << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel";
110     BOOST_CHECK_EQUAL(measurements[measurements.size()-1].m_Name, oss.str());
111     BOOST_CHECK(measurements[measurements.size()-1].m_Value > 0.0);
112 }
113 
114 BOOST_AUTO_TEST_SUITE_END()
115