2009-11-23 283 views
5

我是一位在MATLAB 2009b中编写代码的医学研究人员,由于自引用循环(此处不确定编程术语),运行速度非常缓慢,即第一次迭代的结果在第二次迭代等(我已经将它向量化为一个票价 - 你 - 我已经运行了Profiler。)将MATLAB代码转换为Fortran

我想将代码的慢速部分转换为mex函数。我在20世纪70年代早期学过Fortran,但自那以后就没有用过它。我需要转换的代码没有什么奇特之处,它只是一个很长的数值计算。

我的问题是:什么是最容易重新学习的Fortran足以达到此目的,以及哪种编译器在英特尔Mac上最适合此工作?例如,我发现将MATLAB中的语法与Fortran 90进行比较的信息,并且转换看起来不像对我来说太过艰巨。但是,我再次不是程序员。

我正在使用OS 10.6的MacBook Pro。

感谢任何帮助,谢谢。

+0

多么具有讽刺意味。 Matlab被部分开发为“更好”的FORTRAN。 – Marc 2009-11-23 18:26:23

+5

代码小到足以发布?在采取MEX之前,可能还有其他优化措施。例如。预分配和小心函数调用可能会让更新的Matlabs进行就地阵列修改,这是迭代计算的重大胜利。 – 2009-11-23 18:51:08

+1

让我们希望这个激烈的讨论并没有吓倒他:) – Amro 2009-11-23 23:34:02

回答

8

我推荐使用现代Fortran,至少90/95作为语法更加宽容,现在几乎所有的编译器都支持它。

在Mac上,我会推荐gfortran从here。这不是最新版本,但它与Apple构建工具很好地集成在一起(您需要从Mac OS DVD安装Xcode)并且运行良好。在依赖Fortran扩展的数字python社区中,强烈建议使用此构建。

我实际上并没有在mac上使用fortran mex - 但我认为应该相当直接,如果你遵循mex文档 - 正如你所说的将代码从Matlab转换为Fortran不应该太糟糕了(这样更好如果你可以避免调用Matlab函数,但fortran具有明智的切片和数组访问)。

+0

Downvote无评论?我想我回答了这个问题... – robince 2009-11-23 18:35:57

+0

+1来对付downvote。我认为这个建议很好(几乎是我要说的),但这里只有一些人不喜欢某种语言,所以倒下了(猜测)。 – Rook 2009-11-28 02:25:14

0

那么,你可能已经找到了解决方案。不过,我会这样说:Matlab已经越来越快了。但是充分利用Matlab的JIT有时并不直观。 Mathworks曾经说过向量化代码的速度。然后他们说,把所有的东西写在明确的循环中我其实不确定目前的最佳做法是什么。

我在说的是,在你去Fortran之前,找出最佳实践并实施它。那可能会给你足够的加速。

另外,你是否完全肯定你已经将循环放慢了?你是否使用过探查器?你可能有,因为你听起来很有经验。我只是想我会提到它。

祝你好运, Ariel