2009-11-23 289 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