// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include #include "TensorHelpers.hpp" #include #include #include #include #include #include #include #include #include #include #include #include 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; 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 inputData(inputSize, 0.f); std::generate(inputData.begin(), inputData.end(), [](){ return (static_cast(rand()) / static_cast(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()); armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, armnn::GetDataType()); LayerTestResult result(inputTensorInfo); auto input = MakeTensor(inputTensorInfo, inputData); std::unique_ptr inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); std::unique_ptr 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 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 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()