主要内容

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

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

中不支持Profiler的图形界面MATLAB在线™

墨西哥人形象代

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

使用生成MEX函数的Profiler:

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

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

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

  2. 生成MEX文件MyFunction_mex

  3. 运行MATLAB剖析器并查看剖析摘要报告,它会在一个单独的窗口中打开。

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

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

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

  • 生成MEX函数并对其进行分析codegen以及配置文件选项。如果您之前打开了MATLAB分析器,那么在您同时使用这两个选项之前请关闭它。

    codegenMyFunction以及MyFunctionTest配置文件
  • 通过选择配置MEX功能使执行分析验证步骤的应用程序。如果你打开MATLAB Profiler之前,关闭它之前,你执行这个动作。

例子

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

考虑MATLAB函数:

函数[y] = MyFunction (A, B)% # codegen生成的代码使用矩阵A和B的行主表示coder.rowMajor;长度=大小(1);通过遍历A和B的所有元素的绝对值和%矩阵逐行sum_abs = 0;行= 1:长度= 1:长度sum_abs = sum_abs + abs(A(row,col)) + abs(B(row,col));结束结束调用外部C函数'foo.c',返回所有元素的和%的A和B金额= 0;和= 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;双和= 0;s = (int)长度;/*对A和B的所有元素求和*/ for(i=0;i
             

对应的C头文件foo。是:

#include "rtwtypes.h" double foo(双*A,双*B,双长度);

foo.c返回变量总和的所有元素的和一个而且B.功能的表现foo.c是否与矩阵无关一个而且B以行为主布局或列为主布局表示。MyFunction返回的差值sum_abs而且总和

你可以测量的性能MyFunction对于大型输入矩阵一个而且B,然后进一步优化:

  1. 启用MEX分析并为其生成MEX代码MyFunction.运行MyFunction_mex对于两个大的随机矩阵一个而且B.查看“概要报告”。

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

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

    概要摘要显示一个表,其中包含字段函数名称调用、总时间(秒)、自我时间(秒)和总时间图。一个火焰图,表示柱状图中的表格。

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

  2. 在功能名称下,单击第一个链接以查看为的生成代码的概要信息详细报告MyFunction.你可以看到花在哪里的时间最多:

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

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

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

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

    和上面提到的图片一样,这里是编码器。薛瓦尔的总时间减少了0.653秒。

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

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

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

MATLAB函数解析MyFoldFunction在概要文件详细信息报告中显示此代码覆盖率:

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

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

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

另请参阅

|||||

相关的话题

Baidu
map