1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2023 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/BackendOptions.hpp> 8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/IRuntime.hpp> 9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Logging.hpp> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLTuner.h> 12*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLTunerTypes.h> 13*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLGEMMHeuristicsHandle.h> 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker namespace armnn 16*89c4ff92SAndroid Build Coastguard Worker { 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker enum class TuningLevel 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker None, 21*89c4ff92SAndroid Build Coastguard Worker Rapid, 22*89c4ff92SAndroid Build Coastguard Worker Normal, 23*89c4ff92SAndroid Build Coastguard Worker Exhaustive 24*89c4ff92SAndroid Build Coastguard Worker }; 25*89c4ff92SAndroid Build Coastguard Worker ParseTuningLevel(const BackendOptions::Var & value,TuningLevel defaultValue)26*89c4ff92SAndroid Build Coastguard Workerinline TuningLevel ParseTuningLevel(const BackendOptions::Var& value, TuningLevel defaultValue) 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker if (value.IsInt()) 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker int v = value.AsInt(); 31*89c4ff92SAndroid Build Coastguard Worker if (v > static_cast<int>(TuningLevel::Exhaustive) || 32*89c4ff92SAndroid Build Coastguard Worker v < static_cast<int>(TuningLevel::None)) 33*89c4ff92SAndroid Build Coastguard Worker { 34*89c4ff92SAndroid Build Coastguard Worker ARMNN_LOG(warning) << "Invalid GpuAcc tuning level ("<< v << ") selected. " 35*89c4ff92SAndroid Build Coastguard Worker "Using default(" << static_cast<int>(defaultValue) << ")"; 36*89c4ff92SAndroid Build Coastguard Worker } else 37*89c4ff92SAndroid Build Coastguard Worker { 38*89c4ff92SAndroid Build Coastguard Worker return static_cast<TuningLevel>(v); 39*89c4ff92SAndroid Build Coastguard Worker } 40*89c4ff92SAndroid Build Coastguard Worker } 41*89c4ff92SAndroid Build Coastguard Worker return defaultValue; 42*89c4ff92SAndroid Build Coastguard Worker } 43*89c4ff92SAndroid Build Coastguard Worker ConfigureTuner(arm_compute::CLTuner & tuner,TuningLevel level)44*89c4ff92SAndroid Build Coastguard Workerinline void ConfigureTuner(arm_compute::CLTuner &tuner, TuningLevel level) 45*89c4ff92SAndroid Build Coastguard Worker { 46*89c4ff92SAndroid Build Coastguard Worker tuner.set_tune_new_kernels(true); // Turn on tuning initially. 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker switch (level) 49*89c4ff92SAndroid Build Coastguard Worker { 50*89c4ff92SAndroid Build Coastguard Worker case TuningLevel::Rapid: 51*89c4ff92SAndroid Build Coastguard Worker ARMNN_LOG(info) << "Gpu tuning is activated. TuningLevel: Rapid (1)"; 52*89c4ff92SAndroid Build Coastguard Worker tuner.set_tuner_mode(arm_compute::CLTunerMode::RAPID); 53*89c4ff92SAndroid Build Coastguard Worker break; 54*89c4ff92SAndroid Build Coastguard Worker case TuningLevel::Normal: 55*89c4ff92SAndroid Build Coastguard Worker ARMNN_LOG(info) << "Gpu tuning is activated. TuningLevel: Normal (2)"; 56*89c4ff92SAndroid Build Coastguard Worker tuner.set_tuner_mode(arm_compute::CLTunerMode::NORMAL); 57*89c4ff92SAndroid Build Coastguard Worker break; 58*89c4ff92SAndroid Build Coastguard Worker case TuningLevel::Exhaustive: 59*89c4ff92SAndroid Build Coastguard Worker ARMNN_LOG(info) << "Gpu tuning is activated. TuningLevel: Exhaustive (3)"; 60*89c4ff92SAndroid Build Coastguard Worker tuner.set_tuner_mode(arm_compute::CLTunerMode::EXHAUSTIVE); 61*89c4ff92SAndroid Build Coastguard Worker break; 62*89c4ff92SAndroid Build Coastguard Worker case TuningLevel::None: 63*89c4ff92SAndroid Build Coastguard Worker default: 64*89c4ff92SAndroid Build Coastguard Worker tuner.set_tune_new_kernels(false); // Turn off tuning. Set to "use" only mode. 65*89c4ff92SAndroid Build Coastguard Worker break; 66*89c4ff92SAndroid Build Coastguard Worker } 67*89c4ff92SAndroid Build Coastguard Worker } 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Worker class ClTunedParameters : public IGpuAccTunedParameters 70*89c4ff92SAndroid Build Coastguard Worker { 71*89c4ff92SAndroid Build Coastguard Worker public: 72*89c4ff92SAndroid Build Coastguard Worker ClTunedParameters(IGpuAccTunedParameters::Mode mode, IGpuAccTunedParameters::TuningLevel tuningLevel); 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker virtual void Load(const char* filename); 75*89c4ff92SAndroid Build Coastguard Worker virtual void Save(const char* filename) const; 76*89c4ff92SAndroid Build Coastguard Worker 77*89c4ff92SAndroid Build Coastguard Worker Mode m_Mode; 78*89c4ff92SAndroid Build Coastguard Worker TuningLevel m_TuningLevel; 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker arm_compute::CLTuner m_Tuner; 81*89c4ff92SAndroid Build Coastguard Worker arm_compute::CLGEMMHeuristicsHandle m_HeuristicsHandle; 82*89c4ff92SAndroid Build Coastguard Worker }; 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker }