Store-and-Forward im Ring. | |
Gestrichelte Kanten sind mit dem jeweiligen Zeitschritt beschriftet. |
Die Zeit beträgt
Tone - to - all = (ts + th + tw · m) ·
Im 2-dimensionalen Gitter wird zunächst eine Zeile als Ring mit der Nachricht versorgt, danach werden alle Spalten gleichzeitig wie Ringe versorgt.
Da eine Zeile bzw. Spalte Prozessoren aufweist, beträgt die Zeit
Tone - to - all = 2 · (ts + th + tw · m) ·
Für ein dreidimensionales Gitter ergibt sichTone - to - all = 3 · (ts + th + tw · m) ·
Im Hypercube sendet nacheinander für
jede Dimension
d - 1,d - 2,...,0 der Prozessor
mit d -tem Bit = 0 an den Prozessor mit
d -tem Bit = 1 .
Dabei sind nur solche Prozessoren aktiv,
bis zu denen die Nachricht schon vorgedrungen ist.
procedure ONE_TO_ALL_BC(d, my_id, X) /* Broadcast X from 0 to all */
mask := 2d - 1;
/* Set lower d bits of mask to 1 */
for i := d - 1 downto 0 do
/* Outer loop */
mask := mask XOR 2i;
/* Set bit i of mask 0 */
if (my_id AND mask) = 0 then
/* if the lower i bits of my_id are 0 */
if (my_id AND 2i) = 0 then
msg_destination := my_id XOR 2i;
send X to msg_destination;
else
msg_source := my_id XOR 2i;
receive X from msg_source;
end
end
end
Die Gesamtdauer beträgt
Tone - to - all = (ts + th + tw · m) · log p
In abgewandelter Form kann die Prozedur ONE_TO_ALL_BC auch zum Einsammeln von Nachrichten verwendet werden. Es sendet nacheinander für Dimension d - 1,d - 2,...,0 der Prozessor mit d -tem Bit = 0 an den Prozessor mit d -tem Bit = 1 , wo anschließend die Verknüpfung stattfindet. Dabei werden solche Prozessoren passiv, die ihren Beitrag bereits abgeschickt haben.