next up previous contents
Next: Erfahrungen mit dem CONVEX Up: Zentrale Systeme Previous: Message-Passing-Programmierung

Erfahrungen mit dem CONVEX Performance Analyzer CXpa

CXpa ist ein Tool, mit dem man sich für Fortran- und C-Programme genau anschauen kann, in welchen Unterprogrammen bzw. Schleifen eigentlich die ganze Rechenzeit verbraucht wird. Ich selbst habe das Tool zur Analyse eines Fortran-Simulationsprogramms verwendet.

Ich bin wirklich begeistert von diesem Tool, denn es ist extrem einfach zu bedienen, und über die Ergebnisse für mein Programm war ich sehr überrascht.

Die Handhabung erfolgt durch Übersetzen aller Quelldateien mit der zusätzlichen Compileroption -cxpa , anschließend wird das Programm mit cxpa Programmname gestartet. Man erhält unter XWindows ein Menu, bei dem man allerdings für's erste Mal die Einstellungen alle so lassen kann, wie die defaults gesetzt sind. Ich habe als einziges unter Subcomplex Selection von System auf Batch gewechselt.

Um das Ergebnis zu erläutern, kurz etwas zu meinem Programm: Es handelt sich um die Finite-Elemente-Diskretisierung eines Systems von 3 partiellen Differentialgleichungen, und mir war klar, welche der 3 Gleichungen am aufwendigsten zu lösen sei. Dabei habe ich aber nie darüber nachgedacht, in welchem Teil-Lösungsschritt denn eigentlich die meiste Rechenzeit verbraucht wird. Hierzu nun ein Beispiel aus den Ergebnissen, die das Programm cxpa zur Verfügung stellt:

Im Unterpunkt ALL wird angezeigt, wie häufig die einzelnen Unterprogramme aufgerufen wurden:

Call Counts

Times Exec PS Routine Name
13257516 val_p2
3976263 gauss_k
1889817 k_c
1004448 inv_a
740880 lpath
...

Hier stellt sich also auf einmal heraus, daß die meisten Aufrufe für die Unterprogramme val_p2 und gauss_k erfolgen. Dabei wird in val_p2 zu gegebenem x-Wert der Funktionswert p(x) eines Polynoms 2. Grades (mit für die gesamte Rechnung konstanten Koeffizienten) berechnet, und gauss_k ist ein Unterprogramm, das Lineare Gleichungssysteme bis maximal 10x10 mit dem Gauß'schen Eliminationsverfahren löst.

Schaut man sich nun im Unterpunkt CPU time die benötigte Rechenzeit an, so ergibt sich

(less children) (plus children)
CPU Time % CPU Time % PS Routine Name
124.125 32.2% 124.125 32.2% gauss_k
91.801 23.8% 317.667 82.5% c_o2
56.067 14.6% 56.067 14.6% val_p2
33.026 8.6% 92.061 23.9% k_c
22.647 5.9 % 69.172 18.0% lpath
...

Fast ein Drittel meiner gesamten Rechenzeit wird also bei der Lösung der Gleichungssysteme verbraucht, weil dieses Unterprogramm so häufig aufgerufen wird (s.o.). Hier stellte sich als weiteres Problem heraus, daß der Compiler versucht, für gauss_k einen Code zu erzeugen, der bei großen Systemen optimal schnell auf den Prozessoren läuft -- ich brauch's aber immer nur zur Lösung von 3x3-Gleichungssystemen.

Für mich lag daher der Gedanke nahe, das Unterprogramm gauss_k durch ein Programm zu ersetzen, das optimal die ständig wieder auftauchenden 3x3- Gleichungssysteme lösen kann. Hier war zusätzlich vorteilhaft, daß diese Systeme noch eine bestimmte Struktur besitzen, die ich nun ausgenutzt habe.

Entsprechend verbessert ergibt sich für mein Programm die folgende Tabelle:

(less children)(plus children)
CPU Time % CPU Time % PS Routine Name
92.665 32.8% 217.163 76.8% c_o2
56.581 20.0% 56.581 20.0% val_p2
33.299 11.8% 42.524 15.0% k_c
22.850 8.1% 33.968 12.0% lpath
19.349 6.8% 19.349 6.8% gauss_k\ ...

Der Rechenzeitanteil von gauss_k ist also von 32.2% auf 6.8% gefallen. Um diese Werte interpretieren zu können, braucht man natürlich noch die gesamte CPU-Zeit, sie beträgt

vorher: CPU Time: 385.097 secs
nachher: CPU Time: 282.694 secs

Für die Rechnung mit der Anzahl der Unbekannten, die in meinem Simulationsprogramm notwendig ist, um brauchbare Ergebnisse zu erhalten, hat allein der Austausch dieser einen Routine eine Verringerung der notwendigen CPU-Zeit von ca. 30 min. auf ca. 20 min. gebracht.

Aus der Auswertung des Programms mit cxpa ergeben sich weitere Ansatzpunkte für Verbesserungen. Beispielsweise wird das Unterprogramm val_p2 an verschiedenen Stellen im Programm für die gleichen x-Werte aufgerufen, und man könnte sich überlegen, die Funktionswerte für die häufig auftretenden x-Werte vorab einmalig zu berechnen und in einem Vektor/Array abzuspeichern.

Ich habe jedoch bisher keine weiteren Verbesserungen an dem Programm vorgenommen, weil keine der sinnvollen Alternativen so schnell zu realisieren ist wie der Austausch des Gleichungssystemlösers es war.

Fazit:
Das cxpa-Tool ist aufgrund der einfachen Handhabung und der ausführlichen Auswertungstabellen aus meiner Sicht dringend zu empfehlen.

Daß man beim Benutzen der Optimierungs-Optionen der Compiler sorgfältig vorgehen muß, zeigt der nachfolgende Bericht von Stefan Artlich (Verfahrenstechnik I) und Peter Junglas (Rechenzentrum):


next up previous contents
Next: Erfahrungen mit dem CONVEX Up: Zentrale Systeme Previous: Message-Passing-Programmierung

rztms 26.2.96