2.3 Präfixsummen parallel berechnen
Im letzten Teilkapitel haben wir gelernt, wie man das scheinbar inhärent sequentielle
Problem der Binäraddition effizient parallelisiert. Als Rechnermodell haben wir dabei
die uns bereits bekannten Booelschen Schaltkreise gewählt.
Wir werden nun ein ähnliches Problem untersuchen: wir haben ein
Array
Dieses Problem nennt man Präfixsummen parallel berechnen oder kurz parallele Präfixsummen, auf Englisch parallel prefix sum. Der Lösungsansatz ist ganz ähnlich wie für den Binäraddierer. Allerdings wird bei den parallelen Präfixen das zugrunde liegende Problem besser deutlich, und noch dazu dient es als Baustein für viele weitere parallele Algorithmen.
Als Berechnungsmodell nehmen wir wieder Schaltkreise, nun aber nicht Boolesche, sondern arithmetische. Jedes Gate kann nur eine Operation durchführen: Addition zweier natürlicher Zahlen. Auf den Kanten des Schaltkreises fließen auch keine Booleschen Werte sondern natürliche Zahlen (natürlich). Beim Entwurf unseres Schaltkreises gehen wir rekursiv vor:
Sie
Das zusätzliche
wenn
Schaltkreis-Sichtweise und Prozessoren-Sichtweise
So wie vor zwei Kapiteln begründet, betrachte ich jedes Gate als einen
Prozessor, der zu einem bestimmten Zeitpunkt die Bühne betrifft,
genau einen Schritt ausführt (oder besser gesagt:
Übungsaufgabe 2.3.1
Arbeiten Sie die Details aus! Nehmen Sie an, Sie hätten
Hinweis. Jetzt kommt die Schaltkreis-Intuition an ihre Grenzen und wir
müssen
festlegen, wie unsere Prozessoren arbeiten. Nehmen Sie an, die Prozessoren würden auf einen
gemeinsamen Arbeitsspeicher zugreifen (in dessen ersten
- Lade Speicherzellen
und - Berechne die Summe der Inhalte
- Speichere das Ergebnis in Zelle
Abstrahierung
Die rekursive Konstruktion oben ist viel einfacher als unser Gerechne mit den Binärintervallen und Präfixintervallen im letzten Teilkapitel. Ich will daher argumentieren, dass man ein grundlegendes Prinzip herausarbeiten kann, mit dem man parallele Präfixsummen und binäre Addition gleichzeitig erschlagen kann. Hierfür müssen wir abstrahieren.
Sei
gilt. In diesem Falle dürfen wir ohne Verwechslungsgefahr
berechnen. Dies effizient parallel zu berechnen nennt man paralleles Berechnen von Präfixen,
kurz parallele Präfixe, Englisch parallel prefix.
Wir nehmen an, dass ein Prozessor das Produkt
Können wir die Binäraddition mit Carry-Lookahead in dieses Framework pressen?
Hierfür beobachten wir, dass
Übungsaufgabe 2.3.2
Zeigen Sie, dass
Sie führen nun die obige Konstruktion für parallele Präfixsummen durch, ersetzen nun aber
Übungsaufgabe 2.3.3
Sie haben ein Array aus
Sie wollen für jeden Index
Lengths = [3,3,3,2,2,1,1,3,3,3] BlockIndex = [1,1,1,2,2,3,4,5,5,5]
berechnen. Zeigen Sie, wie das mit
Übungsaufgabe 2.3.4 (Bestes Subinterval). Sie haben ein Array aus ganzen Zahlen gegeben, z.B.
A = [-8, 5, -4, 7, -9, 3, 0, 7, -5, 8, -1, 2, -5, 2, 9, -3]
Ein Subarray ist ein Array der Form A[i...j]. Der Wert eines Subarrays ist die Summe seiner Elemente. Sie wollen das Subarray mit dem höchsten Wert finden:
in diesem Falle also wohl [3, 0, 7, -5, 8, -1, 2, -5, 2, 9] mit dem Wert 20.
Entwerfen Sie einen sequentiellen Algorithmus, der den Wert des optimalen Subarrays
in
Lösung
Irgendjemand hat uns gesagt, dass das mit Dynamic Programming geht. Wir müssen also Teilprobleme definieren. Sei
Die Lösung ist, zwei Werte zu speichern:
in
Jetzt müssen Sie sich nur noch überlegen, wie Sie diese beiden Werte für
Übungsaufgabe 2.3.5
Zeigen Sie, wie man das Problem aus der letzten Übungsaufgabe effizient parallel
berechnen kann! Erfinden Sie nicht das Rad neu sondern formulieren Sie das als
Parallelpräfixproblem mit einer passenden Verknüpfung
Übungsaufgabe 2.3.6 (Reguläre Sprachen und parallele Berechnung). Erinnern Sie sich an reguläre Sprachen, die wir in Theoretische Informatik II, Kapitel 4 kennengelernt haben. Dort haben wir auch gesehen, dass jede reguläre Sprache durch einen endlichen Automaten entschieden werden kann. Hier ein Beispiel für einen endlichen Automaten:
Geben Sie einne effizienten parallelen Algorithmus für das Wortproblem
in regulären Sprachen! Also einen Algorithmus, der, gegeben ein
Eingabewort