Information Technology Reference
In-Depth Information
1.) Bei einem Lesezugriff auf einen leeren Ringpuffer, der die Ergebnisse einer zu
diesem Zeitpunkt aktiven Funktionseinheit entgegennimmt, kommt es zur Ver-
zögerung des Befehls, bis das in Bearbeitung befindliche Ergebnis verfügbar ist.
2.) Falls lesend auf einen leeren Ringpuffer zugegriffen wird, der die Ergebnisse
einer zu diesem Zeitpunkt nicht aktiven Funktionseinheit entgegennimmt, weist
dies auf einen Fehler im Programm hin, der sich z.B. durch eine Ausnahmean-
forderung (exception) signalisieren lässt.
3.) Soll schließlich ein Ergebnis in einen vollen Ringpuffer eingetragen werden,
weist dies ebenfalls auf einen Fehler des Programms hin, der durch eine Aus-
nahmeanforderung quittierbar ist.
Beispiel 3.4. Skalarprodukt ohne Verkettung . Die Programmierung eines Prozessors mit kontroll-
flussgesteuertem Datenfluss, der zwei ALUs, eine Multiplikationseinheit, eine Speicherzugriffsein-
heit MEM (memory unit), einen Registerspeicher und eine Sprungverarbeitungseinheit BPU
(branch processing unit) besitzt, im übrigen jedoch entsprechend Bild 3.29 realisiert ist, wird im
Folgenden am Beispiel des Skalarprodukts zweier 100-elementiger Vektoren beschrieben. Der
Algorithmus ist Bild 3.30b als Assemblerprogramm und in Bild 3.30a zu Vergleichszwecken als C-
Programm dargestellt.
Zunächst werden in Zeile 1 des Assemblerprogramms durch parallele Transportoperationen die
Ausgänge der beiden ALUs mit Null initialisiert. Sie repräsentieren innerhalb der Schleife das
Akkumulationsergebnis sum (alu1) und den Schleifenzähler i (alu2). Die in Zeile 2 stehende erste
Zuweisung beschreibt tatsächlich zwei Transportoperationen, mit denen die Konstante x (aus dem
Register-Konstanten-Speicher Reg / Const) und der in alu2 befindliche Wert zur Speichereinheit
MEM transportiert und auf diese Weise ein Lesezugriff auf den Datenspeicher initiiert wird (der
Einfachheit halber sei angenommen, dass mit dem Zugriff eine Skalierung des Indexes entspre-
chend des verwendeten Formats erfolgt). Der hinter alu2 angegebene Stern bewirkt dabei, dass der
Operand nicht aus dem der Quelle zugeordneten Ringpuffer entfernt wird und somit für weitere
Zugriffe verfügbar bleibt.
1: sum = 0;
2: for (i = 0; i < 100; i++)
3:
1:
alu1 = 0
alu2 = 0 ;
2: loop: ld = (x, alu2*)
bne = (-, 99, loop) ;
sum = sum + x[i] * y[i];
3:
ld = (y, alu2)
add2 = (alu2, 1)
4:
mul1.l = ld
bne.l = alu2 ;
5:
mul1.r = ld
add1.l = alu1;
6:
add1.r = mul1 ;
7:
r0 = alu1
alu2 ;
a
b
Bild 3.30. Skalarprodukt zweier Vektoren. a Als C-Programm. b Als Assemblerprogramm für
einen Prozessor mit kontrollflussgesteuertem Datenfluss
Die Zuweisung an die Sprungeinheit in Zeile 2 ist zunächst noch unvollständig, weshalb es zwar
zur Übertragung der Operanden kommt, die Ausführung der Operation jedoch nicht startet. Dies ist
hier deshalb erforderlich, weil pro Befehl maximal sechs Transportoperationen codierbar sind und
diese Anzahl in Zeile 3, in der die Sprungoperation regulär begonnen werden muss, bereits erreicht
ist. In Zeile 3 wird der Zugriff auf y[i] gestartet, der in alu2 gehaltene Schleifenzähler zur Inkre-
mentierung an alu2 übertragen, der erste bereits aus dem Datenspeicher gelesene Wert x[i] zum lin-
ken Eingang der Multiplikationseinheit transportiert und die Sprungoperation begonnen. Außerdem
wird der in alu2 gespeicherte Schleifenzählwert konsumiert.
 
Search WWH ::




Custom Search