主要内容

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

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

加速控制执行时间的代码

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

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

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

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

要查找每个MATLAB指令的执行时间,使用MATLAB Profiler。

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

  • 要从MATLAB编辑器窗口中打开Profiler,请在编辑器选项卡上,单击运行时间和

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

在MEX函数中包含循环

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

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

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

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

避免从不支持的函数生成MEX函数

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

请注意

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

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

只有当用户生成的代码主导运行时间时,才使用MEX函数加速MATLAB代码。

避免生成MEX函数,如果计算密集型,内置的MATLAB函数支配运行时间。这些函数是预编译和优化的,因此使用MEX函数不会显著加速MATLAB代码。这类函数的例子包括圣言会eigfftqr

提示

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

最小化MEX函数调用

使用一个MEX函数而不是在较低级别调用的几个MEX函数来加速尽可能多的MATLAB代码。这将最小化调用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本身。

Baidu
map