2009-11-23 12 views
5

I investigador médico con código escrito en MATLAB 2009b que funciona muy lentamente debido a un ciclo autorreferencial (no estoy seguro de la jerga de programación aquí), es decir, los resultados de la primera iteración se utilizan durante la segunda iteración, etc. (Lo he vectorizado a una tarifa-thee-well. He ejecutado el Profiler.)convirtiendo el código de MATLAB en Fortran

Me gustaría convertir las partes lentas del código a una función mex. Aprendí Fortran a principios de los años 70, pero no lo he usado desde entonces. El código que necesito convertir no hace nada extravagante, solo es un cálculo numérico largo.

Mi pregunta es: ¿cuál sería la versión más fácil de volver a aprender de Fortran adecuada para este propósito, y qué compilador funciona mejor en la Mac de Intel para esto? Encontré información que compara la sintaxis en MATLAB con Fortran 90, por ejemplo, y la conversión no parece ser demasiado desalentadora para mí. Sin embargo, nuevamente, no soy un programador.

Estoy usando una MacBook Pro con OS 10.6.

Agradecemos cualquier ayuda, gracias.

+0

Cómo irónico. Matlab fue desarrollado en parte como una FORTRAN "mejor". – Marc

+5

¿Es el código lo suficientemente pequeño para publicar? Todavía puede haber otras optimizaciones antes de recurrir a MEX. P.ej. la preasignación y el cuidado con las llamadas de función podrían permitir a los nuevos Matlabs realizar modificaciones in situ en los arreglos, una gran ganancia para los cálculos iterativos. –

+1

esperemos que esta acalorada discusión no lo haya asustado :) – Amro

Respuesta

8

Recomendaría utilizar Fortran moderno, al menos 90/95, ya que la sintaxis es mucho más indulgente y casi todos los compiladores ahora lo admiten.

En una Mac recomendaría gfortran de here. No es la versión más reciente, pero está bien integrada con las herramientas de compilación de Apple (necesitará instalar Xcode desde su DVD de Mac OS) y funciona bien. En la comunidad numérica de python, que depende de muchas extensiones de Fortran, esta compilación es muy recomendable.

No he usado fortran mex en el mac, pero creo que debería ser bastante sencillo si sigues la documentación de mex, y como dices, traducir el código de Matlab a Fortran no debería ser tan malo (es mejor si puede evitar llamar a las funciones de Matlab, pero fortran tiene cortes sensibles y acceso a arreglos).

+0

Votación descendente sin comentarios? Creo que respondí la pregunta ... – robince

+0

+1 para contrarrestar el voto a favor. Creo que el consejo es bueno (más o menos lo que iba a decir), solo a algunas personas aquí no les gustan algunos idiomas, por lo tanto, el voto negativo (adivinar). – Rook

0

Bueno, probablemente ya haya encontrado una solución. Sin embargo, diré esto: Matlab se ha vuelto cada vez más rápido. Sin embargo, hacer un uso completo del JIT de Matlab a veces no es intuitivo. Mathworks solía decir vectorizar código para velocidad. Luego dijeron que escriban todo en bucles explícitos. De hecho, no estoy seguro de cuál es la mejor práctica actual.

Lo que estoy diciendo es, antes de ir a Fortran, averiguar la mejor práctica e implementarla. Eso puede darte suficiente aceleración allí mismo.

Además, ¿está absolutamente seguro de haber aislado la ralentización en un bucle? ¿Has estado usando el generador de perfiles? Probablemente lo haya hecho, ya que suena experimentado. Solo pensé en mencionarlo.

Buena suerte, Ariel

Cuestiones relacionadas