2.5 Maschinenmodell für parallele Algorithmen: die PRAM
Um möglichst nahe an unserer Schaltkreis-Metapher zu bleiben, stellen wir uns eine beliebig große Menge an Prozessoren vor, die jeweils den selben Code ausführen. Sie greifen dabei auf einen gemeinsamen Speicher zu. Dieser Code hat folgende Form:
- Perform a constant number of elementary operations, such as:
- Use simple operations on
and to compute some address . - Load cell
of the shared memory into the processor's local register. - Compute some data
and another address by simple calculations. - Store
in cell .
- Use simple operations on
Gates verschiedener Typen (AND, OR, XOR) können Sie leicht simulieren: der Prozessor
kann ein dem Index
Ein Aufruf von
- Berechne die Anzahl
der benötigten Zeitschritte :- Sei
die Menge der Prozessoren (genauer: ihrer Indizes), die in Schritt gebraucht werden. - Rufe
für jedes parallel auf.
- Sei
Des weiteren vertrauen wir darauf, dass die Berechnung von
Definition 2.5.1 (Arbeit und Zeit). Die Anzahl der Arbeitsschritte oder einfach die Arbeit eines Algorithmus ist
also die Gesamtzahl der Prozessorenaufrufe. Die Anzahl der Zeitschritte oder einfach
die Zeit eines parallelen Algorithmus ist
Wir heben folgende Punkte hervor:
-
Der Scheduler greift nie direkt auf den Speicher zu. Er kennt nur die Größe
des Inputs. -
Wir gehen davon aus, dass die Schleife (Schritte 2, 2.1 und 2.2 von Scheduler)
synchronisiert ist:
der Durchlauf für
beginnt erst, wenn alle Prozessoren den von beendet haben. Innerhalb eines Durchlaufs (also innerhalb eines Zeitschrittes, in welchem die Prozessoren konstant viele Anweisungen durchführen), gehen wir nicht von Synchronisation aus. - Letzterer Punkt zeigt die Gefahr von Schreib-Lese-Konflikten auf. Daher definieren wir:
Definition 2.5.2 (Concurrent Read, Exclusive Write
PRAM, kurz CREW PRAM). Ein paralleler Algorithmus für eine CREW PRAM muss
folgende
Bedingung erfüllen: wenn ein Prozessor in einem Schritt
Übungsaufgabe 2.5.1 Hier sehen Sie noch einmal den Code von pointerJump
Der Scheduler für Pointer Jumping ist einfach: es werden einfach in jedem Zeitschritt
alle Prozessoren
Beobachtung 2.5.3 Der parallele Algorithmus
Pointer Jumping läuft in
Übungsaufgabe 2.5.2
Schreiben Sie den Code von
Übungsaufgabe 2.5.3
Schreiben Sie den Schaltkreis für Präfixsummen in einem Array (also die Konstruktion aus
Kapitel 2.3) als Code für eine CREW PRAM, also mit
Code für
Tip. Numerieren Sie Ihre Gates durch und nehmen Sie sich für jedes Gate einen neuen Prozessor.
Brent's Principle
Obiges Modell nimmt eine unbegrenzte Anzahl von Prozessoren an. Insbesondere eine,
die mit der Größe der Inputinstanz wächst.
Was aber, wenn uns nur eine begrenzte Anzahl
Brent's Principle. Sei
Begründung.
Für jeden Zeitschritt
Zeitschritte. Formal können wir Algorithmus
- Berechne die Anzahl
der benötigten Zeitschritte von Algorithmus :- Sei
die Menge der Prozessoren (genauer: ihrer Indizes), die der Algorithmus in Schritt braucht. -
# so viele Schritte muss also ein -Prozessor ausführen, damit wir einen -Schritt simulieren können -
Zerlege
, so dass für jedes gilt. // Die Menge ist die Menge der Schritte, die ein -Prozessor nun sequentiell aber in beliebiger Reihenfolge erledigen soll :- Rufe
für jedes parallel auf.
- Rufe
- Sei
P'(
-
das -te Element in -
Rufe
auf
Wieder geht der Code mit einigem an Vertrauen einher: dass wir in Schritt 2 von P'
den Index