// // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include #include #include namespace armnnDelegate { DelegateOptions::DelegateOptions(armnn::Compute computeDevice, const std::vector& backendOptions, const armnn::Optional logSeverityLevel) : m_Backends({computeDevice}), m_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel) { m_RuntimeOptions.m_BackendOptions = backendOptions; } DelegateOptions::DelegateOptions(const std::vector& backends, const std::vector& backendOptions, const armnn::Optional logSeverityLevel) : m_Backends(backends), m_RuntimeOptions(), m_LoggingSeverity(logSeverityLevel) { m_RuntimeOptions.m_BackendOptions = backendOptions; } DelegateOptions::DelegateOptions(armnn::Compute computeDevice, const armnn::OptimizerOptions& optimizerOptions, const armnn::Optional& logSeverityLevel, const armnn::Optional& func) : m_Backends({computeDevice}), m_RuntimeOptions(), m_OptimizerOptions(optimizerOptions), m_LoggingSeverity(logSeverityLevel), m_DebugCallbackFunc(func) { } DelegateOptions::DelegateOptions(const std::vector& backends, const armnn::OptimizerOptions& optimizerOptions, const armnn::Optional& logSeverityLevel, const armnn::Optional& func) : m_Backends(backends), m_RuntimeOptions(), m_OptimizerOptions(optimizerOptions), m_LoggingSeverity(logSeverityLevel), m_DebugCallbackFunc(func) { } DelegateOptions::DelegateOptions(char const* const* options_keys, char const* const* options_values, size_t num_options, void (*report_error)(const char*)) { armnn::IRuntime::CreationOptions runtimeOptions; armnn::OptimizerOptions optimizerOptions; bool internalProfilingState = false; armnn::ProfilingDetailsMethod internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents; arm::pipe::ProfilingOptions extProfilingParams; for (size_t i = 0; i < num_options; ++i) { // Process backends if (std::string(options_keys[i]) == std::string("backends")) { // The backend option is a comma separated string of backendIDs that needs to be split std::vector backends; char* dup = strdup(options_values[i]); char* pch = std::strtok(dup, ","); while (pch != NULL) { backends.push_back(pch); pch = strtok (NULL, ","); } this->SetBackends(backends); } // Process dynamic-backends-path else if (std::string(options_keys[i]) == std::string("dynamic-backends-path")) { runtimeOptions.m_DynamicBackendsPath = std::string(options_values[i]); } // Process logging level else if (std::string(options_keys[i]) == std::string("logging-severity")) { this->SetLoggingSeverity(options_values[i]); } // Process GPU backend options else if (std::string(options_keys[i]) == std::string("gpu-tuning-level")) { armnn::BackendOptions option("GpuAcc", {{"TuningLevel", atoi(options_values[i])}}); runtimeOptions.m_BackendOptions.push_back(option); } else if (std::string(options_keys[i]) == std::string("gpu-mlgo-tuning-file")) { armnn::BackendOptions option("GpuAcc", {{"MLGOTuningFilePath", std::string(options_values[i])}}); optimizerOptions.m_ModelOptions.push_back(option); } else if (std::string(options_keys[i]) == std::string("gpu-tuning-file")) { armnn::BackendOptions option("GpuAcc", {{"TuningFile", std::string(options_values[i])}}); runtimeOptions.m_BackendOptions.push_back(option); } else if (std::string(options_keys[i]) == std::string("gpu-enable-profiling")) { runtimeOptions.m_EnableGpuProfiling = (*options_values[i] != '0'); } else if (std::string(options_keys[i]) == std::string("gpu-kernel-profiling-enabled")) { armnn::BackendOptions option("GpuAcc", {{"KernelProfilingEnabled", armnn::stringUtils::StringToBool(options_values[i])}}); runtimeOptions.m_BackendOptions.push_back(option); } else if (std::string(options_keys[i]) == std::string("save-cached-network")) { armnn::BackendOptions option("GpuAcc", {{"SaveCachedNetwork", armnn::stringUtils::StringToBool(options_values[i])}}); optimizerOptions.m_ModelOptions.push_back(option); } else if (std::string(options_keys[i]) == std::string("cached-network-filepath")) { armnn::BackendOptions option("GpuAcc", {{"CachedNetworkFilePath", std::string(options_values[i])}}); optimizerOptions.m_ModelOptions.push_back(option); } // Process GPU & CPU backend options else if (std::string(options_keys[i]) == std::string("enable-fast-math")) { armnn::BackendOptions modelOptionGpu("GpuAcc", {{"FastMathEnabled", armnn::stringUtils::StringToBool(options_values[i])}}); optimizerOptions.m_ModelOptions.push_back(modelOptionGpu); armnn::BackendOptions modelOptionCpu("CpuAcc", {{"FastMathEnabled", armnn::stringUtils::StringToBool(options_values[i])}}); optimizerOptions.m_ModelOptions.push_back(modelOptionCpu); } // Process CPU backend options else if (std::string(options_keys[i]) == std::string("number-of-threads")) { unsigned int numberOfThreads = armnn::numeric_cast(atoi(options_values[i])); armnn::BackendOptions modelOption("CpuAcc", {{"NumberOfThreads", numberOfThreads}}); optimizerOptions.m_ModelOptions.push_back(modelOption); } // Process reduce-fp32-to-fp16 option else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-fp16")) { optimizerOptions.m_ReduceFp32ToFp16 = armnn::stringUtils::StringToBool(options_values[i]); } // Process reduce-fp32-to-bf16 option else if (std::string(options_keys[i]) == std::string("reduce-fp32-to-bf16")) { optimizerOptions.m_ReduceFp32ToBf16 = armnn::stringUtils::StringToBool(options_values[i]); } // Process debug-data else if (std::string(options_keys[i]) == std::string("debug-data")) { optimizerOptions.m_Debug = armnn::stringUtils::StringToBool(options_values[i]); } // Infer output-shape else if (std::string(options_keys[i]) == std::string("infer-output-shape")) { armnn::BackendOptions backendOption("ShapeInferenceMethod", { { "InferAndValidate", armnn::stringUtils::StringToBool(options_values[i]) } }); optimizerOptions.m_ModelOptions.push_back(backendOption); } // Allow expanded dims else if (std::string(options_keys[i]) == std::string("allow-expanded-dims")) { armnn::BackendOptions backendOption("AllowExpandedDims", { { "AllowExpandedDims", armnn::stringUtils::StringToBool(options_values[i]) } }); optimizerOptions.m_ModelOptions.push_back(backendOption); } // Process memory-import else if (std::string(options_keys[i]) == std::string("memory-import")) { optimizerOptions.m_ImportEnabled = armnn::stringUtils::StringToBool(options_values[i]); } // Process enable-internal-profiling else if (std::string(options_keys[i]) == std::string("enable-internal-profiling")) { internalProfilingState = *options_values[i] != '0'; optimizerOptions.m_ProfilingEnabled = internalProfilingState; } // Process internal-profiling-detail else if (std::string(options_keys[i]) == std::string("internal-profiling-detail")) { uint32_t detailLevel = static_cast(std::stoul(options_values[i])); switch (detailLevel) { case 1: internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsWithEvents; break; case 2: internalProfilingDetail = armnn::ProfilingDetailsMethod::DetailsOnly; break; default: internalProfilingDetail = armnn::ProfilingDetailsMethod::Undefined; break; } } // Process enable-external-profiling else if (std::string(options_keys[i]) == std::string("enable-external-profiling")) { extProfilingParams.m_EnableProfiling = armnn::stringUtils::StringToBool(options_values[i]); } // Process timeline-profiling else if (std::string(options_keys[i]) == std::string("timeline-profiling")) { extProfilingParams.m_TimelineEnabled = armnn::stringUtils::StringToBool(options_values[i]); } // Process outgoing-capture-file else if (std::string(options_keys[i]) == std::string("outgoing-capture-file")) { extProfilingParams.m_OutgoingCaptureFile = options_values[i]; } // Process incoming-capture-file else if (std::string(options_keys[i]) == std::string("incoming-capture-file")) { extProfilingParams.m_IncomingCaptureFile = options_values[i]; } // Process file-only-external-profiling else if (std::string(options_keys[i]) == std::string("file-only-external-profiling")) { extProfilingParams.m_FileOnly = armnn::stringUtils::StringToBool(options_values[i]); } // Process counter-capture-period else if (std::string(options_keys[i]) == std::string("counter-capture-period")) { extProfilingParams.m_CapturePeriod = static_cast(std::stoul(options_values[i])); } // Process profiling-file-format else if (std::string(options_keys[i]) == std::string("profiling-file-format")) { extProfilingParams.m_FileFormat = options_values[i]; } // Process serialize-to-dot else if (std::string(options_keys[i]) == std::string("serialize-to-dot")) { this->SetSerializeToDot(options_values[i]); } else { throw armnn::Exception("Unknown option for the ArmNN Delegate given: " + std::string(options_keys[i])); } } this->SetRuntimeOptions(runtimeOptions); this->SetOptimizerOptions(optimizerOptions); this->SetInternalProfilingParams(internalProfilingState, internalProfilingDetail); this->SetExternalProfilingParams(extProfilingParams); } } // namespace armnnDelegate