Speicherbank-Konflikte
Bei vielen Programmen ist die Geschwindigkeit, mit der auf den Speicher
zugegriffen werden kann, ein limitierender Faktor. Ein wichtiges Problem
dabei sind die sogenannten ''Bank-Konflikte'': Die Speicherzellen sind in
Gruppen eingeteilt, ''Bänke'' genannt, wobei schnell aufeinanderfolgende
Zugriffe auf Speicherzellen innerhalb einer Bank wesentlich langsamer sind
als zwischen verschiedenen Bänken. Ein Ziel muß es also sein, solche
Zugriffe zu vermeiden. Ohne hier auf weitere Einzelheiten einzugehen (s.
Abschnitt 4.3.4), kann man als Faustregel festhalten, daß man bei der
Deklaration von Arrays ungerade Dimensionen verwenden sollte. Damit
verschenkt man zwar etwas Speicherplatz, gewinnt aber bei manchen Problemen
einiges an Geschwindigkeit.
Im Programm linalg, Version 2.2, wurde der Parameter NMAX in main.f,
gaussj.f und ludcmp.f von 100 auf 101 gesetzt und damit die
Speicher-Struktur der verwendeten Arrays geändert. Mit den
Profiling-Methoden aus Abschnitt 2.8 und Optimierungsstufe O2
ergeben sich folgende Ergebnisse:
Routine |
CPU-Zeit |
CPU-Zeit |
. | Zeitersparnis |
. | |
|
NMAX=100 |
NMAX=101 |
. | [%] |
. | |
|
|
. | |
setmat |
0 |
. | 889m |
0 |
. | 880m |
1 |
. | 0 |
ernorm |
1 |
. | 388m |
1 |
. | 368m |
1 |
. | 5 |
testmt |
0 |
. | 133 |
0 |
. | 115 |
15 |
. | 7 |
setvec |
0 |
. | 016m |
0 |
. | 016m |
0 |
. | 0 |
luinv |
0 |
. | 769m |
0 |
. | 740m |
3 |
. | 9 |
lubksb |
0 |
. | 079 |
0 |
. | 073 |
8 |
. | 2 |
ludcmp |
0 |
. | 048 |
0 |
. | 045 |
6 |
. | 7 |
gaussj |
0 |
. | 442 |
0 |
. | 414 |
6 |
. | 8 |
getmat |
0 |
. | 028 |
0 |
. | 027 |
3 |
. | 7 |
getvec |
0 |
. | 273m |
0 |
. | 274m |
-0 |
. | 4 |
total(main) |
0 |
. | 772 |
0 |
. | 716 |
7 |
. | 8 |
Peter Junglas 18.10.1993