MATLAB Mex功能并不比常规功能快

时间:2014-10-30 18:00:07

标签: c++ performance matlab mex

我知道情况并非总是如此,但MEX函数不应该提高代码效率,特别是在计算方面?

我使用编码器工具包在MATLAB中使用expm函数。我期待看到效率的提高,因为该功能执行了大量的矩阵计算。

但是,我没有看到太多时间的改善,如下图所示:

enter image description here

X轴: expm函数的另一次迭代

Y轴:该功能的运行时间

蓝线:常规expm函数调用

红线: MEX'ed expm函数调用

MEX版本是否与常规版本相似?有没有办法提高速度?我使用tictoc来收集有关运行时的数据。

2 个答案:

答案 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);的位置。

enter image description here

时间在矩阵乘法(F = F*F;)和对子函数PadeApproximantOfDegree的调用之间平均分配。在mkl.dll中使用非常快速的LAPACK函数内置了矩阵乘法(使用英特尔MKL的MATLAB&#39的线性代数函数)。

这里的所有时间花费在PadeApproximantOfDegree

enter image description here

不在循环中。所有调用内置矩阵数学函数。如果有迭代,那么我希望MATLAB有点慢,但它只是几行,每次 1次占用。只调用父(F*F)中的矩阵乘法不止一次。

事实上,如果CoX版本速度较慢,如果Coder无法使用MATLAB可以访问的优化多线程库,我不会感到惊讶。显然Coder管理着。