2009-11-23 9 views
5

I un ricercatore medico con codice scritto in MATLAB 2009b che funziona molto lentamente a causa di un loop autoreferenziale (non sicuro del gergo di programmazione qui), cioè, i risultati della prima iterazione vengono utilizzati durante la seconda iterazione, ecc. (l'ho vettorializzata a un prezzo-bene. Ho eseguito il Profiler.)conversione del codice MATLAB in Fortran

Mi piacerebbe convertire le parti lente del codice in una funzione mex. Ho imparato Fortran nei primi anni '70, ma da allora non l'ho più usato. Il codice che devo convertire non fa niente di fantasia, è solo un lungo calcolo numerico.

La mia domanda è: quale sarebbe la versione più facile da imparare di Fortran adeguata per questo scopo e quale compilatore funziona meglio su Intel Mac per questo? Ho trovato informazioni che confrontano la sintassi in MATLAB con Fortran 90, ad esempio, e la conversione non sembra che sarebbe troppo scoraggiante per me. Comunque, di nuovo, non sono un programmatore.

Sto usando un MacBook Pro con OS 10.6.

Apprezzare qualsiasi aiuto, grazie.

+0

Che ironia. Matlab è stato sviluppato in parte come FORTRAN "migliore". – Marc

+5

Il codice è abbastanza piccolo da essere pubblicato? Potrebbero esserci altre ottimizzazioni prima di ricorrere a MEX. Per esempio. la preallocazione e l'attenzione con le chiamate di funzione potrebbero consentire ai nuovi Matlabs di apportare modifiche sul posto, una grande vittoria per i calcoli iterativi. –

+1

lascia sperare che questa accesa discussione non lo spaventi :) – Amro

risposta

8

Si consiglia di utilizzare Fortran moderno, almeno 90/95 in quanto la sintassi è molto più indulgente e quasi tutti i compilatori ora lo supportano.

Su un Mac, consigliamo gfortran da here. Non è la versione più recente, ma è ben integrata con gli strumenti di costruzione Apple (dovrai installare Xcode dal tuo DVD Mac OS) e funziona bene. Nella comunità numerica di Python, che dipende da molte estensioni di Fortran, questa build è altamente raccomandata.

In realtà non ho usato fortran mex sul mac - ma penso che dovrebbe essere abbastanza semplice se si segue la documentazione di mex - e come si dice tradurre il codice da Matlab a Fortran non dovrebbe essere troppo cattivo (è meglio se è possibile evitare di chiamare le funzioni di Matlab, ma fortran ha un'affinità sensibile e l'accesso alla matrice).

+0

Downvote senza commenti? Penso di aver risposto alla domanda ... – robince

+0

+1 per contrastare il downvote. Penso che il consiglio sia buono (praticamente la cosa che dovrei dire), solo alcune persone qui non amano alcune lingue, quindi il downvote (indovinando). – Rook

0

Bene, probabilmente avete già trovato una soluzione. Tuttavia, dirò questo: Matlab sta diventando sempre più veloce. Tuttavia, fare pieno uso del JIT di Matlab a volte non è intuitivo. Mathworks era solito dire di rendere il codice per la velocità. Poi hanno detto di scrivere tutto in loop espliciti. In realtà non sono certo di quale sia la migliore pratica corrente.

Quello che sto dicendo è, prima di andare su Fortran, scoprire le migliori pratiche e implementarle. Potrebbe darti abbastanza accelerazione proprio lì.

Inoltre, sei assolutamente certo di aver isolato il rallentamento in un ciclo? Hai usato il profiler? Probabilmente lo hai, dal momento che suona esperto. Ho solo pensato di parlarne.

Buona fortuna, Ariel