-
Parallelisierung von Schleifen:
Erzeugen von N Threads (``spawn'')
Blockweises Aufteilen des Indexbereichs
Paralleles Berechnen des Schleifeninneren
Beenden der Threads bis auf einen (``join'')
DO I=1, 1024
A(I) = B(I) + C(I)
ENDDO
-
funktioniert für äußere Schleifen, falls:
Iteration-Count zur Laufzeit bekannt
keine ``Hindernisse'' (s.u.)
-
implizite Loops in Fortran 90 explizite Loops
-
Anzahl der Threads:
#CPUs im Subcomplex
PREFER_PARALLEL(max_threads=N) o.ä.
mpa -min N -max M
-
Erzeugung der Threads:
schon beim Programmstart
erst spin-wait, dann suspended
spawn: Übergang von ``idle'' nach ``running''
join: Übergang von ``running'' nach ``idle''
-
Zusammenwirken von -O2 und -O3:
Reihenfolge der Schleifen ändert sich
Blockbildung bessere Cachenutzung
hyperlinearer Speedup möglich
-
! -O3 gezielt einsetzen, nicht global !
Peter Junglas
12/23/1998