实时应用的优化代码生成
生成代码的时间限制
嵌入式应用程序可能有要求,限制代码在返回答案之前运行的时间。这样的要求可能会有问题,因为求解器无法为优化提供时间保证。本主题概述了用于估计嵌入代码在返回结果之前将运行多长时间的技术,并描述了可以对代码进行的更改以缩短时间要求。
有关编写高效代码生成代码的一般建议,请参阅 针对代码生成的 MATLAB 代码设计注意事项 (MATLAB Coder)。
匹配目标环境
为了在代码生成之前估计生成的代码的执行时间,请将您的 MATLAB® 环境设置为尽可能接近目标环境。
检查目标硬件和计算机的时钟速度。相应地扩展您的基准测试结果。
将 MATLAB 中的
maxNumCompThreads
设置为 1,因为 MATLAB Coder™ 生成的默认 LAPACK 和 BLAS 库是单线程的。lastN = maxNumCompThreads(1);
完成基准测试后,重置
maxNumCompThreads
值:N = maxNumCompThreads(lastN); % Alternatively, % N = maxNumCompThreads('automatic');
注意
如果您的目标硬件具有多个核心并且您使用自定义多线程 LAPACK 和 BLAS 库,则将
maxNumCompThreads
设置为目标硬件上的线程数。请参阅Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder)。如果您拥有 Embedded Coder® 许可证,请参阅以下主题以获取有关评估嵌入代码的最终性能的可靠方法的详细信息:Speed Up Linear Algebra in Code Generated from a MATLAB Function Block (Embedded Coder)、Speed Up Matrix Operations in Code Generated from a MATLAB Function Block (Embedded Coder)、验证 (Embedded Coder) 和 性能 (Embedded Coder)。
设置编码器配置
要设置代码生成的配置,请调用 coder.config
。
cfg = coder.config('mex');
为了节省生成代码的时间,请关闭完整性检查和整数饱和度检查。求解器不依赖这些检查来正常函数,假设目标函数和非线性约束函数不需要它们。有关详细信息,请参阅Control Run-Time Checks (MATLAB Coder)。
cfg.IntegrityChecks = false; cfg.SaturateOnIntegerOverflow = false;
通常,使用静态内存分配时,生成的代码运行速度更快,尽管这种分配会增加生成的代码量。此外,有些硬件不支持动态内存分配。要使用静态内存分配,请指定此设置。
cfg.DynamicMemoryAllocation = 'Off';
您可以通过选择不同类型的 BLAS(底层线性代数子程序)来提高代码的性能。要了解如何为生成的代码设置 BLAS,请参阅 Speed Up Matrix Operations in Generated Standalone Code by Using BLAS Calls (MATLAB Coder)。如果您希望嵌入式应用程序并行运行,则必须提供支持系统并行计算的 BLAS 或 LAPACK 库。类似地,当您拥有并行硬件时,您可以通过设置自定义 LAPACK 调用来提高代码的性能。请参阅Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder)。
对求解器进行基准测试
使用一组典型应用程序的输入参数,在 1000 次评估循环中运行 MEX 生成的代码。找出总时间和最大评估时间。尝试您认为可能会导致求解器耗时过长的参数,并测试它们和其他参数。如果 MEX 应用程序在合理的时间范围内返回令人满意的结果,那么您可以预期部署的应用程序也会这样做。
设置初始点
影响运行时间和解质量的最重要因素之一是优化 x0
的起点。当求解器调用之间参数缓慢变化时,前一次调用的解通常是下一次调用的一个良好起点。请参阅 随着参数的变化,遵循方程解,它还展示了由于解切换 吸引盆 ,解时间如何发生跳跃。
如果您的优化问题没有缓慢变化的参数,并且仅包含几个控制变量,那么尝试估计以前的解的响应是值得的。构建一个解的模型作为参数的函数,可以是参数的二次函数,也可以是低维插值,并使用预测的解点作为求解器的起点。
适当设置选项
有时您可以通过调整参数来加快解的速度。如果您将 MaxIterations
选项设置为仅允许几次迭代,则求解器会很快停止。例如,如果求解器是 fmincon
,请输入此代码。
opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
然而,结果可能远非最优。确保不准确的结果不会对您的系统造成过度影响。在满足时间约束的前提下,将 MaxIterations
设置为尽可能大。您可以通过测量迭代所需的时间或测量函数评估所需的时间来估计该值,然后设置 MaxFunctionEvaluations
选项或 MaxIterations
选项。有关示例,请参阅 优化代码生成基础知识。
有关可加速求解器的设置的更多建议,请参阅 求解器耗时过长。请注意,由于代码生成的限制,本主题中的某些建议不适用。请参阅fmincon 背景中的代码生成或quadprog 背景下的代码生成。
全局最小值
您可能需要一个全局最小值,而不仅仅是局部最小值作为解。寻找全局最小值可能要花费大量时间,而且不能保证有效。如需建议,请参阅 搜索更小的最小值。
另请参阅
fmincon
| codegen
(MATLAB Coder) | optimoptions
| quadprog