... wie umgeht man Compilerschwächen?


[ F77-GETARG | C->Fortran | Host-Infos ]

Hin und wieder soll es vorkommen, daß die Compiler für unseren Parallelrechner sich etwas anders benehmen, als man es von anderen Compilern kennt. Meistens gibt es einfache Lösungen, die leider den Compiler-Experten nicht eingefallen sind.

Hier möchte ich zur Nachnutzung für andere Interessenten einige solche ausgefallenen Dinge empfehlen:

Fortran-Standardfunktionen für Kommandozeilenargumente
Die in mehreren F77-Compilern realisierten Standardfunktionen
    integer function iargc()
    subroutine getarg(i,string)

waren in der Fortranbibliothek für PowerPC nicht zu finden.

Eine Variante ist ab sofort in der Bibliothek libCubecom.a enthalten. Da die Art des Zugriffs auf diese Argumente für Parix nicht dokumentiert ist, besteht somit keine Gewähr (aber eine gute Chance) für künftige Versionen. Getestet wurde mit den Versionen 1.5 und 1.7.1 der Motorola-Compiler.
Wer sich für das Know-How interessiert, findet dort die C-Quelle.
C ruft Fortran
Es treten bekanntlich Probleme auf, wenn ein in C geschriebenes Hauptprogramm main() Fortran-Unterprogramme aufruft, in denen Ein-/Ausgabe-Anweisungen ausgeführt werden. In manchen Fällen findet man eine spezielle Initialisierungsroutine für das Fortran-I/O-System, nicht so in der Parix-Dokumentation. Der folgende Trick hilft weiter:
Das Hauptprogramm in C erhält den Namen MAIN_() statt main(). Zum Linken sollte man sowieso f77.px (und nicht cc.px) verwenden, damit alle Standardbibliotheken automatisch gefunden werden.
Etwas mehr ist zu tun, wenn man Kommandozeilenargumente verwendet:
Statt
    main(int argc, char **argv)

schreibe man

    int    xargc;
    char **xargv;
    MAIN_()

und kann an jeder Stelle des Programms auf die Kommandozeile zugreifen (nur eben mit "xarg." statt "arg." ).

Es geht natürlich auch "sauberer" (oder umständlicher):
    MAIN_()
    {
      extern int    xargc;
      extern char **xargv;
      int    argc = xargc;
      char **argv = xargv;
      ...
    }
Fortran-Zugriff auf Datum/Uhrzeit/UserID
Die Bibliothek libTools.a enthält auch einige Routinen, die solche nebensächlichen Informationen wie Datum undUhrzeit oder den Login-Namen des aktuellen Nutzers liefern.
Datum / Uhrzeit als Zeichenkette:
     character*26 datum
     call frontend_time (datum)
Datum / Uhrzeit als Integer (Sekunden seit 01.01.80 (?))
     integer zeit
     zeit = int_frontend_time()
Login-Name des aktuellen Nutzers:
     character*10 nutzer
     call getuser(nutzer)
Diese Tools sind in gleicher Weise natürlich auch auf anderen Workstations zu verwenden. Es gibt allerdings einige Abweichungen auf dem Parallelrechner (ppc):
  • Die Uhrzeit wird evtl. für eine falsche Zeitzone umgerechnet.
  • Der Benutzername wird auf Umweg über die Hostworkstation ermittelt, wozu im aktuellen Verzeichnis kurzzeitig ein File geschrieben wird.

  • Matthias Pester - 15. Mai 1996

    Zugriffe:


    Last modified: