// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #define LOG_TAG "ArmnnDriver" #include "ArmnnDevice.hpp" #include #include #include #include using namespace android; namespace { std::string GetBackendString(const armnn_driver::DriverOptions& options) { std::stringstream backends; for (auto&& b : options.GetBackends()) { backends << b << " "; } return backends.str(); } } // anonymous namespace namespace armnn_driver { ArmnnDevice::ArmnnDevice(DriverOptions options) : m_Runtime(nullptr, nullptr) , m_ClTunedParameters(nullptr) , m_Options(std::move(options)) { ALOGV("ArmnnDevice::ArmnnDevice()"); armnn::ConfigureLogging(false, m_Options.IsVerboseLoggingEnabled(), armnn::LogSeverity::Trace); if (m_Options.IsVerboseLoggingEnabled()) { SetMinimumLogSeverity(base::VERBOSE); } else { SetMinimumLogSeverity(base::INFO); } armnn::IRuntime::CreationOptions runtimeOptions; #if defined(ARMCOMPUTECL_ENABLED) try { if (!m_Options.GetClTunedParametersFile().empty()) { m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(), m_Options.GetClTuningLevel()); try { m_ClTunedParameters->Load(m_Options.GetClTunedParametersFile().c_str()); } catch (std::exception& error) { // This is only a warning because the file won't exist the first time you are generating it. ALOGW("ArmnnDevice: Failed to load CL tuned parameters file '%s': %s", m_Options.GetClTunedParametersFile().c_str(), error.what()); } runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters; } } catch (const armnn::ClRuntimeUnavailableException& error) { ALOGE("ArmnnDevice: Failed to setup CL runtime: %s. Device will be unavailable.", error.what()); } catch (std::exception& error) { ALOGE("ArmnnDevice: Unknown exception: %s. Device will be unavailable.", error.what()); } #endif runtimeOptions.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled(); m_Runtime = armnn::IRuntime::Create(runtimeOptions); std::vector backends; if (m_Runtime) { const armnn::BackendIdSet supportedDevices = m_Runtime->GetDeviceSpec().GetSupportedBackends(); for (auto &backend : m_Options.GetBackends()) { if (std::find(supportedDevices.cbegin(), supportedDevices.cend(), backend) == supportedDevices.cend()) { ALOGW("ArmnnDevice: Requested unknown backend %s", backend.Get().c_str()); } else { backends.push_back(backend); } } } if (backends.empty()) { // No known backend specified throw armnn::InvalidArgumentException("ArmnnDevice: No known backend specified."); } m_Options.SetBackends(backends); ALOGV("ArmnnDevice: Created device with the following backends: %s", GetBackendString(m_Options).c_str()); } } // namespace armnn_driver