Sun Forte Developer 7: Fortran 95 Version 7


Unter Sun ONE Studio 7 (Sun Forte Developer 7) steht eine neue Version des Fortran-Compilers (f95) zur Verfügung. Es handelt sich um einen "echten" optimierenden Fortran95-Compiler.

Übergang von Sun Fortran 95 Version 6

Vorübersetzte Programmbausteine

Wenn Sie mit f95 Version 6 erstellte binäre Objektdateien, eigene oder bereitgestellte Programmbibliotheken, Fortran-Module, ... einsetzen, dann ist es i. allgem. nicht erforderlich, die gesamte Anwendung zu recompilieren.

64-Bit-Verarbeitung

Auf den Sun-Rechnern des RRZN können Sie wählen, ob Sie in einer 32-Bit-Umgebung (Sun-Terminologie: v8-Architektur) oder in einer 64-Bit-Umgebung (Sun-Terminologie: v9-Architektur) rechnen wollen.

Die Voreinstellung ist -xarch=v8. Wenn Sie Code für die 64-Bit-Umgebung erzeugen lassen wollen, dann müssen Sie explizit -xarch=v9 angeben. Für detaillierte Hinweise zur 64-Bit-Verarbeitung lesen Sie bitte weiter in www.unics.uni-hannover.de/rrzn/gehrke/SunFD7/64-neu.html.

Alternativer Compiler

Unsere bisherigen Erfahrungen mit dem f95-Compiler sind ganz gut. Falls Sie dennoch lieber einen anderen Fortran-Compiler einsetzen wollen, können Sie anstelle des Sun-Compilers den NAGWare-Fortran95-Compiler verwenden.

Diverse Compiler-Optionen

Der Compiler arbeitet die im Compiler-Aufruf explizit angegebenen Optionen von links nach rechts ab, so daß selektives Übersteuern möglich ist. Im Gegensatz zu anderen Compilern arbeitet dieser -- abgesehen von der Ausgabe von Fehlermeldungen -- still vor sich hin; d.h., der Anwender wird nicht laufend über das Fortschreiten der Compilation informiert.
-cg89 spezifiziert die generische SPARC-Architektur und ist daher für alle am RRZN im Einsatz befindlichen Sun-Workstations nicht optimal. Die Option ist überholt und sollte nicht mehr verwendet werden.
-cg92 selektiert die SPARC-V8-Architektur und ist die Kurzform (Makrooption) für
-xarch=v8 -xchip=super -xcache=16/32/4:1024/32/1 Die Option ist überholt und sollte nicht mehr verwendet werden; sie ist äquivalent zu -xtarget=ss1000.
-fast (hat eine neue/erweiterte Bedeutung und) ist die Kurzform (Makrooption) für
-dalign -depend -fns -fsimple=2 -ftrap=common -libmil -xtarget=native -O5 -xlibmopt -pad=local -xvector=yes -xprefetch=yes -xprefetch_level=2
  Achtung: Die implizite Option -xtarget=native bewirkt, daß 32-Bit-Code erzeugt wird, der für 32-Bit- und 64-Bit-Umgebungen geeignet ist. Wenn mit -fast übersetzt worden ist, muß auch mit -fast gelinkt werden (s.u. Abschnitt "Konsistentes Linking"). Diese Option ist ungeeignet, wenn das Programm von Standard-IEEE-Ausnahmebehandlung abhängig ist. Sie ist gut als Anfangsoption für die Laufzeitoptimierung geeignet; i. allgem. ist jedoch weiteres Tuning erforderlich.
-xarchselektiert die Rechnerarchitektur, d.h. den Instruktionssatz für die Codeerzeugung. Die Option wird auch von diversen Makro-Optionen gesetzt, z.B. von der Makro-Option -xtarget. Die Voreinstellung ist immer -xarch=v8. Das bedeutet, daß 32-Bit-Code erzeugt wird. Wenn 64-Bit-Code erzeugt werden soll, d.h. wenn die 64-Bit-Architektur verwendet werden soll, dann muß explizit -xarch=v9 gesetzt werden.

Optimale Compiler-Optionen

Wenn Sie auf derselben Maschine rechnen, auf der Sie das Programm compilieren:

RRZN-Host CPUs optimale Compiler-Option(en) gleichbedeutend mit
SunAS 2 -xtarget=ultra2
-xchache=16/32/1:4096/64/1
-xarch=v8
-xchip=ultra2
-xcache=16/32/1:4096/64/1
Sun218d
XServ
1 -xtarget=ultra -xarch=v8
-xchip=ultra
-xcache=16/32/1:512/64/1
UniCS 4 -xtarget=ultra -xarch=v8
-xchip=ultra
-xcache=16/32/4:512/64/1
e10k
e10kcs
e10kio
e10kpp
8
8
8
32
-xtarget=ultra2
-xcache=16/32/1:8192/64/1
-xarch=v8
-xchip=ultra2
-xcache=16/32/1:8192/64/1
sonstige mittels folgender Kommandos erfragen:
   fpversion
   uname -a
   sysinfo
Achtung: Die Voreinstellung ist -xarch=v8. D.h., es wird die 32-Bit-Architektur gewählt. Wenn Sie die 64-Bit-Architektur verwenden wollen, müssen Sie dafür sorgen, daß -xarch=v9 gesetzt ist.

Empfehlung

32-Bit-Codes: Für optimale Laufzeiteffizienz sollten Sie beim Aufruf des f95-Compilers zuerst -fast angeben. Falls es Probleme gibt, können Sie im Anschluß an die Makrooption -fast selektiv einzelne implizite/enthaltene Optionen "zurücknehmen", indem Sie beispielsweise -fast -O4 angeben. Da die Option -fast jetzt die Option -xtarget=native umfaßt (s.o.), ist die explizite Angabe der Optionen -xtarget, -xarch oder -xchip meist überflüssig. Die in -fast enthaltene Option -xtarget=native sorgt dafür, daß die drei eben genannten Optionen immer optimal gesetzt werden, wenn Sie auf demselben Rechner compilieren, auf dem Sie das Programm dann auch rechnen werden.

64-Bit-Codes: Um optimalen Code für 64-Bit-Umgebungen zu erzeugen, geben Sie hinter der Option -fast zusätzlich die Option -xtarget=native64 an. Für detaillierte Hinweise zur 64-Bit-Verarbeitung lesen Sie bitte weiter in www.unics.uni-hannover.de/rrzn/gehrke/SunWS6/64-neu.html.

f95: Datentypen: Typparameterwerte, Speicherbelegung, Alignment

  Data Sizes and Alignment--(in Bytes) Pass by Reference ( f95 and cc)
Fortran 95 Data Type C Data Type Size Alignment
CHARACTER x
unsigned char x ; 1 1
CHARACTER (LEN=n) x
unsigned char x[n] ; n 1
COMPLEX x
struct {float r,i;} x; 8 4
COMPLEX (KIND=4) x
COMPLEX (KIND=8) x
COMPLEX (KIND=16) x
struct {float r,i;} x;
struct {double dr,di;} x;
struct {long double, dr,di;} x;
8
16
32
4
4/8
4/8/16
DOUBLE COMPLEX x
struct {double dr, di;} x; 
16 4/8
DOUBLE PRECISION x
double x ; 8 4
REAL x
float x ; 4 4
REAL (KIND=4) x
REAL (KIND=8) x
REAL (KIND=16) x
float x ;
double x ;
long double x ;
4
8
16
4
4/8
4/8/16
INTEGER x
int x ; 4 4
INTEGER (KIND=1) x
INTEGER (KIND=2) x
INTEGER (KIND=4) x
INTEGER (KIND=8) x
signed char x ;
short x ;
int x ;
long long int x;
1
2
4
8
4
4
4
4
LOGICAL x
int x ; 4 4
LOGICAL (KIND=1) x
LOGICAL (KIND=2) x
LOGICAL (KIND=4) x
LOGICAL (KIND=8) x
signed char x ;
short x ;
int x ;
long long int x;
1
2
4
8
4
4
4
4

Konsistentes Linking

Es ist i.allg. empfehlenswert, Compilation und Linking nicht zu trennen, sondern in einem Lauf durchzuführen. Sollte das nicht möglich sein, sollte man darauf achten, daß man für den separaten nachfolgenden Linklauf kein Lader-Kommando, sondern beispielsweise das f95-Kommando verwendet. Ferner ist darauf zu achten, daß Compilations- und Linking-Optionen konsistent sind.

Wenn man einen Teil eines Programmes mit einer der folgenden Optionen übersetzt, dann sind auch für das Linking die gleichen Optionen erforderlich:

-a, -autopar, -B..., -fast, -G, -L..., -l..., -mt, -xmemalign, -nolib, -norunpath, -p, -pg, -xlibmopt, -xclic_lib=..., -xprofile=...

Für die folgenden Optionen gilt, daß grundsätzlich alle zugehörigen Quellprogramme mit der betreffenden Option übersetzt und geladen werden müssen:

-autopar, -aligncommon, -dx, -dalign, -dbl, -explicitpar, -f, -misalign, -native, -parallel, -r8, -xarch=..., -xcache=..., -xchip=..., -xF, -xtarget=..., -xtypemap, -ztext

Wenn beim Laden z.B. im f95-Kommando keine Quelltextdateien, sondern nur Objektdateien genannt werden, dann verwendet das System intern nicht den Lader ld, sondern den inkrementellen Lader ild. Das kann in bestimmten Fällen zu Problemen führen. Abhilfe ist leicht möglich durch expliziten Verzicht auf den ild, indem man im f95-Kommando die Option -xildoff angibt.

Programmbibliotheken im RRZN

1. Einige der für Compiler installierten Laufzeitbibliotheken

Library

Name

Options Needed

f77 functions, nonmath

libF77

None

f77 functions, nonmath, multithread safe

libF77_mt

-parallel

f95 support intrinsics

libfsu

None

f95 interface

libfui

None

f95 array intrinsics libraries

libf*ai

None

f95/f77 I/O compatibility library

libf77compat

-lf77compat

Library of Sun math functions

libsunmath

None

POSIX bindings

libFposix

-lFposix

POSIX bindings for extra runtime checking

libFposix_c

-lFposix_c

2. SunSoft Performance Library

Die Performance Library ist eine am RRZN zusätzlich installierte Programmbibliothek mit besonders effizienten Unterprogrammen entsprechend BLAS1, BLAS2, BLAS3, LAPACK, FFTPACK und VFFTPACK.

Routinen der Performance Library werden automatisch geladen zur Durchführung bestimmter Feldoperationen. Sie können die Bibliothek aber auch explizit verwenden.

Zur Verwendung mit dem f95-Compiler ist jetzt eine neue Version der Performance Library verfügbar.

3. NAG Fortran 77 Library (Mark 20)

Folgende Varianten der NAG Fortran 77 Library stehen zur Verfügung:

Achtung:

Bei Verwendung der NAG Fortran 77 Library reicht die Angabe der Bibliothek, beispielsweise für libnag.a die Option -lnag, allein nicht aus, sondern es müssen weitere zwei Optionen und eine weitere Bibliothek angegeben werden:

f95 -dalign -xarch=generic64 xyz.f90 -lnag -lF77

4. Sun Scientific Subroutine Library S3L

S3L ist hauptsächlich für SunMPI-Benutzer gedacht. Die Programmbibliothek erweitert die Funktionalität der Sun Performance Library.

5. NAG Fortran 90 Library fl90

Software-Werkzeuge

Für die Programmentwicklung stehen eine Reihe von Werkzeugen bereit, die zum Teil sogar eine graphische Benutzerschnittstelle haben.

Name/AufrufBeschreibung
analyzer graphical performance analysis tool
asa converts Fortran carriage-control output in printable form
dbx source-level debugger
error insert compiler error messages at right source lines
fsplit split multi-routine Fortran file in individual files
fpp Fortran language preprocessor
gprof display call-graph profile data
prism (nur E10000) a programming environment (also for MPI programs)
tcov construct test coverage analysis and statement-by-statement profile
teamware GUI tool for CodeManager commands
workshop an integrated programming environment (not for MPI programs)

Einige der obigen Tools können nur aus der Programmierumgebung workshop heraus aufgerufen und ausgeführt werden, andere können auch außerhalb oder nur außerhalb als singuläres Werkzeug verwendet werden. Achtung: In diversen man pages muß es statt f90 eigentlich f95 heißen.

Eventuell müssen Sie bei Verwendung von Tools mit graphischer Benutzerschnittstelle den verwendeten Host-Rechner als xhost anmelden.

Probleme

Fehlende Dateiinhalte bei vorzeitigem Programmabbbruch

Wenn Ihr Fortran-Programm vorzeitig wegen eines von der Hardware erkannten Fehlers (z.B. reelle Division durch Null) abgebrochen wird, dann werden die zuletzt erzeugten Ergebnisse u.U. nicht mehr aus den zugehörigen Puffern übertragen. Das hat zur Folge, daß Sie anhand der Ergebnisse oder anhand extra eingefügter Kontrollausdrucke die Abbruchstelle gar nicht lokalisieren können. Dieser Effekt betrifft grundsätzlich alle Ergebnisse, die (aus Sicht der Systemumgebung) in Dateien generiert werden. D.h. folgende Situationen sind betroffen: Nicht betroffen ist also lediglich die Fortran-Standardausgabeeinheit (* oder 6) bei interaktiven Jobs, wobei der zugehörige Unix-Dateideskriptor 1 nicht auf eine Datei umgelenkt wird.

Abhilfe(n):

Leider geht es nicht ohne (kleine) Quelltextänderungen:

    1. Möglichkeit:
    Im Anschluß an jede Ausgabe leere man den Puffer der betr. Datei durch Aufruf der Funktion flush(ae), wobei ae die Nummer der zughörigen Fortran-Ausgabeeinheit ist. Beispiel:
    WRITE(77,FMT=*)xyz; nn = flush(77)
    oder
    PRINT *, xyz; nn = flush(6)

    2. Möglichkeit:
    Falls Sie nicht jede betroffene Ausgabeanweisung ändern wollen, können Sie durch folgende Einfügung dafür sorgen, daß Ihr Programm nach dem Harware-Interrupt die Kontrolle zurückbekommt. Danach können Sie es programmiert beenden, wobei die Puffer wie üblich geleert werden. Beispiel für reelle Division durch Null:

       PROGRAM test
       ...
       CALL aaa ! hier wird die Ueberwachung eingeschaltet
       ...
       END PROGRAM test
       ...
       SUBROUTINE aaa
       EXTERNAL myhandler
       iii = ieee_handler('set', 'division', myhandler)
       END SUBROUTINE aaa
    
       INTEGER FUNCTION myhandler(a,b,c)
       INTEGER a,b,c(5)
       STOP ' Programmende nach Ausnahmebehandlung')
       myhandler = 0
       END FUNCTION myhandler
       
    Im Hauptprogramm wird gleich im Anschluß an den Spezifikationsteil die Subroutine (hier) aaa aufgerufen. (Sie können die beiden Anweisungen aus dem Rumpf der Subroutine natürlich auch direkt in das Hauptprogramm einfügen.)

    Mit dem Aufruf der vordefinierten Funktion ieee_handler wird die Ausnahmebehandlung eingeschaltet. Der zweite Parameter gibt an, was überwacht werden soll. Der dritte Parameter spezifiziert eine Funktion, die im Ausnahmefall die Kontrolle übernimmt.

    Die Überwachung kann programmiert ein- und ausgeschaltet werden. Und man kann auch mehrere Ausnahmesituationen zugleich überwachen lassen. Hinweise dazu finden Sie in den Manual Pages zu f95 bei der Option -ftrap und im "Fortran Programming Guide" im Kapitel 6 "Floating Point Arithmetic".

Probleme beim Laden von Objektdateien

Wenn Sie mit dem f95-Kommando nur Objektdateien linken und laden, kann es zu Problemen kommen. Hinweise dazu am Ende des obigen Abschnitts "Konsistentes Linking".

Debugging

Für die quellprogrammnahe Fehlersuche gibt es folgende Alternativen:

Man beachte, daß die beiden graphischen Programmierumgebungen letztlich lediglich einen anderen Rahmen für den Einsatz des kommandoorientierten dbx darstellen.

Probleme

  1. Wir haben gelegentlich beobachtet, daß die Zeilennummern in Laufzeitfehlermeldungen falsch/unsinnig waren.
  2. Falls Ihr Job lediglich mit der Meldung "Signaled." endet, können Sie der Abbruchursache durch Eingabe des Kommandos "adb core" etwas näher kommen.

Parallelverarbeitung

Nur und nur auf den Domänen/Partitionen e10k und e10kpp der Sun Enterprise 10000 ist Parallelverarbeitung auf den Sun-Rechnern des RRZN sinnvoll. Lesen Sie ggf. mal "news E10Kbetrieb" auf der E10000 nach.

Die anderen Sun-Workstations und die anderen Partitionen der E10000 arbeiten als Mehrbenutzer-Durchsatzrechner. D.h., die Parallelverarbeitung macht dort keinen rechten Sinn.

Hinweis für ehemalige VPP-Anwender: Die Sun-E10000 kann für bestimmte vektorisierbare Anwendungen als Nachfolgerechner der VPP eingesetzt werden. Solch ein SMP-Rechner ist im Hinblick auf eine Reihe von Architekturmerkmalen (aus der Sicht des Programmierers) vielleicht der nächste Verwandte des Vektorrechners; beispielsweise:

  1. Beide Rechnerarchitekturen haben (nicht nur aus der Sicht des Programmierers, sondern auch physikalisch) einen einzigen Adreßraum.
  2. Beide verwenden Zwischenspeicher für den Zugriff auf Daten/Operanden; VPP => Vektorregister, E10000 => Cache.
  3. Bei beiden Rechnern wird das Füllen der lokalen Speicher (d.h. Vektorregister/Cache) per Hardware realisiert.
  4. Bei beiden Rechnern vergeht eine charakteristische Latenzzeit, ehe z.B. bei der Verarbeitung von Feldern das erste Feldelement zur Verarbeitung bereitsteht; danach geht es schneller.
  5. Bei beiden Rechnern ist die Bandbreite der Datenpfade zwischen Hauptspeicher und Prozessor von entscheidender Bedeutung für die Leistungsfähigkeit des Rechners.
  6. Bei beiden Rechnern ist die Datenlokalität, d.h. die Verfügbarkeit der Operanden in den Vektorregistern bzw. Cache von entscheidender Bedeutung für die Effizienz des vektorisierten/parallelisierten Programmes.
  7. Für beide Rechnerarchitekturen (und nur für diese) gibt es Werkzeuge, die (fast) vollautomatisch programminterne Parallelitäten erkennen können und bei der Compilation auf die dafür vorgesehenen Hardware-Strukturen umsetzen können.
  8. Die automatische Vektorisierung/Parallelisierung kann durch Einfügen von Direktiven in den Quelltext unterstützt werden.

Insgesamt ist die Klasse der Anwendungen, die von der parallelen Hardware der E10000 profitieren können, vermutlich größer als die Klasse der für die VPP vektorisierbaren Programme.

MPI

Nur auf der E10000 (Domäne e10k oder e10kpp):

Es gibt eine sehr leistungsfähige MPI-Umgebung. Sie heißt Sun HPC Clustertools. Hauptmerkmale sind folgende:

Compilieren und Linken unter Verwendung des Wrappers mpf90 (s. man mpf90):
mpf90 *.f90

Wenn Sie mal versuchsweise "mpf90 -dryrun -V aaaaa.f90" eingeben, werden Sie sehen, daß tatsächlich der Fortran95-Compiler verwendet wird, und Sie sehen, was sonst noch so für Ihren MPI-Job eingerichtet wird.

Programmausführung mit dem mprun-Kommando (s. man mprun).
Hinweise finden Sie in "news HPC" auf der E10000.

Automatische Parallelisierung

Nur auf der E10000 (Domäne e10k oder e10kpp):

Um ein seriell formuliertes Programm ohne Eingriffe in den Quelltext parallel zu verarbeiten, können Sie es automatisch parallelisieren:

Umgebungsvariable PARALLEL setzen; z.B.
export PARALLEL=16

Compilieren, Parallelisieren und Linken unter Verwendung der Option -parallel; also beispielsweise
f95 -fast -parallel -mp=%none *.f90

Der vom Compiler erzeugte parallele Code kann ggf. durch in den Quelltext eingestreute Direktiven (z.B. OpenMP) verbessert werden.

Explizite Parallelisierung mittels OpenMP

Nur auf der E10000 (Domäne e10k oder e10kpp):

Umgebungsvariable PARALLEL setzen; z.B.
export PARALLEL=16

Compilieren und Linken unter Verwendung der Option -openmp: also beispielsweise
f95 -fast -openmp *.f90
oder
(wenn man die automatische Parallelisierung durch in in Quelltext eingestreute Direktiven unterstützen will)
f95 -fast -parallel -mp=openmp *.f90

Exekutieren wie ein serielles Programm z.B. durch Angabe von a.out

Online-Dokumentation

f95-Kommando Lokal zugreifbare Online-Dokumentation

Die sonstige lokal im RRZN zugreifbare Online-Dokumentation besteht aus HTML-Dokumenten und einigen PDF-Dokumenten. Falls Sie nicht nur einzelne Seiten, sondern komplette Dokumente drucken wollen, sollten Sie die Dokumente in PDF-Form dazu verwenden.

Diese Dokumentation ist z.Zt. nur nach Aufschalten auf einen der Sun-Rechner am RRZN zugreifbar. Dort müssen Sie mittels "netscape &" den Browser starten. Dann finden Sie die in der folgenden Liste angegebene Dokumentation unter file:/opt/SUNWspro/docs/index.html.

Weltweit verfügbare Online-Dokumentation

Falls Sie die obige Dokumentation nicht lokal lesen wollen/können oder wenn Sie zusätzliche Dokumentation benötigen, suchen Sie bitte unter docs.sun.com weiter und klicken dort z.B. die Forte Developer 7 Collection an.

Gedruckte Handbücher


29. Jan 2003        Wilhelm Gehrke         gehrke@rrzn.uni-hannover.de