Rechnerstrukturen WS 2012/13

Werbung
Rechnerstrukturen WS 2012/13
◮
Boolesche Funktionen und Schaltnetze
◮ Rechner-Arithmetik
◮ Addition (Wiederholung)
◮
Multiplikation
◮
Subtraktion
◮
Gleitkommazahlen-Arithmetik
◮ Wallace-Tree
◮ Addition negativer Zahlen
◮ Multiplikation von Gleitkommazahlen
◮ Addition von Gleitkommazahlen
Hinweis: Folien teilweise a. d. Basis von Materialien von Thomas Jansen
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
29. Oktober 2012
1
Addition von Binärzahlen
Beobachtungen zu den Überträgen
◮ 1 + 1“ erzeugt einen Übertrag
”
◮ 0 + 0“ eliminiert einen vorhandenen Übertrag
”
◮ 0 + 1“ und 1 + 0“ reichen einen vorhandenen Übertrag weiter
”
”
◮ Übertrag ist höchstens 1
Kann man Addition als boolesche Funktion ausdrücken?
x y c s
0 0 0 0
fHA : {0, 1}2 → {0, 1}2 mit 0 1 0 1
1 0 0 1
1 1 1 0
realisiert Addition mit Summenbit s und Übertrag c (Carry)
Beobachtung
Fink
Rechnerstrukturen
c =x ∧y
s =x ⊕y
¶·º»
Boole. Fkt.
2
Halbaddierer
c = x ∧y
x
y
s =x ⊕y
=1
s
&
c
Größe 2
Tiefe 1
x
0
2
2
Drückt fHA : {0, 1} → {0, 1} mit 0
1
1
wirklich Addition aus?
Beobachtung: Nur für isolierte Ziffern,
Fink
Rechnerstrukturen
¶·º»
y
0
1
0
1
c
0
0
0
1
s
0
1
1
0
vorheriger Übertrag fehlt!
Boole. Fkt.
3
Realisierung von Addition als boolesche Funktion
calt x y
0
0 0
0
0 1
0
1 0
3
2
fVA : {0, 1} → {0, 1} mit 0
1 1
1
0 0
1
0 1
1
1 0
1
1 1
realisiert Addition mit Summenbit s und
Beobachtung
c s
0 0
0 1
0 1
1 0
0 1
1 0
1 0
1 1
Übertrag c (Carry)
s = 1 ⇔ Anzahl der Einsen ungerade
s = calt ⊕ x ⊕ y
Beobachtung
c = 1 ⇔ Anzahl Einsen ≥ 2
direkte Realisierung c = x y ∨ x calt ∨ y calt
für Realisierung im Schaltnetz
Fink aber
¶ · º » Boole. Fkt.
Rechnerstrukturen
4
Schaltnetz Volladdierer
s = x ⊕ y ⊕ calt
c = calt (x ⊕ y ) ∨ x y
x
y
calt
=1
s
=1
&
≥1
c
&
Größe 5, Tiefe 3
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
5
Realisierung Addition
x0
y0
x1
y1
x2
y2
..
.
s0
s1
HA
VA1
s2
VA2
..
.
···
..
.
sn−1
···
xn−1
yn−1
..
.
VAn−1
sn
Größe 2 + (n − 1) · 5 = 5n − 3
Tiefe 1 + (n − 1) · 3 = 3n − 2
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
6
Ergebnis: Ripple-Carry Addierer
Realisierung Addition von natürlichen Zahlen“
”
◮ sehr gut strukturiert
◮
Größe 5n − 3
← sehr klein
◮
Tiefe 3n − 2
← viel zu tief
Warum ist unser Schaltnetz so tief?
offensichtlich
Überträge brauchen sehr lange
Verbesserungsidee Überträge früher berechnen
Erinnerung
Struktureinsicht
(xi , yi ) = (1, 1)
(xi , yi ) = (0, 0)
(xi , yi ) ∈ {(0, 1), (1, 0)}
Fink
Rechnerstrukturen
generiert Übertrag
eliminiert Übertrag
reicht Übertrag weiter
¶·º»
Boole. Fkt.
7
Multiplikation
direkt mit Binärzahlen. . .
1
0
1
1
0
1
also
0
1
0
0
1
1
0
1
1
1
0
1
0
1
0
0
·
1
1
1
0
1
1
0
1
0
1
1
0
0
0
1
0
1
0
0
1
1
1
1
1
0
1
1
0
0
1
0
0
0
1
1
0
0
0
0
0
Multiplizieren heißt
◮
Nullen passend schreiben
◮
Zahlen passend verschoben kopieren
◮
viele Zahlen addieren
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
8
Multiplikation als Schaltnetz
Multiplikation ist
◮
Nullen passend schreiben
◮
Zahlen passend verschoben kopieren
◮
viele Zahlen addieren
klar
Nullen schreiben einfach und kostenlos,
Zahlen verschieben und kopieren einfach und kostenlos,
viele Zahlen addieren nicht ganz so einfach
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
9
Addition vieler Zahlen
klar
Wir haben Addierer für die Addition zweier Zahlen.
Wie addieren wir damit n Zahlen?
erster Ansatz
einfach nacheinander
m1 m2 m3 m4 m5 · · · mn
Tiefe (n − 1) · Tiefe(+) Schrecklich!
+
klar
sehr naiv
+
merken
+
in Schaltnetzen niemals
alles nacheinander
+
Was geht gleichzeitig?
Fink
Rechnerstrukturen
..
. +
¶·º»
Boole. Fkt.
10
Addition von n Zahlen
besserer Ansatz
paarweise addieren
m1 m2 m3 m4 m5 m6 m7 m8
+
+
+
+
+
+
+
Anzahl Addierer = n2 + n4 + · · · 1 ≈ n
Gesamtgröße ≈ n · Größe(+)
Tiefe
also
auf i -ter Ebene
2log2 (n)−i Addierer
≈ log2 (n) Ebenen
Gesamttiefe
≈ log2 (n) · 2 log2 (n) = 2 log2 (n)2
Geht es vielleicht noch schneller?
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
11
Addition von n Zahlen noch schneller
(triviale) Beobachtung
zentral für uns
◮ gleiche Summe
◮ weniger Zahlen
(verrückte?) Idee
klar
aber
Addition ersetzt zwei Zahlen
durch eine Zahl gleicher Summe
Korrektheit
Fortschritt“
”
Vielleicht ist es einfacher,
drei Zahlen zu ersetzen durch
zwei Zahlen gleicher Summe?
immer noch gleiche Summe
Korrektheit
”
3
2“ statt 2
1“
”
”
weniger Fortschritt Ist das schlimm?
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
12
Wallace-Tree
m1
m2
m3
m4
CSA
m5
m6
m7
CSA
CSA
CSA
m9
m10
m11
m12
CSA
CSA
CSA
Carry Save Adder
(≈ log3/2 (n) Ebenen)
klar nur sinnvoll, wenn CSA
viel flacher als Addierer
Fink
Rechnerstrukturen
m8
CSA
CSA
CSA
+ Boole. Fkt.
¶·º»
13
Carry Save Adder
gesucht
Zahlen a, b mit a + b = x + y + z
Beobachtung
für x, y , z ∈ {0, 1} schon bekannt
x + y + z = 2 · u + v (Volladdierer)
Beobachtung
Es genügt, das parallel
für alle Stellen zu tun.
+
+
u3
+
Fink
Rechnerstrukturen
x3
y3
z3
(2u3 + v3 )
u2
v3
x2
y2
z2
(2u2 + v2 )
u1
v2
¶·º»
x1
y1
z1
(2u1 + v1 )
u0
v1
Boole. Fkt.
x0
y0
z0
(2u0 + v0 )
v0
14
Korrektheit der CSA-Realisierung
aus Volladdierer
xi + yi + zi = 2ui + vi
x +y +z =
=
n−1
X
xi · 2i
i =0
n−1
X
!
+
n−1
X
i =0
(xi + yi + zi ) · 2i
i =0
=
=
n−1
X
(2ui + vi ) · 2i
i =0
n−1
X
i =0
Fink
Rechnerstrukturen
i +1
ui · 2
yi · 2i
!
¶·º»
+
!
+
i
!
n−1
X
i =0
zi · 2i
!
n−1
X
i =0
Boole. Fkt.
vi · 2
15
Multiplikation mit Wallace-Tree
klar
für drei n-Bit-Zahlen reichen n Volladdierer
also
Größe
Tiefe
5n
3
Gesamtgröße ∼ n2
Gesamttiefe ≈ 3 · log3/2 (n) + 2 log2 (n) ≈ 7,13 log2 (n)
{z
} | {z }
|
Wallce-Tree
Fazit
Fink
Rechnerstrukturen
Addierer
Multiplikation wesentlich teurer“ als Addition,
”
aber nicht wesentlich langsamer!
¶·º»
Boole. Fkt.
16
Subtraktion
Beobachtung
Niemand muss subtrahieren!
Begründung
also Idee
Statt x − y“ einfach x + (−y )“ rechnen!
”
”
Ersetze Subtraktion durch
1. Vorzeichenwechsel
2. Addition einer eventuell negativen Zahl
noch zu untersuchen
1. Wie schwierig ist der Vorzeichenwechsel?
2. Wie funktioniert die Addition von negativen Zahlen?
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
17
Vorzeichenwechsel
Repräsentation
Vorzeichen-Betrag
Einerkomplement
Zweierkomplement
Exzess
Beobachtung
also
Vorgehen
Vorzeichen-Bit invertieren
alle Bits invertieren
alle Bits invertieren,
1 addieren
Subtraktion von 2y
Kommentar
sehr einfach
einfach
machbar
schwierig
für Exzessdarstellung funktioniert
Addierer selbst bei positiven Zahlen nicht
x + y“
(b + x) + (b + y ) = (b + x + y )+b
”
Exzessdarstellung fürs Rechnen weitgehend ungeeignet,
nur günstig für Vergleiche
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
18
Addition negativer Zahlen
klar
unsere Schaltnetze für die Addition
(Schulmethode, Carry-Look-Ahead)
sind für Betragszahlen entworfen
Müssen wir für negative Zahlen komplett neu entwerfen?
klar
Das hängt von der Repräsentation ab.
Exzessdarstellung
Betrachten wir gar nicht,
weil wir damit nicht einmal addieren können.
Vorzeichen-Betrag
positive und negative fast gleich dargestellt,
darum neuer Schaltnetzentwurf erforderlich
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
19
Addition negativer Zahlen im Einerkomplement
auf dieser und nächster Folie
y ist Komplement von y
◮
Notation
◮
Wir wechseln frei zwischen Zahlen und ihren Repräsentationen.
◮
feste Darstellungslänge l
Beobachtung
y + y = 2l − 1
⇔ y = 2l − 1 − y
Rechne
x − y = x + (−y ) = x + y = x + 2l − 1 − y = 2l + (x − y ) − 1
Wichtig
also
Darstellungslänge ⇒ 2l passt nicht“ (Überlauf)
”
Überlauf ignorieren ⇒ noch 1 addieren
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
korrekt
20
Addition negativer Zahlen im Zweierkomplement
Beobachtung
y + y = 2l − 1
⇔ y = 2l − 1 − y
Rechne
x − y = x + (−y ) = x + y + 1 = x + 2l − 1 − y + 1 = 2l + (x − y )
wichtig
also
Darstellungslänge ⇒ 2l passt nicht“ (Überlauf)
”
Überlauf ignorieren ⇒ korrekt
also Addierer rechnet richtig auch für negative Zahlen
Zweierkomplement verbreitetste Darstellung ganzer Zahlen
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
21
Überträge bei Addition im Zweierkomplement
Wann ist das Ergebnis korrekt und wann nicht darstellbar?
1. Addition zweier positiver Zahlen
klar Ergebnis positiv
Beobachtung kein Überlauf möglich
also Ergebnis korrekt, wenn positiv
2. Addition einer positiven und einer negativen Zahl
klar Ergebnis kleiner als größte darstellbare Zahl
klar Ergebnis größer als kleinste darstellbare Zahl
also Ergebnis immer korrekt
3. Addition zweier negativer Zahlen
gesehen Überlauf entsteht ( ignorieren)
klar Ergebnis negativ
also Ergebnis korrekt, wenn negativ
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
22
Gleitkommazahlen-Arithmetik
Darstellung gemäß IEEE 754-1985
x
= (−1)sx · mx · 2ex
y
= (−1)sy · my · 2ey
s
Vorzeichenbit
m
Mantisse (Binärdarstellung, inklusive impliziter 1)
e
Exponent (Exzessdarstellung, b = 2l−1 − 1)
Ergebnis z = (−1)sz · mz · 2ez
Vereinfachung
Wir ignorieren das Runden.
Aber : Wichtiger Teil des IEEE 754 Standards!
Weitere Details z.B. in:
David Goldberg (1991): What every computer scientist should know about
Fink floating-point arithmetic. ACM Computing Serveys 23(1):5–48.
Rechnerstrukturen
¶·º»
Boole. Fkt.
23
Multiplikation von Gleitkommazahlen
x
= (−1)sx · mx · 2ex
y
= (−1)sy · my · 2ey
z =x ·y
= (−1)sz · mz · 2ez
Beobachtung
z = (−1)sx ⊕sy · (mx · my ) · 2ex +ey
also
1. sz := sx ⊕ sy (trivial)
2. mz := mx · my (Multiplikation von Betragszahlen wie gesehen,
implizite Einsen nicht vergessen!)
3. ez := ex + ey (Addition, wegen Exzessdarstellung ex + ey − b
berechnen)
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
24
Beispiel Multiplikation Gleitkommazahlen
x 1 1000 0101 101 0000 0000 0000 0000 0000
y 1 1000 0111 110 1000 0000 0000 0000 0000
Vorzeichen sz = 1 ⊕ 1 = 0
Exponent Bias ist 2l−1 − 1 = (1000 0000)2 − 1
(1000 0111)2 − ((1000 0000)2 − 1) = (111)2 + 1 = (1000)2
(1000 0101)2 + (1000)2 = (1000 1101)2
(1000 1101)2 ist vorläufiger Exponent
Mantisse
1, 1 0 1 · 1, 1 1 0 1
1 1 0 1
Normalisieren:
1 1 0 1
Komma 1 Stelle nach links
1 1 0 1
Exponent zum Ausgleich +1
0 0 0 0
implizite Eins streichen
+
1 1 0 1
1 0, 1 1 1 1 0 0 1
Fink
Rechnerstrukturen
z
0
1000
1110
011
¶ · º » Boole.
1100
1000Fkt. 0000
0000
0000
25
Addition von Gleitkommazahlen
x
= (−1)sx · mx · 2ex
y
= (−1)sy · my · 2ey
z =x +y
= (−1)sz · mz · 2ez
Beobachtung
einfach, wenn ex = ey
dann m1 · 2e + m2 · 2e = (m1 + m2 ) · 2e
Plan
1. Ergebnis wird so ähnlich“ wie Zahl mit größerem Exponenten,
”
darum Mantisse der Zahl mit kleinerem Exponenten anpassen
2. Mantissen auf jeden Fall addieren, bei unterschiedlichen
Vorzeichen dazu eine Mantisse negieren (Zweierkomplement)
3. anschließend normalisieren
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
26
Algorithmus zur Addition
1. Falls ex < ey , dann x und y komplett vertauschen.
2. Falls Vorzeichen ungleich, dann Vorzeichen von sy invertieren und
Übergang von y zu −y im Zweierkomplement ( y + 1“). sz := sx
”
3. Mantisse my um ex − ey Stellen nach rechts verschieben
(Exponenten virtuell“ jetzt angeglichen)
”
Achtung Kann zum “Verlust” signifikanter Stellen führen!
4. mz := mx + my
Falls ex = ey , Vorzeichenwechsel möglich. Dann sz invertieren.
5. ez := ex . Ergebnis normalisieren
Achtung
klar
Bei Mantissen an implizite Einsen denken!
Keine separate Subtraktion erforderlich.
Vorzeichenwechsel trivial.
Addition negativer Zahlen enthalten durch Zweierkomplement.
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
27
Beispiel Addition Gleitkommazahlen
1 1001 0101 111 0010 0000 0000 0000
1 1001 0100 110 0001 1000 0000 0000
ex > ey , Vorzeichen gleich, also zunächst nur sz := 1
0000
0000
x
y
Mantisse my um ex − ey = 1 Stelle
0,111000011
1, 1
+ 0, 1
Mantissen addieren
1 0, 1
Normalisieren
nach rechts verschieben
1
1
1
1
1
0
0
0
0
◮
Komma um 1 Stelle nach links verschieben
◮
Exponent um 1 vergrößern
z
1
Fink
Rechnerstrukturen
1001
0110
011
0
0
0
1
0
1
0
0
1
1
1
1
1,0110001011
1001 0110
0001
¶·º»
0110
Boole. Fkt.
0000
0000
0000
28
Noch ein Beispiel zur Addition
1
0
x
y
1000
1000
0101
0100
010
101
0000
1010
0000
0000
0000
0000
ex > ey
weil
sx 6= sy sy invertieren
Vorzeichenwechsel bei my
in Zweierkomplementdarstellung
1
0
1
1000
1000
1000
Fink
Rechnerstrukturen
0000
0000
√
klar
x
aus
wird y
0000
0000
0101
0100
0100
1
01
10
,
,
,
010
101
010
¶·º»
0000
1010
0110
Boole. Fkt.
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
29
Noch ein Beispiel zur Addition (2)
x 1 1000 0101
1 , 010 0000 0000 0000 0000 0000
y 1 1000 0100 10 , 010 0110 0000 0000 0000 0000
jetzt ey an ex anpassen, my verschieben
x 1 1000 0101
1 , 010 0000 0000 0000 0000 0000
y 1 1000 0101
11 , 001 0011 0000 0000 0000 0000
z 1 1000 0101 100 , 011 0011 0000 0000 0000 0000
Erinnerung
z 1 1000
Normalisieren
z
1
1000
Fink
Rechnerstrukturen
überfließende“ 1 einfach ignorieren
”
0101 0 , 011 0011 0000 0000
0000
0000
Komma um zwei Stellen nach rechts verschieben
Exponent zum Ausgleich um zwei verkleinern
0011
100
1100
0000
¶·º»
0000
Boole. Fkt.
0000
0000
30
Fehlerquellen bei der Gleitkommaarithmetik
◮
Rundung, wenn Berechnungsergebnis zur korrekten Darstellung
mehr signifikante Bits (d.h. i.d. Mantisse) erfordert als verfügbar
(kann bei Multiplikation und Addition auftreten)
◮
“Verlust” niederwertiger Bits durch Angleich der Exponenten
während der Addition
Worst Case: x ≫ y und y 6= 0 aber x + y = x
E
Und nicht zu vergessen: Darstellung nur einer extrem kleinen Auswahl
der rationalen Zahlen möglich, variiert mit der Größenordnung der
repräsentierten Zahlen!
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
31
Probleme bei der Addition: Ein Szenario
Gegeben: Folge von n Gleitkommazahlen [xi ] mit 0 ≤ i ≤ n
(z.B. gespeichert in einem Feld/Array x[i])
Aufgabe: Berechne Summe S ... möglichst exakt
(d.h. mit den Möglichkeiten der Gleitkommaarithmetik)
Naive Lösung: Direkte Summation, d.h. berechne:
n−1
0
P
P
S↑ =
xi oder lieber S ↓ =
xi
i =0
i =n−1
Theorie/Intuition: Beide Summationen liefern dasselbe Ergebnis!
Praxis: S ↑ und S ↓ sind i.a. nicht gleich!
−→
Beispielprogramm (in C)
Mögliche Abhilfe: Erhöhung der Genauigkeit (i.d.R. schwierig)
... oder “schlauere” Berechnung ;-)
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
32
Fehlerreduktion: Kahan-Summation
Algorithmus zur numerisch stabileren Berechnung von S =
n−1
P
xi :
i =0
S = 0;
E = 0;
for i = 0
Y
Z
E
S
}
/* Summe */
/* geschaetzter Fehler */
to n-1 {
= x[i] - E;
/* bish. Fehler beruecksichtigen */
= S + Y;
/* neues Summationsergebnis */
= (Z - S) - Y; /* neue Fehlerschaetzung */
= Z;
−→
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
Beispielprogramm (in C)
33
Fehlerreduktion: Kahan-Summation (2)
Veranschaulichung des fehlerkompensierenden Berechnungsablaufs:
Z
S
Yh
+
Yl
−
S
Z
Yh
−
E=
Fink
Rechnerstrukturen
¶·º»
Boole. Fkt.
Yh
Yl
−Yl
34
Herunterladen