TU Chemnitz, Fakultät für Mathematik, 09107 Chemnitz
Copyright © 2024 by TU Chemnitz. Alle Rechte vorbehalten.
https://www-user.tu-chemnitz.de/~pester/Lehre/LV/fortran/uebung.php?nr=11 - 18. Mai 2024 11:36
Ausgabe von Daten in eine Datei
( als PDF-Datei )
- Mit einem Rahmenprogramm soll eine Tabelle produziert werden, mit der
die Rechenleistung
der verschiedenen Unterprogramme für Vektoroperationen in Abhängigkeit von der Länge der verarbeiteten Vektoren gegenübergestellt wird. Eine Tabellenzeile sollte z.B. enthalten:Mflops={Anzahl der Operationen}·10-6 / {gemessene Zeit} - die Vektorlänge N
- die Zahl der Mflop/s für SCAPR
- die Zahl der Mflop/s für VSAXPY
- die Zahl der Mflop/s für ENORM ||x||= sqrt{sum( xi2)}
- (evtl. weitere drei Spalten für double precision)
- Die Vektorlänge N sollte zwischen 100 und 100 000 variieren.
(z.B. 100,500,1000,5000,10000,15000,20000,30000,50000,...)
Die Anzahl der Wiederholungen eines Unterprogrammaufrufs (zum Zweck der Zeitmessung) ist sinnvollerweise von N abhängig zu wählen, so dass bei jedem N etwa die gleiche Anzahl Operationen in die Zeitmessung eingeht.
Die Ausgabe in eine Datei kann zunächst ohne spezielle Formatierung erfolgen, indem eine (fast) beliebige Dateinummer (nr > 7) und das Standard-Ausgabeformat (*) verwendet wird:nr = 9 ... write (nr,*) N,(mflop(k),k=1,6) ! schreibt eine Tabellenzeile ...
Dies erzeugt (unter Linux) eine Datei 'fort.9'.
- Die einfachste Variante, den Dateinamen selbst zu bestimmen:
nr = 9 OPEN(nr,FILE='dateiname') ... ... ... CLOSE(nr) ! nach Ausgabe der letzten Zeile ...
Die CLOSE-Anweisung ist nicht notwendig, aber zu empfehlen. - Zur grafischen Auswertung der Ergebnisse ist gnuplot gut geeignet.
Das Programm wird (unabhängig vom Fortran-Programm) von der Kommandozeile gestartet und zeigt nach
Eingabe folgender Kommandos die Daten der in der Datei gespeicherten Tabelle grafisch an:
set data style lines set grid set title "Rechenleistung" plot \ "dateiname" using 1:2 title "scapr", \ "dateiname" using 1:3 title "vsaxpy", \ "dateiname" using 1:4 title "enorm", \ "dateiname" using 1:5 title "dscapr", \ "dateiname" using 1:6 title "vdaxpy", \ "dateiname" using 1:7 title "dnorm"
Das Zeichen "\" am Zeilenende bedeutet, dass das Kommando auf der Folgezeile fortgesetzt wird. Sonst muss das gesamte plot-Kommando in einer Zeile stehen.Werden diese Kommandos in eine Datei plotcmd geschrieben, so hat man bei gnuplot nur noch einzugeben:
load "plotcmd"
- Als weitere Vergleichsmöglichkeit bietet sich an, die
Unterprogramme mit unterschiedlichen Compileroptionen zu
übersetzen. Man teste z.B. (durch entsprechende Definition der Variablen FFLAGS=...
im Makefile)
gfortran -g ... gfortran -O2 ... gfortran -O3 ... gfortran -ffast-math -fexpensive-optimizations ... gfortran -funroll-all-loops -fomit-frame-pointer ...
- Komfortablere Arbeit mit Dateien:
Der Hauptname filename der zu schreibenden Dateien soll vom Nutzer eingegeben werden können. Mit Hilfe von Zeichenkettenoperationen sollen aus diesem Wortstamm zwei Dateinamen erzeugt werden, denn das Programm soll unter dem Namen filename.dat eine Datei mit der Rechenzeittabelle und unter filename.plot eine Datei mit den dazugehörigen Gnuplot-Kommandos schreiben.
Wenn eine der beiden Dateien schon vorhanden ist (mit INQUIRE festzustellen), soll eine Warnung erscheinen, woraufhin der Nutzer zu entscheiden hat, ob die Datei überschrieben wird oder ein anderer Name eingegeben werden soll.Bitte beachten, dass Zeichenkettenvariable am Ende mit Leerzeichen aufgefüllt sind. Es ist nicht zu empfehlen, durch Verkettung von Zeichenketten Dateinamen der Art 'name .dat' zu produzieren. (Funktion LEN_TRIM(...) benutzen)
Verwendung von INQUIRE:
CHARACTER*20 filename LOGICAL exists INTEGER nr ... filename=... nr=... INQUIRE (FILE=filename,EXIST=exists) IF (exists) THEN write(*,*) 'schon vorhanden ...' ... ELSE OPEN(nr,FILE=filename) ENDIF ...
File translated from TEX by TTH, version 3.08.