我知道情况并非总是如此,但MEX函数不应该提高代码效率,特别是在计算方面?
我使用编码器工具包在MATLAB中使用expm
函数。我期待看到效率的提高,因为该功能执行了大量的矩阵计算。
但是,我没有看到太多时间的改善,如下图所示:
X轴: expm
函数的另一次迭代
Y轴:该功能的运行时间
蓝线:常规expm
函数调用
红线: MEX'ed expm
函数调用
MEX版本是否与常规版本相似?有没有办法提高速度?我使用tic
和toc
来收集有关运行时的数据。
答案 0 :(得分:2)
大多数matlab函数都是简单的包装器,它们调用FORTRAN库代码,其中大部分来自LAPACK / EISPACK / LINPACK。换句话说,内置的matlab函数调用已经调用了编译代码,而不是解释为matlab代码(.m源代码)。因此,MEX没有太多可以改善这些函数调用的性能。
在matlab中编译代码只会直接在matlab源代码中完成大量工作。如果你的代码主要是调用一堆内置的matlab函数,特别是矩阵函数(都是LAPACK函数),那么你就不会看到太多的改进,只有当你有“手动”代码时,即如果你在matlab代码(在.m文件中)完全实现类似“expm”的东西,然后用MEX编译时会快得多。如果您拥有自己的大量matlab代码,那么您将只看到编译matlab代码的好处,而不是只是调用内置函数。
考虑一下,为什么Mathworks会将Matlab与内置函数一起实现为解释的matlab代码?即使他们在matlab代码中实现了一些内置函数(这只是一小部分,因为大多数是FORTRAN / C / C ++),他们会在发货之前编译这些函数,以便您作为用户获得最好的表现。
答案 1 :(得分:2)
以下是对expm(A)
的调用如何解析A = rand(500,500);
的位置。
时间在矩阵乘法(F = F*F;
)和对子函数PadeApproximantOfDegree
的调用之间平均分配。在mkl.dll中使用非常快速的LAPACK函数内置了矩阵乘法(使用英特尔MKL的MATLAB&#39的线性代数函数)。
这里的所有时间花费在PadeApproximantOfDegree
:
不在循环中。所有调用内置矩阵数学函数。如果有迭代,那么我希望MATLAB有点慢,但它只是几行,每次 1次占用。只调用父(F*F
)中的矩阵乘法不止一次。
事实上,如果CoX版本速度较慢,如果Coder无法使用MATLAB可以访问的优化多线程库,我不会感到惊讶。显然Coder管理着。