1

我必须向我的客户证明 Fortran 比 Matlab/Simulink 快。他正在考虑将代码从 fortran 迁移到 Matlab。代码主要是逻辑和“程序”子程序。它不使用任何本机矩阵运算或数学函数(特征值、非线性方程等)我认为考虑到互联网上的几个参考文献和每种语言的“内在特征”,谁更快的问题已经得到解答,但我需要具体数据。

我发现的所有图表都比较了 Matlab/Simulink x Fortran,但没有指定是否编译了 Matlab 代码(使用 matlab 编码器工具箱)。我认为这是一个关键问题。

我并不是说编译代码会使 matlab 比 fortran 更快,但为了真正说服我想看到结果的人。

一个好的开始是:

  1. 性能 - Matlab (.m) 编译(Matlab 编码器工具箱)X Intel Fortran
  2. 性能 - Simulink 编译(实时工具箱)X Intel Fortran

有没有人已经测试过这个场景?

4

3 回答 3

3

我最近使用 Matlab Coder “编译”的 Matlab 代码产生了 x20 的加速(!)。实际预期的加速取决于很多事情。如果您的 Matlab 代码是高度矢量化的并且主要使用线性代数例程,那么 Coder 不太可能产生很大的加速。但是,如果您的算法中有多个循环和条件,那么您确实可以实现数量级的加速,如我上面的示例所示。

在底层,Matlab 的线性代数使用 BLAS/LAPACK(通过 MKL/ACML 库),它们使用高度优化的 Fortran 代码。因此,除非您编写极其高效的 Fortran,否则您不太可能在高度矢量化的 Matlab 线性代数/数学算法方面胜过 Matlab(尽管有函数调用开销)。但是,如果您的代码使用条件/循环和类似的非数学编程结构,那么情况可能会发生变化。简而言之,没有简单的答案 - 这取决于您的特定算法/程序。

暂时将性能放在一边,Matlab 与 Fortran 相比还有许多其他优点,包括大量经过测试的内置函数和实现快速开发周期。

于 2013-10-09T10:43:33.797 回答
2

MATLAB Compiler不会使您的代码更快,它旨在将您的代码分发给没有 MATLAB 的第三方用户。您需要提供 MCR 或 MATLAB 组件运行时以及已编译的代码,它本质上是 MATLAB 的无头版本,如果您拥有 MATLAB Compiler 许可证,则可以自由分发。

现在,如果您使用 MATLAB Coder(或 Simulink Coder for Simulink)从您的 MATLAB 代码生成 C 代码,那么与解释的 MATLAB 代码相比,您可能会获得更快的速度。即使那样,这也取决于有问题的代码。此外,这仅支持与 C 代码生成兼容的 MATLAB 语言子集。

于 2013-10-08T20:19:39.600 回答
2

您需要问一个定义更严格的问题——对于 Fortran 是否比 MATLAB/Simulink 更快,没有单一的答案。

首先,用任何一种语言编写糟糕的、缓慢的算法都很容易。因此,您需要指定特定的、编写良好的算法。

其次,在很多事情上,MATLAB 甚至比写得很好的 Fortran(或 C)还要快。例如,如果您想将两个大矩阵相乘,或者计算一些特征值,或者其他处于 MATLAB 最佳位置的线性代数,您将无法击败它。另一方面,如果您正在做的事情有更多的逻辑,不能被矢量化,Fortran 可能会更快(只要它写得好)。

当您将 MATLAB Coder 引入图片时,后面这些东西最有可能通过转换为 C 代码从加速中受益(主要是因为前者确实不能加速很多,这就是为什么你不会'打败他们)。但是加速是可变的——我见过超过 10-15 倍,但有时也只有 1-2 倍。

你没有提到你在哪里找到了比较 MATLAB 和 Fortran 的图表,但如果你在互联网上找到了它们,我认为这是一个非常安全的假设,它们不涉及使用 MATLAB Coder 生成 C 代码,并表示仅 MATLAB 的性能。

最后 - 加速 MATLAB 的另一种方法是使用 Parallel Computing Toolbox 并行化它(它使您能够在本地机器上的核心上并行化事物),也可能使用分布式计算服务器(集群上的并行化)。使用 MATLAB 代码执行此操作通常比使用 MATLAB Coder 生成 C 代码来加速要容易得多 - 因此,如果您认为在比较中考虑 MATLAB Coder 至关重要,您可能也应该考虑这一点

于 2013-10-09T12:50:09.060 回答