Information Technology Reference
In-Depth Information
Zum Beispiel kann der Pentium 4 von Intel Vektoren mit 16 Bit breiten ganzzahli-
gen Elementen durch die Befehle paddw (add packed word integers), paddsw (add
packed signed word integers with signed saturation) und paddusw (add packed unsi-
gned word integers with unsigned saturation) verknüpfen, wobei die beiden letzten
Varianten das Ergebnis ggf. auf den Maximal- bzw. Minimalwert begrenzen. Dass
hier zwei Varianten mit Sättigung existieren, liegt daran, dass sich die Zahlenberei-
che vorzeichenloser und -behafteter Zahlen voneinander unterscheiden.
Beispiel 3.1. Vektoraddition . Zur Berechnung der Summe der 32-Bit-Zahlen a bis h ist in Bild 3.1
ein Assemblerprogramm für den Pentium 4 dargestellt, jeweils mit den Inhalten der verwendeten
Vektorregister xmm0 bis xmm3 und dem Intergerregister eax. Zunächst befinden sich die zu addie-
renden Zahlen in den beiden Vektorregistern xmm0 und xmm1 (oben im Bild). Durch die erste
Addition paddd (add packed doubleword integers) werden die jeweils untereinander stehenden Ele-
mente der Vektoren addiert und mit dem Ergebnis der Inhalt des ersten Operandenregisters über-
schrieben. Da die Addition jeweils nur elementweise möglich ist, wird als nächstes mit dem Befehl
pshufd ( shuffle packed doublewords) in xmm2 ein Vektor generiert, dessen obere und untere zwei
Elemente vertauscht sind.
a
b
c
d
xmm0
xmm1
e
f
g
h
paddd xmm0, xmm1
a+e
b+f
c+g
d+h
xmm0
pshufd xmm2, xmm0, 0x4e
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
c+g ￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
d+h
a+e
b+f
xmm2
paddd xmm2, xmm0
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
a+e+c+g ￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
b+f+d+h
c+g+a+e
d+h+b+f
xmm2
pshufd xmm3, xmm2, 0xb1
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
b+f+d+h
a+e+c+g
d+h+b+f
c+g+a+e
xmm3
paddd xmm3, xmm2
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
a+...+h
a+...+h
a+...+h
a+...+h
xmm3
movd
eax, xmm3
eax
a+...+h
Bild 3.1. Assemblerprogramm für den Pentium 4 von Intel, mit dem die Summe der 32-Bit-Zahlen
a bis h berechnet wird, wobei SIMD-Befehle verwendet werden. Die nicht benutzten Teile eines
Vektors sind schraffiert dargestellt (Bild in Anlehnung an [98]).
Die nachfolgende Addition generiert jeweils zwei identische Teilergebnisse a+e +c +g und
b +h+d +f, und zwar einmal in der oberen und einmal in der unteren Hälfte des Zielregisters xmm2.
Die beiden oberen Vektorelemente können somit ignoriert werden. Durch erneutes Vertauschen der
Elemente und anschließender Addition wird das abschließende Ergebnis insgesamt vier Mal
erzeugt. Zur Weiterverarbeitung muss man schließlich nur noch das unterste Element des Vektors
durch den Befehl movd in das Intergerregister eax übertragen.
Das dargestellte Programm ist zwar in seiner Aufgabenstellung untypisch und daher auch wenig
effizient (sechs Befehle zur Addition von acht Operanden), es ist aber in seinem grundsätzlichen
Aufbau charakteristisch für die Programmierung mit SIMD-Befehlen. So muss z.B. die Berechnung
des endgültigen Ergebnisses immer wieder durch Befehle unterbrochen werden, die die Vektoren
geeignet anordnen. Dies gilt insbesondere auch für die Operanden zu Beginn einer Berechnung,
was im Bild z.B. nicht dargestellt ist. Eine Verbesserung ist hier erreichbar, indem das Umordnen
von Vektoren mit arithmetischen Operationen kombiniert wird. Die Anzahl der Befehle in Bild 3.2
ist dadurch von insgesamt Sechs auf Vier reduzierbar.
Search WWH ::




Custom Search