主要内容

使用MEX函数加速的最佳实践MATLAB算法

当你选择MATLAB的一部分®代码加速,建议采用以下做法。

加速控制执行时间的代码

找到主导运行时的MATLAB代码部分。使用MEX函数加速这部分代码,如下所示:

  1. 将这部分代码放在一个单独的MATLAB函数中。

  2. 由这个MATLAB函数,生成一个MEX函数。

  3. 从原始的MATLAB代码中,调用MEX函数。

要找到每个MATLAB指令的执行时间,请使用MATLAB分析器。

  • 要从命令行打开分析器,请键入概要文件查看器

  • 要从“MATLAB编辑器”窗口中打开分析器,请在编辑器选项卡上,单击运行与时间

有关使用分析器测量MATLAB代码的运行时间的更多信息,请参见分析代码以提高性能

在MEX函数中包含循环

在MATLAB代码中,不是在循环中调用MEX函数,而是在MEX函数中包含循环。包含循环可以消除每次运行循环时调用MEX函数的开销。

例如,下面的代码在一个1000 × 1000矩阵的每一行中找到最大的元素,.您可以使用MEX函数加速部分1、2和3。

Section 2开始max = mat(i,0);初始化max for j = 1:10000 %如果(mat(i,j) > max) max = mat(i,j),则Section 3开始%存储当前最大结束% Section 3结束结束% Section 2结束结束% Section 1结束

使用MEX函数加速section 1。首先加速section 1,以便MEX函数只被调用一次。如果你不能先加速第1部分,那么就按此顺序加速第2或第3部分。如果使用MEX函数加速section 2(或3),则该函数将被调用10000(或10000 × 10000)次。

避免从不支持的函数中生成MEX函数金宝app

检查要加速的MATLAB代码部分是否包含许多不支持的函数和语言特性金宝appMATLAB编码器™.有关支持的函数列表,请参见金宝appC/ c++代码生成支持的函数和对象金宝app

请注意

在某些情况下,您可能必须加速代码部分,即使它们包含一些不受支持的函数。金宝app将不支持的函数声明为外部函金宝app数,以调用原始的MATLAB函数,而不是为该函数生成的代码。可以将函数声明为外部函数coder.extrinsic或者用一个函数宏指令声明。看到使用MATLAB引擎在生成的代码中执行函数调用

如果内置,避免生成MEX函数MATLAB函数主导运行时

仅当用户生成的代码在运行时占主导地位时,才使用MEX函数加速MATLAB代码。

如果计算量大,则避免生成MEX函数,内置的MATLAB函数在运行时占主导地位。这些函数是预编译和优化的,因此使用MEX函数不会显著加速MATLAB代码。此类函数的示例包括圣言会eigfftqr

提示

您可以从MEX函数调用计算密集型的内置MATLAB函数。声明MATLAB函数为外部使用coder.extrinsic或者把它包起来函数宏指令声明。有关更多信息,请参见使用MATLAB引擎在生成的代码中执行函数调用

最小化MEX函数调用

使用一个MEX函数来加速尽可能多的MATLAB代码,而不是在较低级别调用几个MEX函数。这最大限度地减少了调用MEX函数的开销。

例如,考虑函数,testfunc,它调用两个函数,testfunc_1而且testfunc_2

函数[y1,y2] = testfunc(x1,x2) y1 = testfunc_1(x1,x2);Y2 = testfunc_2(x1,x2);结束

而不是单独生成MEX函数testfunc_1而且testfunc_2,然后调用其中的MEX函数testfunc,生成的MEX函数testfunc本身。