谢谢
Zenna
谢谢
Zenna
例如,Matlab使用FFTW库来实现FFT算法。该库的性能几乎无法超越。我所知道的唯一可比较的是英特尔数学核心库(MKL),但它是商业软件。因此,首先建议使用您可以找到的每个数学库。Matlab在幕后执行此操作。
确实有时很难超越Matlab。但问题在于,Matlab分析器并不总是提供足够的信息来改进代码。您知道某些Matlab方法需要大量时间,但并不总是知道是否有其他方法可以通过以另一种方式调用它们来改善性能,因为该方法是黑盒子。
在C / C ++中,您可以使用像valgirnd这样的工具,甚至可以检查编译器正在生成的汇编程序,从而可以帮助编译器通过内联方法来改进该代码。但是,Matlab在幕后使用专业的数学库,如果执行Matlab代码时大部分时间都花费在这些库上,则难以改进性能。
我建议您尝试不同的方法。您可以使用Matlab分析器分析瓶颈,并查看将该代码移动到本地代码是否值得。Matlab允许您这样做。您也可以反过来做。您可以在C / C ++中实现一些粘合剂,并调用Matlab进行某些操作,其中您已经经历了本机代码比Matlab慢的情况。对于图像处理,您可以获得明显的加速。但这实际上取决于您编写MATLAB代码的熟练程度。许多事情可以向量化或通过内置函数处理。那种代码非常快。
然而,如果您发现自己的代码由许多循环组成(比如说,循环遍历图像中的所有像素),它将变得非常缓慢,而向量化可以提供100倍以上的加速。
如果您的代码在MATLAB中很难做到“正确”,那么切换到C可能是一个可行的选择。我在学校做了一个计算机视觉项目(3D点重建),这清楚地表明了这一点。当我们的项目(使用C++和OpenCV实现)完成计算时,另一个小组的项目还几乎没有加载图像。他们的项目是用MATLAB编写的。我们从未计时过,但我的猜测是我们的版本运行大约快10倍。
但是,他们的MATLAB代码可能根本没有经过优化。因此,它并不真正有用作为基准。
我已经将一个Matlab例程导出为C++,并使用Visual Studio C++编译为Mex。加速比提高了10倍。如果我使用多核心,则可能会有3倍的速度提升。
如果您在斜坡上有斜坡,并对矩阵的单个组件执行某些操作,例如y(m,n) = x(m) * a - x(m-1),并且这是针对斜坡的,则可以获得良好的加速效果。
如果您在计算中使用许多Matlab函数,其中Matlab函数本身执行许多操作,则将代码导出到C++中就没有太多意义。
像其他人所说的那样,使用MATLAB分析器查看瓶颈在哪里。如果是矩阵数值计算,你需要跨越一个相当高的门槛才能击败MATLAB。如果有很多条件语句或函数调用,你更有可能提高速度。
确保尝试将MATLAB和C++之间数据传输的次数最小化。如果你一次性发送大量数据数组,这很可能会很快。否则,即使你的C++程序很快,如果来回进行大量数据传输,你可能会失去数据转换的速度优势。
我还会看看你的算法,并考虑使用Java。从MATLAB调用自定义Java代码非常方便,因为MATLAB已经在JRE上运行。我对在MATLAB函数和我的自定义Java代码之间传输大型数据数组的速度印象非常深刻。几年前,我曾考虑使用纯C++(使用MEX或其他方式)实现算法以加速MATLAB,但处理所有数据结构看起来就像噩梦一样。最终我使用了COM/ActiveX,因为我在Windows机器上运行,接口更容易处理。
在解决数值问题时,我经常进行低级编程,这让我更加了解出现的问题,从数值精度到编程维护问题。除非有巨大的性能优势,否则我宁愿选择高级语言而不是C/C++。