1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include "NeonWorkloadFactoryHelper.hpp" 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/TensorHelpers.hpp> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/TensorHandle.hpp> 12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/WorkloadFactory.hpp> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonTimer.hpp> 15*89c4ff92SAndroid Build Coastguard Worker #include <neon/NeonWorkloadFactory.hpp> 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker #include <backendsCommon/test/LayerTests.hpp> 18*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/TensorCopyUtils.hpp> 19*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/WorkloadTestUtils.hpp> 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h> 22*89c4ff92SAndroid Build Coastguard Worker 23*89c4ff92SAndroid Build Coastguard Worker #include <cstdlib> 24*89c4ff92SAndroid Build Coastguard Worker #include <algorithm> 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker using namespace armnn; 27*89c4ff92SAndroid Build Coastguard Worker 28*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("NeonTimerInstrument") 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker 31*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("NeonTimerGetName") 32*89c4ff92SAndroid Build Coastguard Worker { 33*89c4ff92SAndroid Build Coastguard Worker NeonTimer neonTimer; 34*89c4ff92SAndroid Build Coastguard Worker CHECK_EQ(std::string(neonTimer.GetName()), "NeonKernelTimer"); 35*89c4ff92SAndroid Build Coastguard Worker } 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("NeonTimerMeasure") 38*89c4ff92SAndroid Build Coastguard Worker { 39*89c4ff92SAndroid Build Coastguard Worker NeonWorkloadFactory workloadFactory = 40*89c4ff92SAndroid Build Coastguard Worker NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager()); 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker unsigned int inputWidth = 2000u; 43*89c4ff92SAndroid Build Coastguard Worker unsigned int inputHeight = 2000u; 44*89c4ff92SAndroid Build Coastguard Worker unsigned int inputChannels = 1u; 45*89c4ff92SAndroid Build Coastguard Worker unsigned int inputBatchSize = 1u; 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker float upperBound = 1.0f; 48*89c4ff92SAndroid Build Coastguard Worker float lowerBound = -1.0f; 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard Worker size_t inputSize = inputWidth * inputHeight * inputChannels * inputBatchSize; 51*89c4ff92SAndroid Build Coastguard Worker std::vector<float> inputData(inputSize, 0.f); __anon0ef174230102()52*89c4ff92SAndroid Build Coastguard Worker std::generate(inputData.begin(), inputData.end(), [](){ 53*89c4ff92SAndroid Build Coastguard Worker return (static_cast<float>(rand()) / static_cast<float>(RAND_MAX / 3)) + 1.f; }); 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker unsigned int outputWidth = inputWidth; 56*89c4ff92SAndroid Build Coastguard Worker unsigned int outputHeight = inputHeight; 57*89c4ff92SAndroid Build Coastguard Worker unsigned int outputChannels = inputChannels; 58*89c4ff92SAndroid Build Coastguard Worker unsigned int outputBatchSize = inputBatchSize; 59*89c4ff92SAndroid Build Coastguard Worker 60*89c4ff92SAndroid Build Coastguard Worker armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, 61*89c4ff92SAndroid Build Coastguard Worker armnn::DataType::Float32); 62*89c4ff92SAndroid Build Coastguard Worker 63*89c4ff92SAndroid Build Coastguard Worker armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, 64*89c4ff92SAndroid Build Coastguard Worker armnn::DataType::Float32); 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker ARMNN_NO_DEPRECATE_WARN_BEGIN 67*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo); 68*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo); 69*89c4ff92SAndroid Build Coastguard Worker ARMNN_NO_DEPRECATE_WARN_END 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker // Setup bounded ReLu 72*89c4ff92SAndroid Build Coastguard Worker armnn::ActivationQueueDescriptor descriptor; 73*89c4ff92SAndroid Build Coastguard Worker armnn::WorkloadInfo workloadInfo; 74*89c4ff92SAndroid Build Coastguard Worker AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get()); 75*89c4ff92SAndroid Build Coastguard Worker AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get()); 76*89c4ff92SAndroid Build Coastguard Worker 77*89c4ff92SAndroid Build Coastguard Worker descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu; 78*89c4ff92SAndroid Build Coastguard Worker descriptor.m_Parameters.m_A = upperBound; 79*89c4ff92SAndroid Build Coastguard Worker descriptor.m_Parameters.m_B = lowerBound; 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<armnn::IWorkload> workload 82*89c4ff92SAndroid Build Coastguard Worker = workloadFactory.CreateWorkload(LayerType::Activation, descriptor, workloadInfo); 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker inputHandle->Allocate(); 85*89c4ff92SAndroid Build Coastguard Worker outputHandle->Allocate(); 86*89c4ff92SAndroid Build Coastguard Worker 87*89c4ff92SAndroid Build Coastguard Worker CopyDataToITensorHandle(inputHandle.get(), inputData.data()); 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker NeonTimer neonTimer; 90*89c4ff92SAndroid Build Coastguard Worker // Start the timer. 91*89c4ff92SAndroid Build Coastguard Worker neonTimer.Start(); 92*89c4ff92SAndroid Build Coastguard Worker // Execute the workload. 93*89c4ff92SAndroid Build Coastguard Worker workload->Execute(); 94*89c4ff92SAndroid Build Coastguard Worker // Stop the timer. 95*89c4ff92SAndroid Build Coastguard Worker neonTimer.Stop(); 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker std::vector<Measurement> measurements = neonTimer.GetMeasurements(); 98*89c4ff92SAndroid Build Coastguard Worker 99*89c4ff92SAndroid Build Coastguard Worker CHECK(measurements.size() <= 2); 100*89c4ff92SAndroid Build Coastguard Worker if (measurements.size() > 1) 101*89c4ff92SAndroid Build Coastguard Worker { 102*89c4ff92SAndroid Build Coastguard Worker CHECK_EQ(measurements[0].m_Name, "NeonKernelTimer/0: NEFillBorderKernel"); 103*89c4ff92SAndroid Build Coastguard Worker CHECK(measurements[0].m_Value > 0.0); 104*89c4ff92SAndroid Build Coastguard Worker } 105*89c4ff92SAndroid Build Coastguard Worker std::ostringstream oss_neon; 106*89c4ff92SAndroid Build Coastguard Worker std::ostringstream oss_cpu; 107*89c4ff92SAndroid Build Coastguard Worker oss_neon << "NeonKernelTimer/" << measurements.size()-1 << ": NEActivationLayerKernel"; 108*89c4ff92SAndroid Build Coastguard Worker oss_cpu << "NeonKernelTimer/" << measurements.size()-1 << ": CpuActivationKernel"; 109*89c4ff92SAndroid Build Coastguard Worker bool kernelCheck = ((measurements[measurements.size()-1].m_Name.find(oss_neon.str()) != std::string::npos) 110*89c4ff92SAndroid Build Coastguard Worker || (measurements[measurements.size()-1].m_Name.find(oss_cpu.str()) != std::string::npos)); 111*89c4ff92SAndroid Build Coastguard Worker CHECK(kernelCheck); 112*89c4ff92SAndroid Build Coastguard Worker CHECK(measurements[measurements.size()-1].m_Value > 0.0); 113*89c4ff92SAndroid Build Coastguard Worker } 114*89c4ff92SAndroid Build Coastguard Worker 115*89c4ff92SAndroid Build Coastguard Worker } 116