配置MEX功能的使用MATLAB分析器
您可以配置由MATLAB生成的MEX函数的执行时间®Coder™通过使用MATLAB分析器。生成的代码的配置文件显示了调用的次数和对应MATLAB函数的每一行所花费的时间。使用分析器来识别生成的代码所花费的时间最多的MATLAB代码行。这些信息可以帮助您在开发周期的早期识别和纠正性能问题。有关MATLAB分析器的更多信息,请参见配置文件
而且分析代码以提高性能.
中不支持分析器的图形界面金宝appMATLAB在线™.
MEX配置文件生成
您可以使用MATLAB分析器生成的MEX函数。或者,如果您有一个调用MATLAB函数的测试文件,您可以在一个步骤中生成MEX函数并对其进行分析。您可以在命令行或MATLAB Coder应用程序中执行这些操作。
使用生成MEX函数的Profiler:
通过设置配置对象属性启用MEX概要分析
EnableMexProfiling
来真正的
.或者,您可以使用
codegen
与配置文件
选择。在MATLAB Coder应用程序中的等效设置是启用执行概要分析在生成的一步。
生成MEX文件
MyFunction_mex
.运行MATLAB分析器并查看概要文件摘要报告,该报告将在单独的窗口中打开。
配置文件在;MyFunction_mex;配置文件查看器;
请确保您没有更改或移动原始MATLAB文件
MyFunction.m
.否则,分析器不考虑MyFunction_mex
剖析。
如果你有一个测试文件MyFunctionTest.m
调用你的MATLAB函数,你可以:
生成MEX函数,并在一个步骤中使用
codegen
与以及
和配置文件
选项。如果您之前打开了MATLAB分析器,请在同时使用这两个选项之前将其关闭。codegenMyFunction以及MyFunctionTest配置文件
通过选择配置MEX功能启用执行概要分析在验证如果您之前打开了MATLAB分析器,请在执行此操作之前将其关闭。
例子
您可以使用Profiler来识别生成的代码所花费的时间最多的函数或MATLAB代码行。下面是一个MATLAB函数的例子,它转换输入矩阵的表示一个
而且B
在其中一行中从大行布局到大列布局。对于大型矩阵,这种转换的执行时间很长。通过修改特定的行来避免转换,可以使函数更有效。
考虑MATLAB函数:
函数[y] = MyFunction(A,B)% # codegen生成的代码使用矩阵A和B的行主表示coder.rowMajor;长度= size(A,1);遍历A和B的所有元素的绝对值之和%逐行矩阵Sum_abs = 0;为Row = 1:长度为col = 1:长度sum_abs = sum_abs + abs(A(行,col)) + abs(B(行,col));结束结束调用外部C函数'foo.c',返回所有元素的和A和B的%Sum = 0;Sum = code .ceval(“foo”coder.ref (A), coder.ref (B),长度);返回sum_abs和sum的差值Y = sum_abs - sum;结束
此函数生成的代码使用方阵的行主表示一个
而且B
.代码首先进行计算sum_abs
的所有元素的绝对值之和一个
而且B
)通过逐行遍历矩阵。该算法针对以行为主布局表示的矩阵进行了优化。然后代码使用coder.ceval
调用外部C函数foo.c
:
#include#include #include "foo.h" double foo(double *A, double *B, double length) {int i,j,s;双和= 0;S = (int)长度;/*对A和B的所有元素求和*/ for(i=0;i
对应的C头文件foo。
是:
#include“rtwtypes.h”double foo(double *A, double *B, double length);
foo.c
返回变量总和
的所有元素的和一个
而且B
.函数的性能foo.c
是否与矩阵无关一个
而且B
以行大布局或列大布局表示。MyFunction
返回的差值sum_abs
而且总和
.
您可以测量的性能MyFunction
对于大输入矩阵一个
而且B
,然后进一步优化:
启用MEX分析并生成的MEX代码
MyFunction
.运行MyFunction_mex
对于两个大的随机矩阵一个
而且B
.查看概要报表。A =兰特(20000);B =兰特(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件在;MyFunction_mex (A, B);配置文件查看器;
将打开一个单独的窗口,显示概要文件摘要报告。
概要摘要报告显示了MEX文件及其子文件的总时间和自身时间,子文件是为原始MATLAB函数生成的代码。
在函数名下,单击第一个链接以查看生成代码的概要文件详细信息报告
MyFunction
.你可以看到花费最多时间的线条:电话来电
coder.ceval
需要大量的时间(16.914 s)。这一行有相当长的执行时间,因为coder.ceval
转换矩阵的表示形式一个
而且B
从行为主布局到列为主布局,然后再将它们传递给外部C函数。可以通过使用附加参数来避免这种转换布局:rowMajor
在coder.ceval
:Sum = code .ceval(“布局:rowMajor”,“foo”coder.ref (A), coder.ref (B),长度);
使用修改后的文件重新生成MEX函数和配置文件
MyFunction
.A =兰特(20000);B =兰特(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件在;MyFunction_mex (A, B);配置文件查看器;
MyFunction
显示该行调用coder.ceval
现在只需要0.653秒:
折叠表达式对MEX代码覆盖率的影响
当你使用coder.const
将表达式折叠为常量,会导致MATLAB函数和MEX函数之间的代码覆盖差异。例如,考虑函数:
函数y = MyFoldFunction% # codegenA = 1;B = 2;C = a + b;Y = 5 + code .const(c);结束
MATLAB函数解析MyFoldFunction
在概要文件详细报告中显示此代码覆盖率:
然而,分析MEX函数MyFoldFunction_mex
显示了不同的代码覆盖率:
第2、3和4行不会在生成的代码中执行,因为您已经折叠了表达式C = a + b
转换成一个常量用于代码生成。
本例使用用户定义的表达式折叠。代码生成器有时会自动折叠某些表达式,以优化所生成代码的性能。这样的优化也会导致MEX函数的覆盖范围与MATLAB函数不同。
另请参阅
配置文件
|codegen
|编码器。MexCodeConfig
|coder.rowMajor
|coder.ceval
|coder.const