实时应用程序的优化代码生成
生成代码的时间限制
嵌入式应用程序可能要求限制代码在返回答案之前可以运行多长时间。这样的要求可能是有问题的,因为求解器不能保证优化的时间。本主题概述了用于估计嵌入式代码在返回结果之前将运行多长时间的技术,并描述了您可以对代码进行的更改以缩短时间要求。
有关为代码生成编写高效代码的一般建议,请参见代码生成的MATLAB代码设计考虑因素(MATLAB编码器).
匹配目标环境
要在代码生成之前估计生成代码的执行时间,请设置MATLAB®环境尽可能与目标环境相匹配。
检查目标硬件和计算机的时钟速度。相应地衡量基准测试结果。
集
maxNumCompThreads
在MATLAB中为1,因为默认的LAPACK和BLAS库生成MATLAB编码器™是单线程的。lastN = maxNumCompThreads(1);
完成基准测试后,重置
maxNumCompThreads
值:N = maxNumCompThreads(lastN);%或者,% N = maxNumCompThreads('automatic');
请注意
如果目标硬件有多个核,并且使用自定义多线程LAPACK和BLAS库,则设置
maxNumCompThreads
到目标硬件上的线程数。看到通过使用LAPACK调用加速生成的独立代码中的线性代数(MATLAB编码器).如果你有嵌入式编码器®许可证,请参阅这些主题的详细信息,以可靠的方式评估嵌入代码的结果性能:加速从MATLAB函数块生成的代码中的线性代数(嵌入式编码),加速从MATLAB函数块生成的代码中的矩阵运算(嵌入式编码),验证(嵌入式编码),性能(嵌入式编码).
设置编码器配置
要设置代码生成的配置,请调用coder.config
.
CFG = code .config(墨西哥人的);
为了节省生成代码的时间,请关闭完整性检查和整数饱和检查。求解器不依赖这些检查来正常工作,假设目标函数和非线性约束函数不需要它们。详细信息请参见控制运行时检查(MATLAB编码器).
cfg。IntegrityChecks = false;cfg。饱和onintegeroverflow = false;
通常,使用静态内存分配时,生成的代码运行得更快,尽管这种分配会增加生成的代码数量。另外,一些硬件不支持动态内存分配。金宝app若要使用静态内存分配,请指定此设置。
cfg。DynamicMemoryAllocation =“关闭”;
您可以通过选择不同类型的BLAS(底层线性代数子程序)来提高代码的性能。要了解如何为生成的代码设置BLAS,请参见通过使用BLAS调用加速生成的独立代码中的矩阵操作(MATLAB编码器).如果希望嵌入式应用程序并行运行,则必须在系统上提供支持并行计算的BLAS或LAPACK库。金宝app类似地,当您有并行硬件时,您可以通过设置自定义LAPACK调用来提高代码的性能。看到通过使用LAPACK调用加速生成的独立代码中的线性代数(MATLAB编码器).
对求解器进行基准测试
使用一组典型应用程序的输入参数,在1000个计算循环中运行MEX生成的代码。求出总时间和最大评估时间。尝试您认为可能导致求解器花费太长时间的参数,并测试它们和其他参数。如果MEX应用程序在合理的时间范围内返回令人满意的结果,那么您可以期望部署的应用程序也会这样做。
设定起始点
影响运行时和解决方案质量的最重要因素之一是优化的初始点x0
.当参数在求解器调用之间变化缓慢时,前一个调用的解决方案通常是下一个调用的良好起点。看到随着参数的变化,遵循方程解,这也显示了解决方案切换时解决方案时间的跳跃是如何发生的吸引盆地.
如果你的优化问题没有缓慢变化的参数,并且只包括几个控制变量,那么尝试从以前的解决方案中估计一个响应是值得的。金宝搏官方网站作为参数的函数构造解的模型,可以作为参数中的二次函数,也可以作为低维插值,并将预测的解点作为求解器的起点。
适当设置选项
有时可以通过调整参数来加快解决方案的速度。如果你设置MaxIterations
选项只允许几次迭代,然后求解器迅速停止。例如,如果求解器是fmincon
,输入此代码。
Opts = optimoptions(“fmincon”,“算法”,“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编码器)|optimoptions
|quadprog