blob: a2bf4a95e5c2f9d04a380d30849a8d25073950cc [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "NeonWorkloadFactoryHelper.hpp"
#include <armnn/ArmNN.hpp>
#include <test/TensorHelpers.hpp>
#include <backendsCommon/CpuTensorHandle.hpp>
#include <backendsCommon/WorkloadFactory.hpp>
#include <neon/NeonTimer.hpp>
#include <neon/NeonWorkloadFactory.hpp>
#include <backendsCommon/test/LayerTests.hpp>
#include <backendsCommon/test/TensorCopyUtils.hpp>
#include <backendsCommon/test/WorkloadTestUtils.hpp>
#include <boost/test/unit_test.hpp>
#include <cstdlib>
#include <algorithm>
using namespace armnn;
BOOST_AUTO_TEST_SUITE(NeonTimerInstrument)
BOOST_AUTO_TEST_CASE(NeonTimerGetName)
{
NeonTimer neonTimer;
BOOST_CHECK_EQUAL(neonTimer.GetName(), "NeonKernelTimer");
}
BOOST_AUTO_TEST_CASE(NeonTimerMeasure)
{
NeonWorkloadFactory workloadFactory = NeonWorkloadFactoryHelper::GetFactory();
unsigned int inputWidth = 4000u;
unsigned int inputHeight = 5000u;
unsigned int inputChannels = 1u;
unsigned int inputBatchSize = 1u;
float upperBound = 1.0f;
float lowerBound = -1.0f;
size_t inputSize = inputWidth * inputHeight * inputChannels * inputBatchSize;
std::vector<float> inputData(inputSize, 0.f);
std::generate(inputData.begin(), inputData.end(), [](){
return (static_cast<float>(rand()) / static_cast<float>(RAND_MAX / 3)) + 1.f; });
unsigned int outputWidth = inputWidth;
unsigned int outputHeight = inputHeight;
unsigned int outputChannels = inputChannels;
unsigned int outputBatchSize = inputBatchSize;
armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
armnn::GetDataType<float>());
armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
armnn::GetDataType<float>());
LayerTestResult<float, 4> result(inputTensorInfo);
auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
// Setup bounded ReLu
armnn::ActivationQueueDescriptor descriptor;
armnn::WorkloadInfo workloadInfo;
AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
descriptor.m_Parameters.m_A = upperBound;
descriptor.m_Parameters.m_B = lowerBound;
std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
inputHandle->Allocate();
outputHandle->Allocate();
CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
NeonTimer neonTimer;
// Start the timer.
neonTimer.Start();
// Execute the workload.
workload->Execute();
// Stop the timer.
neonTimer.Stop();
std::vector<Measurement> measurements = neonTimer.GetMeasurements();
BOOST_CHECK_EQUAL(measurements.size(), 2);
BOOST_CHECK_EQUAL(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel");
BOOST_CHECK(measurements[0].m_Value > 0.0);
BOOST_CHECK_EQUAL(measurements[1].m_Name, "NeonKernelTimer/1: NEActivationLayerKernel");
BOOST_CHECK(measurements[1].m_Value > 0.0);
}
BOOST_AUTO_TEST_SUITE_END()