next up previous
Nächste Seite: 1.3.5 Lokaler Datenaustausch Aufwärts: 1.3 Die Praktikumsaufgaben Vorherige Seite: 1.3.3 Blockierende Kommunikation

1.3.4 Globale Operationen

Der Double-Precision-Vektor $ \underline{x}$ sei blockweise disjunkt verteilt, d.h., verteilt über alle Prozesse s ( s = $ \overline{0,P-1}$), daß $ \underline{x}$ = ($ \underline{x}_{0}^{T}$,...,$ \underline{x}_{s}^{T}$)T gilt.
\fbox {{\large E9}}
Schreibe eine Funktion

DebugD(nin,xin,icomm)

welche nin Double-Precision-Zahlen des Vektors  xin auf dem Bildschirm ausgibt. Starte das Programm mit mehreren Prozessen.
$ \Longrightarrow$ Alle Prozesse schreiben durcheinander ihre lokalen Vektoren aus, d.h., eine Fehlersuche wird sehr erschwert.

Verbessere die Funktion  DebugD derart, daß Prozeß 0 vom Terminal die Nummer des Prozesses einliest, welcher Daten ausgeben soll. Nutze

MPI_Bcast

um diese Information allen Prozessen mitzuteilen, sodaß diese entsprechend reagieren können. Evtl. muß MPI_Barrier benutzt werde, um die Ausgabe zu synchronisieren.
\fbox {{\large E10}}
Vertausche das globale Minimum und Maximum des Vektors  $ \underline{x}$ !
Benutze hierbei die Funktionen

MPI_Gather, MPI_Scatter/ MPI_Bcast and ExchangeD.

Wie kann man den Kommunikationsaufwand reduzieren?

Hinweis : Berechne zuerst die lokalen Minima und Maxima und laß danach einen Prozeß die globalen Größen bestimmen.

Man kann alternativ auch gleich die Funktion MPI_Allreduce mit den Operationen MPI_Minloc/ MPI_Maxloc benutzen.
\fbox {{\large E11}}
Schreibe eine Funktion, welches das globale Skalarprodukt

Skalar(n,x,y,icomm)

zweier Double-Precision-Vektoren x und y der lokalen Länge n berechnet. Benutze

MPI_Allreduce mit der Operation MPI_SUM.


next up previous
Nächste Seite: 1.3.5 Lokaler Datenaustausch Aufwärts: 1.3 Die Praktikumsaufgaben Vorherige Seite: 1.3.3 Blockierende Kommunikation
Gundolf Haase
1999-10-04