2009-11-23 4 views
5

Ich bin ein medizinischer Forscher mit Code in MATLAB 2009b geschrieben, die sehr langsam wegen einer selbstreferentiellen Schleife (nicht sicher der Programmiersprache hier) läuft, dh die Ergebnisse der ersten Iteration wird während verwendet die zweite Iteration, usw. (Ich habe es zu einem Preis-thee-Well vektorisiert. Ich habe den Profiler ausgeführt.)Umwandlung von MATLAB-Code in Fortran

Ich möchte die langsamen Teile des Codes in eine mex-Funktion konvertieren. Ich habe Fortran in den frühen 1970ern gelernt, aber seither nicht mehr. Der Code, den ich konvertieren muss, macht nichts Besonderes, es ist nur eine lange numerische Berechnung.

Meine Frage ist: Was wäre die am einfachsten zu lernende Version von Fortran, die für diesen Zweck geeignet ist, und welcher Compiler am besten auf dem Intel Mac dafür funktioniert? Ich habe Informationen gefunden, die Syntax in MATLAB mit Fortran 90 zum Beispiel vergleichen, und die Umwandlung sieht nicht so aus, als wäre es zu entmutigend für mich. Ich bin aber auch kein Programmierer.

Ich benutze ein MacBook Pro mit OS 10.6.

Schätzen Sie jede Hilfe, danke.

+0

Wie ironisch. Matlab wurde zum Teil als "besseres" FORTRAN entwickelt. – Marc

+5

Ist der Code klein genug zum Posten? Es kann noch weitere Optimierungen geben, bevor auf MEX zurückgegriffen wird. Z.B. Die Vorbelegung und das sorgfältige Vornehmen von Funktionsaufrufen könnte neueren Matlabs ermöglichen, Arrayanpassungen direkt an Ort und Stelle durchzuführen - ein großer Gewinn für iterative Berechnungen. –

+1

lässt hoffen, dass diese hitzige Diskussion ihn nicht erschreckte :) – Amro

Antwort

8

Ich empfehle die Verwendung von modernen Fortran, mindestens 90/95, da die Syntax viel fehlerverzeihender ist und fast alle Compiler dies jetzt unterstützen.

Auf einem Mac würde ich gfortran von here empfehlen. Es ist nicht die neueste Version, aber es ist gut in die Apple Build-Tools integriert (Sie müssen Xcode von Ihrer Mac OS DVD installieren) und funktioniert gut. In der numerischen Python-Community, die von vielen Fortran-Erweiterungen abhängig ist, wird dieser Build dringend empfohlen.

Ich habe nicht wirklich fortran mex auf dem Mac verwendet - aber ich denke, es sollte ziemlich einfach sein, wenn Sie die mex Dokumentation folgen - und wie Sie sagen, übersetzen Code von Matlab zu Fortran sollte nicht so schlecht sein (es ist besser wenn Sie vermeiden können, Matlab-Funktionen aufzurufen, aber Fortran hat vernünftiges Slicing und Array-Zugriff).

+0

Downvote ohne Kommentar? Ich denke, ich beantwortete die Frage ... – robince

+0

+1, um den Downvote entgegenzuwirken. Ich denke, der Ratschlag ist gut (so ziemlich das, was ich sagen würde), nur einige Leute hier mögen keine Sprachen, daher der Downvote (Raten). – Rook

0

Nun, Sie haben wahrscheinlich schon eine Lösung gefunden. Aber ich werde das sagen: Matlab wird immer schneller. Es ist jedoch manchmal nicht intuitiv, Matlabs JIT voll auszunutzen. Früher hat Mathworks gesagt, Code für Geschwindigkeit vektorisieren. Dann sagten sie, schreibe alles in expliziten Schleifen. Ich bin mir eigentlich nicht sicher, was die aktuelle Best Practice ist.

Was ich sage ist, bevor Sie nach Fortran gehen, finden Sie die beste Praxis und implementieren Sie es. Das gibt dir vielleicht genug Beschleunigung.

Sind Sie auch absolut sicher, dass Sie die Verlangsamung zu einer Schleife isoliert haben? Haben Sie den Profiler benutzt? Sie haben wahrscheinlich, seit Sie erfahren klingen. Ich dachte nur, ich würde es erwähnen.

Viel Glück, Ariel