我一直在使用Octave和MATLAB进行一些项目,我遇到了一些问题。这个问题Why/when should I prefer MATLAB over Octave?)回答了几个,但仍然有一个挥之不去......
我已经阅读了一些帖子/其他来源,比较了Octave和MATLAB的性能,我在标准脚本上运行了一些自己的测试,证实了Octave通常比标准操作的MATLAB慢得多的普遍共识(当然,迭代,以便比较有意义)。
此共识似乎也表明MATLAB的大部分性能提升都归功于其JIT编译器,它在运行时编译大型循环。这是有道理的,在这些情况下似乎会出现最大的性能差异(例如Mathworks Matlab vs Gnu Octave)
我的问题如下:为什么矢量化代码在Octave中运行得更慢?在这种情况下,似乎应该在循环之前留出内存,并且一些本机C / C ++循环应该执行操作,这将等同于Octave和MATLAB之间的矢量化代码的性能。另外,这是否有更广泛的含义,即Octave可能对复杂操作执行得更差,即使编写代码使得JIT编译器不需要/未使用?
答案 0 :(得分:34)
Matlab代码有四种加速方式:
JIT:根据我的轶事观察,在运行时编译有助于循环,但似乎也加快了(或至少与代码的其他部分交互)。
在C / C ++中实现函数:在Matlab / Octave中实现了一堆Matlab / Octave函数。在每个版本中,都有更多的内容被制作成内置插件。
多线程:有a list of functions个多线程实现,可以加快函数调用。
通常更有效的实施。例如,在几个版本之前,中值滤波器对整数输入进行了大幅度的提升。
所有这些方法都需要致力于使代码更快的开发人员。据我所知,Octave开发人员的一个主要问题是确保(Matlab)功能完全存在,而性能提升似乎是过去几年Matlab开发的重点。
答案 1 :(得分:16)
Matlab内部使用英特尔数学核心函数库(英特尔MKL)进行矢量和矩阵运算。这使得Matlab比Octave具有明显的优势。
尝试命令' version -lapack'和'版本-blas'在你的Matlab中检查你的Matlab正在使用的MKL版本。
通过Matlab讨论MKL用法的快速链接是http://stanford.edu/~echu508/matlab.html。
英特尔MKL是专有的。 software.intel.com/en-us/intel-mkl。但是,对于非商业用途,Linux版本是免费的。如果Octave可以某种方式使用我们机器上安装的MKL,它应该会大大加快Octave的速度。