主要内容

通过使用配置MEX功能MATLAB分析器

您可以配置由MATLAB生成的MEX函数的执行时间®编码器™通过使用MATLAB分析器。生成的代码的概要文件显示了调用的次数和每行对应的MATLAB函数所花费的时间。使用Profiler来识别MATLAB代码的行,这些行会产生花费最多时间的生成代码。这些信息可以帮助您在开发周期的早期识别和纠正性能问题。有关MATLAB Profiler的更多信息,请参见配置文件分析代码以提高性能

中不支持分析器的图形界面金宝appMATLAB在线™

MEX配置文件生成

您可以使用MATLAB Profiler与生成的MEX函数。另外,如果您有一个调用MATLAB函数的测试文件,您可以一步生成MEX函数并对其进行分析。您可以在命令行或MATLAB Coder应用程序中执行这些操作。

将分析器与生成的MEX函数一起使用:

  1. 通过设置配置对象属性来启用MEX分析EnableMexProfiling真正的

    或者,您可以使用codegen配置文件选择。

    MATLAB Coder应用程序中的等效设置为启用执行分析生成的一步。

  2. 生成MEX文件MyFunction_mex

  3. 运行MATLAB Profiler并查看概要概要报告,该报告将在单独的窗口中打开。

    配置文件;MyFunction_mex;配置文件查看器;

    确保您没有更改或移动原始MATLAB文件MyFunction.m。否则,剖析器不会考虑MyFunction_mex剖析。

如果你有一个测试文件MyFunctionTest.m调用你的MATLAB函数,你可以:

  • 生成MEX函数并在一步中对其进行配置codegen以及配置文件选项。如果您之前打开了MATLAB Profiler,请在一起使用这两个选项之前将其关闭。

    codegenMyFunction以及MyFunctionTest配置文件
  • 通过选择配置MEX功能启用执行分析验证如果您之前打开了MATLAB Profiler,请在执行此操作之前将其关闭。

例子

您可以使用Profiler来识别MATLAB代码的函数或行,这些函数或行会产生花费最多时间的生成代码。下面是一个MATLAB函数的示例,它转换其输入矩阵的表示一个B在其中一行中从行为主到列为主的布局。对于大型矩阵,这种转换的执行时间很长。通过修改特定的行来避免转换,使函数更有效。

考虑MATLAB函数:

函数[y] = MyFunction(A,B)% # codegen生成的代码使用矩阵A和B的行为主表示coder.rowMajor;length = size(A,1);将A和B中所有元素的绝对值相加,遍历%矩阵逐行Sum_abs = 0;Row = 1:长度col = 1:length sum_abs = sum_abs + abs(A(row,col)) + abs(B(row,col));结束结束调用外部C函数'foo.c'返回所有元素的和%的A和BSum = 0;Sum = coder.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;Double sum = 0;S = (int)length;/*对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,然后进一步优化:

  1. 启用MEX分析并为其生成MEX代码MyFunction。运行MyFunction_mex对于两个大的随机矩阵一个B。查看配置文件汇总报表。

    A = rand(20000);B = rand(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件;MyFunction_mex (A, B);配置文件查看器;

    一个单独的窗口打开,显示概要概要报告。

    配置文件摘要显示一个表与字段函数名称调用,总时间在秒,自我时间在秒和总时间图。火焰图以柱状图的形式表示表格。

    概要概要报告显示了MEX文件及其子文件的总时间和自时间,这是为原始MATLAB函数生成的代码。

  2. 在Function Name下,点击第一个链接来查看生成代码的概要详细报告MyFunction。你可以看到花费时间最多的线条:

    带有字段行号、代码、单元格、总时间(以秒为单位)、时间百分比和时间图的表,其中包含示例代码中的相关数据条目。重要的是要指出,总的时间为编码员。Ceval相对较高。

  3. 电话呼叫coder.ceval花费了很多时间(16.914秒),这一行有相当长的执行时间,因为coder.ceval转换矩阵的表示形式一个B从行为主布局到列为主布局,然后将它们传递给外部C函数。可以通过使用附加参数来避免这种转换布局:rowMajorcoder.ceval

    Sum = coder.ceval(“布局:rowMajor”“foo”coder.ref (A), coder.ref (B),长度);
  4. 使用修改后的文件再次生成MEX函数和概要文件MyFunction

    A = rand(20000);B = rand(20000);codegenMyFunctionarg游戏{A、B}foo.cfoo。配置文件配置文件;MyFunction_mex (A, B);配置文件查看器;
    的概要详细信息报告MyFunction显示线路呼叫coder.ceval现在只需要0.653秒:

    与上面提到的图像相同,这里是编码器。Ceval的总时间减少了0.653秒。

折叠表达式对MEX代码覆盖率的影响

当你使用coder.const将表达式折叠成常量,会导致MATLAB函数和MEX函数之间代码覆盖率的差异。例如,考虑这个函数:

函数y = MyFoldFunction% # codegenA = 1;B = 2;C = a + b;Y = 5 + coder.const(c);结束

MATLAB函数分析MyFoldFunction在概要详细报告中显示了代码覆盖率:

然而,分析MEX函数MyFoldFunction_mex显示不同的代码覆盖率:

在生成的代码中没有执行第2、3和4行,因为您折叠了表达式C = a + b转换为一个常量,用于代码生成。

这个例子使用了用户定义的表达式折叠。代码生成器有时会自动折叠某些表达式,以优化生成代码的性能。这样的优化还会导致MEX函数的覆盖范围与MATLAB函数不同。

另请参阅

|||||

相关的话题