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 #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include "DeviceSpec.hpp" 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #include <armnn/BackendId.hpp> 11*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/PolymorphicDowncast.hpp> 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Worker #include <vector> 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 struct BackendSettings 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker BackendIdVector m_PreferredBackends; 21*89c4ff92SAndroid Build Coastguard Worker BackendIdSet m_SupportedBackends; 22*89c4ff92SAndroid Build Coastguard Worker BackendIdSet m_SelectedBackends; 23*89c4ff92SAndroid Build Coastguard Worker BackendIdSet m_IgnoredBackends; 24*89c4ff92SAndroid Build Coastguard Worker 25*89c4ff92SAndroid Build Coastguard Worker BackendSettings() = default; 26*89c4ff92SAndroid Build Coastguard Worker BackendSettingsarmnn::BackendSettings27*89c4ff92SAndroid Build Coastguard Worker BackendSettings(const BackendIdVector& preferredBackends, 28*89c4ff92SAndroid Build Coastguard Worker const IDeviceSpec& deviceSpec) 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker Initialize(preferredBackends, deviceSpec); 31*89c4ff92SAndroid Build Coastguard Worker } 32*89c4ff92SAndroid Build Coastguard Worker BackendSettingsarmnn::BackendSettings33*89c4ff92SAndroid Build Coastguard Worker BackendSettings(const BackendSettings& other) 34*89c4ff92SAndroid Build Coastguard Worker : m_PreferredBackends(other.m_PreferredBackends) 35*89c4ff92SAndroid Build Coastguard Worker , m_SupportedBackends(other.m_SupportedBackends) 36*89c4ff92SAndroid Build Coastguard Worker , m_SelectedBackends(other.m_SelectedBackends) 37*89c4ff92SAndroid Build Coastguard Worker , m_IgnoredBackends(other.m_IgnoredBackends) 38*89c4ff92SAndroid Build Coastguard Worker { 39*89c4ff92SAndroid Build Coastguard Worker } 40*89c4ff92SAndroid Build Coastguard Worker IsBackendPreferredarmnn::BackendSettings41*89c4ff92SAndroid Build Coastguard Worker bool IsBackendPreferred(const BackendId& backend) const 42*89c4ff92SAndroid Build Coastguard Worker { 43*89c4ff92SAndroid Build Coastguard Worker return IsBackendInCollection(backend, m_PreferredBackends); 44*89c4ff92SAndroid Build Coastguard Worker } 45*89c4ff92SAndroid Build Coastguard Worker IsBackendSupportedarmnn::BackendSettings46*89c4ff92SAndroid Build Coastguard Worker bool IsBackendSupported(const BackendId& backend) const 47*89c4ff92SAndroid Build Coastguard Worker { 48*89c4ff92SAndroid Build Coastguard Worker return IsBackendInCollection(backend, m_SupportedBackends); 49*89c4ff92SAndroid Build Coastguard Worker } 50*89c4ff92SAndroid Build Coastguard Worker IsBackendSelectedarmnn::BackendSettings51*89c4ff92SAndroid Build Coastguard Worker bool IsBackendSelected(const BackendId& backend) const 52*89c4ff92SAndroid Build Coastguard Worker { 53*89c4ff92SAndroid Build Coastguard Worker return IsBackendInCollection(backend, m_SelectedBackends); 54*89c4ff92SAndroid Build Coastguard Worker } 55*89c4ff92SAndroid Build Coastguard Worker IsBackendIgnoredarmnn::BackendSettings56*89c4ff92SAndroid Build Coastguard Worker bool IsBackendIgnored(const BackendId& backend) const 57*89c4ff92SAndroid Build Coastguard Worker { 58*89c4ff92SAndroid Build Coastguard Worker return IsBackendInCollection(backend, m_IgnoredBackends); 59*89c4ff92SAndroid Build Coastguard Worker } 60*89c4ff92SAndroid Build Coastguard Worker IsCpuRefUsedarmnn::BackendSettings61*89c4ff92SAndroid Build Coastguard Worker bool IsCpuRefUsed() const 62*89c4ff92SAndroid Build Coastguard Worker { 63*89c4ff92SAndroid Build Coastguard Worker BackendId cpuBackendId(Compute::CpuRef); 64*89c4ff92SAndroid Build Coastguard Worker return IsBackendSupported(cpuBackendId) && IsBackendPreferred(cpuBackendId); 65*89c4ff92SAndroid Build Coastguard Worker } 66*89c4ff92SAndroid Build Coastguard Worker GetAvailablePreferredBackendsarmnn::BackendSettings67*89c4ff92SAndroid Build Coastguard Worker BackendIdVector GetAvailablePreferredBackends() const 68*89c4ff92SAndroid Build Coastguard Worker { 69*89c4ff92SAndroid Build Coastguard Worker BackendIdVector availablePreferredBackends; 70*89c4ff92SAndroid Build Coastguard Worker for (const BackendId& backend : m_PreferredBackends) 71*89c4ff92SAndroid Build Coastguard Worker { 72*89c4ff92SAndroid Build Coastguard Worker if (IsBackendSupported(backend) && !IsBackendIgnored(backend)) 73*89c4ff92SAndroid Build Coastguard Worker { 74*89c4ff92SAndroid Build Coastguard Worker availablePreferredBackends.push_back(backend); 75*89c4ff92SAndroid Build Coastguard Worker } 76*89c4ff92SAndroid Build Coastguard Worker } 77*89c4ff92SAndroid Build Coastguard Worker return availablePreferredBackends; 78*89c4ff92SAndroid Build Coastguard Worker } 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker private: Initializearmnn::BackendSettings81*89c4ff92SAndroid Build Coastguard Worker void Initialize(const BackendIdVector& preferredBackends, 82*89c4ff92SAndroid Build Coastguard Worker const IDeviceSpec& deviceSpec) 83*89c4ff92SAndroid Build Coastguard Worker { 84*89c4ff92SAndroid Build Coastguard Worker // Copy preferred backends from input 85*89c4ff92SAndroid Build Coastguard Worker m_PreferredBackends = preferredBackends; 86*89c4ff92SAndroid Build Coastguard Worker 87*89c4ff92SAndroid Build Coastguard Worker // Obtain list of supported backends 88*89c4ff92SAndroid Build Coastguard Worker const DeviceSpec& spec = *PolymorphicDowncast<const DeviceSpec*>(&deviceSpec); 89*89c4ff92SAndroid Build Coastguard Worker m_SupportedBackends = spec.GetSupportedBackends(); 90*89c4ff92SAndroid Build Coastguard Worker } 91*89c4ff92SAndroid Build Coastguard Worker 92*89c4ff92SAndroid Build Coastguard Worker template<typename Collection> IsBackendInCollectionarmnn::BackendSettings93*89c4ff92SAndroid Build Coastguard Worker bool IsBackendInCollection(const BackendId& backend, const Collection& collection) const 94*89c4ff92SAndroid Build Coastguard Worker { 95*89c4ff92SAndroid Build Coastguard Worker return std::find(collection.begin(), collection.end(), backend) != collection.end(); 96*89c4ff92SAndroid Build Coastguard Worker } 97*89c4ff92SAndroid Build Coastguard Worker }; 98*89c4ff92SAndroid Build Coastguard Worker 99*89c4ff92SAndroid Build Coastguard Worker } //namespace armnn 100