Für die Übersetzung von FDS5 auf Windows haben wir uns für den Intel Fortran Compiler entschieden, da dieser sich sehr gut in Visual Studio 2008 integriert, schnellen Code erzeugt und es außerdem für FDS eine Anleitung gibt, wie man den Intel Compiler parametrisert. Im Wesentlichen bin ich dieser Anleitung gefolgt, die Abweichungen und Probleme kommen hier:

Die Anleitung von FDS geht davon aus, dass man MPICH2 als MPI-Biblipthek verwendet (MPI ermöglicht parallele Programmierung über Rechnergrenzen hinweg und wird von FDS verwendet). Nun wollte ich natürlich MSMPI, die auf MPICH2 basierende Microsoft-eigene MPI Implementierung verwenden. Da MSMPI kompatibel zu MPICH2 ist ging das auch recht problemlos.

Folgende Einstellungen braucht man im parallelen Fortran-Projekt:

  • Fortran: Additional Include Directories: C:\Program Files\Microsoft HPC Pack 2008 SDK\Include
  • Linker: Additional Library Directories: C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64 (i386 für die 32bit-Variante)
  • Linker, Dependencies: Additional Dependencies: msmpi.lib msmpifec.lib. Letzteres ist die Fortran MPI Bibliothek, die vom Intel Compiler benötigt wird. Mehr dazu hier

Mit diesen Einstellungen ließ sich FDS mit MSMPI auf einem englischsprachigen System problemlos übersetzen

Bei einem deutschen Visual Studio kam es aber zu einem Linker-Fehler, der auf einem Bug im Intel-Compiler beruht:

"Fatal error cannot open bufferoverflowu"

Hier versucht der Linker aus irgendwelchen Gründen eine gar nicht benötigte Laufzeitbibliothek bufferoverflowu.lib zu ziehen. Abhilfe fand sich im Intel Fortran Forum: Einfach bufferoverflowu in den Projekteigenschaften unter Linker, Input, Ignore Specific Library eintragen.

image 

Woran ich noch bastle ist die Stackgröße. Die FDS-Compileanweisung empfiehlt hier eine feste Größe unter Stack Reserve Size und Stack Commit Size von 32768000 vorzugeben. Damit hatten wir allerdings bei einer Simulation einen Absturz wegen Stack Overflow. Hat jemand Erfahrungen mit extrem großen Stacks auf x64?

Eine weitere Baustelle ist die Optimierung. Derzeit übersetze ich mit der Option "Maximize Speed plus Higher Level Optimizations (/O3)". Außerdem wollte ich natürlich (Intel Compiler mit Intel Prozessor) die prozessorspezifischen Optimierungen haben. Nur leider bietet die Oberfläche des Compilers hier die benötigten Optionen für /Qax und /Qx nicht an, ich kann nur für Pentium 4 kompatible (incl SSE3 wenn gewünscht) oder für Core 2 Duo mit SSE 4.1 optimieren. Ersteres ist aber zu alt, letzteres zu neu für die vorhandenen Xeon 5160 Prozessoren. Auf der Kommandozeile unterstützt der Compiler aber die richtigen Optionen, daher habe ich /QaxT und /QxT unter Fortran, Command Line, Additional Options hinzugefügt. Ob das wirklich was bringt habe ich aber noch nicht durch Vergleichsmessungen geprüft.

image

Das letzte Problem war der parallele MPI-Debugger, der sich bei einem Fortran-Projekt schlicht nicht einstellen ließ. Aber dazu später mehr.

Gruß,
Steffen