blob: 61f162a3126360bd26ec9e08ad29224d032ff308 [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
David Beck0dbe0ee2018-09-24 15:59:27 +01008#include <armnn/ArmNN.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +01009
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <test/TensorHelpers.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010011
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/CpuTensorHandle.hpp>
13#include <backendsCommon/WorkloadFactory.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010014
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <neon/NeonTimer.hpp>
16#include <neon/NeonWorkloadFactory.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010017
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000018#include <backendsCommon/test/LayerTests.hpp>
19#include <backendsCommon/test/TensorCopyUtils.hpp>
20#include <backendsCommon/test/WorkloadTestUtils.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010021
22#include <boost/test/unit_test.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010023
telsoa01c577f2c2018-08-31 09:22:23 +010024#include <cstdlib>
25#include <algorithm>
26
27using namespace armnn;
28
29BOOST_AUTO_TEST_SUITE(NeonTimerInstrument)
30
31
32BOOST_AUTO_TEST_CASE(NeonTimerGetName)
33{
34 NeonTimer neonTimer;
35 BOOST_CHECK_EQUAL(neonTimer.GetName(), "NeonKernelTimer");
36}
37
38BOOST_AUTO_TEST_CASE(NeonTimerMeasure)
39{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000040 NeonWorkloadFactory workloadFactory =
41 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa01c577f2c2018-08-31 09:22:23 +010042
Conor Kennedyf341d7f2019-05-27 13:20:38 +010043 unsigned int inputWidth = 2000u;
44 unsigned int inputHeight = 2000u;
telsoa01c577f2c2018-08-31 09:22:23 +010045 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 },
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000062 armnn::DataType::Float32);
telsoa01c577f2c2018-08-31 09:22:23 +010063
64 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000065 armnn::DataType::Float32);
telsoa01c577f2c2018-08-31 09:22:23 +010066
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
Matthew Bentham679efda2018-12-10 13:14:37 +0000101 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 }
Matthew Benthamf8d63012018-12-10 17:05:25 +0000107 std::ostringstream oss;
108 oss << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel";
109 BOOST_CHECK_EQUAL(measurements[measurements.size()-1].m_Name, oss.str());
Matthew Bentham679efda2018-12-10 13:14:37 +0000110 BOOST_CHECK(measurements[measurements.size()-1].m_Value > 0.0);
telsoa01c577f2c2018-08-31 09:22:23 +0100111}
112
113BOOST_AUTO_TEST_SUITE_END()