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 "NeonTimer.hpp" 7*89c4ff92SAndroid Build Coastguard Worker #include "NeonInterceptorScheduler.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/Assert.hpp> 10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/PolymorphicDowncast.hpp> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker #include <memory> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker namespace armnn 15*89c4ff92SAndroid Build Coastguard Worker { 16*89c4ff92SAndroid Build Coastguard Worker namespace 17*89c4ff92SAndroid Build Coastguard Worker { 18*89c4ff92SAndroid Build Coastguard Worker static thread_local auto g_Interceptor = std::make_shared<NeonInterceptorScheduler>(arm_compute::Scheduler::get()); 19*89c4ff92SAndroid Build Coastguard Worker } 20*89c4ff92SAndroid Build Coastguard Worker Start()21*89c4ff92SAndroid Build Coastguard Workervoid NeonTimer::Start() 22*89c4ff92SAndroid Build Coastguard Worker { 23*89c4ff92SAndroid Build Coastguard Worker m_Kernels.clear(); 24*89c4ff92SAndroid Build Coastguard Worker ARMNN_ASSERT(g_Interceptor->GetKernels() == nullptr); 25*89c4ff92SAndroid Build Coastguard Worker g_Interceptor->SetKernels(&m_Kernels); 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker m_RealSchedulerType = arm_compute::Scheduler::get_type(); 28*89c4ff92SAndroid Build Coastguard Worker //Note: We can't currently replace a custom scheduler 29*89c4ff92SAndroid Build Coastguard Worker if(m_RealSchedulerType != arm_compute::Scheduler::Type::CUSTOM) 30*89c4ff92SAndroid Build Coastguard Worker { 31*89c4ff92SAndroid Build Coastguard Worker // Keep the real schedule and add NeonInterceptorScheduler as an interceptor 32*89c4ff92SAndroid Build Coastguard Worker m_RealScheduler = &arm_compute::Scheduler::get(); 33*89c4ff92SAndroid Build Coastguard Worker arm_compute::Scheduler::set(armnn::PolymorphicPointerDowncast<arm_compute::IScheduler>(g_Interceptor)); 34*89c4ff92SAndroid Build Coastguard Worker } 35*89c4ff92SAndroid Build Coastguard Worker } 36*89c4ff92SAndroid Build Coastguard Worker Stop()37*89c4ff92SAndroid Build Coastguard Workervoid NeonTimer::Stop() 38*89c4ff92SAndroid Build Coastguard Worker { 39*89c4ff92SAndroid Build Coastguard Worker // Restore real scheduler 40*89c4ff92SAndroid Build Coastguard Worker g_Interceptor->SetKernels(nullptr); 41*89c4ff92SAndroid Build Coastguard Worker arm_compute::Scheduler::set(m_RealSchedulerType); 42*89c4ff92SAndroid Build Coastguard Worker m_RealScheduler = nullptr; 43*89c4ff92SAndroid Build Coastguard Worker } 44*89c4ff92SAndroid Build Coastguard Worker HasKernelMeasurements() const45*89c4ff92SAndroid Build Coastguard Workerbool NeonTimer::HasKernelMeasurements() const 46*89c4ff92SAndroid Build Coastguard Worker { 47*89c4ff92SAndroid Build Coastguard Worker return m_Kernels.size() > 0; 48*89c4ff92SAndroid Build Coastguard Worker } 49*89c4ff92SAndroid Build Coastguard Worker GetMeasurements() const50*89c4ff92SAndroid Build Coastguard Workerstd::vector<Measurement> NeonTimer::GetMeasurements() const 51*89c4ff92SAndroid Build Coastguard Worker { 52*89c4ff92SAndroid Build Coastguard Worker std::vector<Measurement> measurements = m_Kernels; 53*89c4ff92SAndroid Build Coastguard Worker unsigned int kernel_number = 0; 54*89c4ff92SAndroid Build Coastguard Worker for (auto & kernel : measurements) 55*89c4ff92SAndroid Build Coastguard Worker { 56*89c4ff92SAndroid Build Coastguard Worker std::string kernelName = std::string(this->GetName()) + "/" + std::to_string(kernel_number++) + ": " + kernel 57*89c4ff92SAndroid Build Coastguard Worker .m_Name; 58*89c4ff92SAndroid Build Coastguard Worker kernel.m_Name = kernelName; 59*89c4ff92SAndroid Build Coastguard Worker } 60*89c4ff92SAndroid Build Coastguard Worker return measurements; 61*89c4ff92SAndroid Build Coastguard Worker } 62*89c4ff92SAndroid Build Coastguard Worker GetName() const63*89c4ff92SAndroid Build Coastguard Workerconst char* NeonTimer::GetName() const 64*89c4ff92SAndroid Build Coastguard Worker { 65*89c4ff92SAndroid Build Coastguard Worker return "NeonKernelTimer"; 66*89c4ff92SAndroid Build Coastguard Worker } 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker } 69