|
Software-
Geschwindigkeits-
Optimierung
Fallbeispiele
Services
Plattformen
· x86
· Itanium
· Embedded
· Andere
Technologie
· SIMD / MMX / SSE /
SSE2 / SSE3 / 3DNow!
Über uns
Kontakt
|
Technologie: SIMD / MMX / SSE / SSE2 / SSE3 / 3DNow!
Eine zunehmende Zahl neuer Prozessoren haben Erweiterungen ihrer Befehlssätze,
die man generell SIMD Befehlssätze nennt. SIMD steht für
Single Instruction Multiple Data und bedeutet, dass ein einziger Befehl,
wie z.B. "add", auf eine ganze Anzahl von Daten parallel wirkt.
Eine typischer SIMD Befehl wird z.B. 8 16-Bit-Werte parallel addieren.
Offensichtlich kann dies zu dramatischen Geschwindigkeitsbeschleunigungen
führen, weswegen diese Befehlssätze ja auch eingeführt wurden.
Sie können diese Seite entweder sequentiell lesen oder eine der
Sektionen direkt anspringen:
[Der 3DNow! Befehlssatz wird nicht behandelt, der SSE Befehlssatz ist
jedoch vergleichbar.]
In 1997 führte Intel den Pentium Prozessor mit MMX Technologie ein. In
der Folge erschienen die Pentium II, III und 4 Prozessoren und auch andere,
wie die AMD Athlon und Duron Prozessoren, haben diese Befehlssatzerweiterung
an Bord.
Der MMX Befehlssatz führt 8 neue 64 Bit breite Register namens mm0 ..
mm7 ein; diese Register sind allerdings intern die gleichen wie die FPU Register,
so dass FPU und MMX Befehle nicht zusammen verwendet werden können. Die Register
können folgende Datentypen enthalten:
| Datentyp |
MMX-Register |
| 1x 64 Bit Integer |
Bits 63 .. 0 |
| 2x 32 Bit Integer |
32 Bit Word 1 |
16 Bit Word 0 |
| 4x 16 Bit Integer |
16 Bit Word 3 |
16 Bit Word 2 |
16 Bit Word 1 |
16 Bit Word 0 |
| 8x 8 Bit Integer |
Byte 7 |
Byte 6 |
Byte 5 |
Byte 4 |
Byte 3 |
Byte 2 |
Byte 1 |
Byte 0 |
Entsprechende Integer-Befehle wurden eingeführt:
Befehls-Kategorie
|
Befehl
|
Operation
|
| Datentransfer |
movq |
64 Bit Transfer von/nach mmx Register |
| movd |
32 Bit Transfer von/nach mmx Register |
| Datenformatskonversion oder -transfer |
packsswb/dw |
Parallele Pack-Operation von signed Words nach Bytes / DWords nach
Words mit signed saturation |
| packuswb/dw |
Parallele Pack-Operation von unsigned Words nach Bytes / DWords
nach Words mit unsigned saturation |
| punpckhbw/wd/dq |
Parallele Unpack-Operation der oberen 32 Bits: Bytes nach Words / Words
nach DWords / DWords nach QWords |
| punpcklbw/wd/dq |
Parallele Unpack-Operation der unteren 32 Bits: Bytes nach Words /
Words nach DWords / DWords nach QWords |
| Arithmetische Operationen |
paddb/w/d |
Parallele Addition für Bytes / Words / DWords |
| psubb/w/d |
Parallele Subtraktion für Bytes / Words / DWords |
| paddsb/w |
Parallele saturated Addition für signed Bytes / Words |
| paddusb/w |
Parallele saturated Addition für unsigned Bytes / Words |
| psubsb/w |
Parallele saturated Subtraktion für signed Bytes / Words |
| psubusb/w |
Parallele saturated Subtraktion für unsigned Bytes / Words |
| pmaddwd |
Parallele Multiplikation für signed Words mit nachfolgender
Addition der Ergebnisse |
| pmullhw |
Parallele Multiplikation für signed Words wobei die oberen 16
Bits des Ergebnisses gespeichert werden |
| pmulllw |
Parallele Multiplikation für signed Words wobei die unteren 16
Bits des Ergebnisses gespeichert werden |
| pcmpeqb/w/d |
Parallele Vergleichs-Operation auf Gleichheit für signed Bytes / Words /
DWords |
| pcmpgtb/w/d |
Parallele Vergleichs-Operation auf grösser-als für signed Bytes /
Words / DWords |
| Logische Operationen |
pand |
Parallele Und-Operation auf allen 64 Bits |
| pandn |
Parallele Und-Nicht-Operation auf allen 64 Bits |
| por |
Parallele Oder-Operation auf allen 64 Bits |
| pxor |
Parallele Xor-Operation auf allen 64 Bits |
| Schiebe-Operationen |
psllw/d/q |
Parallele Schiebe-Operation nach links für Words / DWords / QWords
wobei Nullen eingefügt werden |
| psraw/d |
Parallele Schiebe-Operation nach rechts für signed Words / DWords |
| psrlw/d/q |
Parallele Schiebe-Operation für unsigned Words / DWords / QWords |
| FPU Befehle wieder ermöglichen |
emms |
Setzt den FPU Status, um wieder FPU Befehle zu ermöglichen |
Alle Operationen sind entweder Register, Register oder Register,
Speicher Operationen. Es gibt keine No Speicher, Register oder Speicher,
Speicher Operationen.
Hier einige Beispiele:
|
Befehl
|
Operation
|
| pxor mm0,mm0 |
mm0 löschen |
| paddb mm0,mm1 |
Parallele Addition von Bytes von mm1 nach mm0 |
| psubusw mm7,[eax] |
Parallele Addition von unsigned Words mit saturation von [eax]
nach mm7 |
| psslw mm5,3 |
Parallele Schiebeoperation von Words in mm5 um 3 Positionen, wobei
Nullen eingefügt werden |
Wie anhand der obigen Befehlsliste gesehen werden kann, gibt es eine
Reihe von Einschränkungen bei dieser ersten Befehlssatzerweiterung:
- Nicht alle Datentypen werden von allen Operationen unterstützt,
z.B. fehlen Multiplikationen für vorzeichenlose Datentypen oder
Schiebe-Operationen für Bytes etc.
- Diverse interessante Befehle fehlen, z.B. min/max
- Die Register benutzen intern die FPU Register und verhindern damit
den gleichzeitigen Einsatz von FPU Befehlen
- Es gibt parallelen Fließkomma-Befehle
- Die Register sind nur 64 Bit breit
- Es gibt nur 8 Register
- Es gibt keine Prefetch- oder Write-Through-Befehle
- Es gibt keine wirkliche Unterstützung für nicht alignte Zugriffe
- Konstanten werden nicht unterstützt
Die spätere Einführung der SSE, SSE2 und SSE3 Befehlssatzerweiterungen hebt
einige dieser Einschränkungen auf.
Zum Seitenanfang zurück
Der Pentium III Prozessor, eingeführt 1999, war der erste Prozessor
mit dem SSE Befehlssatz an Bord. Allerdings hatte AMD bereits vorher den
ähnlichen 3DNow! Befehlssatz bei ihrer K6 CPU eingeführt.
Der SSE Befehlssatz enthält 3 verschiedene Erweiterungen:
- Zusätzliche MMX Befehle wie min/max
- Prefetch und Write-Through Befehle, um den Datentransfer von und zu
den Cache-Speichern und dem Hauptspeicher zu optimieren
- Neue 128 Bit XMM Register und entsprechende 32 Bit floating point
(single precision) Befehle
The SSE Befehlsatz führt 8 neue 128 Bit breite Register namens xmm0 ..
xmm7 ein. Die Register können die folgenden Datentypen enthalten:
| Datentyp |
XMM-Register |
| 1x 128 Bit Integer |
Bits 127 .. 0 |
| 4x 32 Bit floating point Werte |
32 Bit floating point Wert 3 |
32 Bit floating point Wert 2 |
32 Bit floating point Wert 1 |
32 Bit floating point Wert 0 |
Der SSE Befehlssatz schließt den MMX Befehlssatz mit ein; die folgende
Tabelle enthält nur die zusätzlichen SSE Befehle:
Befehlskategorie
|
Befehl
|
Operation
|
| Prefetch und Write-Through Befehle |
prefetchx |
Prefetch Daten in den L1/L2/L3 Cache |
| movntq |
Schreibt Daten direkt in den Hauptspeicher an den Caches vorbei (nur
MMX) |
| movntps |
Schreibt Daten direkt in den Hauptspeicher an den Caches vorbei (nur
XMM) |
| maskmovq |
Schreibt individuelle Bytes direkt in den Hauptspeicher an den
Caches vorbei (nur MMX) |
| XMM Datentransfer |
movaps |
128 Bit Transfer von/nach xmm Register, Speicherdaten müssen
aligned sein |
| movups |
128 Bit Transfer von/nach xmm Register, Speicherdaten dürfen
unaligned sein |
| movss |
32 Bit Transfer von/nach xmm Register |
| movlps |
64 Bit Transfer von/nach unteren 64 Bit eines xmm Registers |
| movhps |
64 Bit Transfer von/nach oberen 64 Bit eines xmm Registers |
| movlhps |
64 Bit Transfer von den unteren 64 Bit des xmm Registers zu den
oberen 64 Bit eines xmm Registers |
| movhlps |
64 Bit Transfer von den oberen 64 Bit eines xmm Registers zu den
unteren 64 Bit eines xmm Registers |
| movmskps |
Extrahiere oberstes Bits von allen DWords und speichere Ergebnis
in einem general Register |
| Datenformatskonversion oder -transfer |
pextrw |
Extrahiere Word nach general Register |
| pinsrw |
Füge Word von einem general Register ein |
| pmovmskb |
Extract oberstes Bits von allen Bytes und speichere Ergebnis in
einem general Register |
| pshufw |
Words neu ordnen (nur MMX) |
| pshufps |
DWords neu ordnen (nur XMM) |
| unpckhps |
Parallele Unpack- und Interleave-Operation der oberen DWords (nur
XMM) |
| unpcklps |
Parallele Unpack- und Interleave-Operation der unteren DWords (nur
XMM) |
| cvtpi2ps |
Parallele Konversion von Integer DWords nach single precision floating point
Werte (nur XMM) |
| cvtpi2ss |
Konversion eines Integer DWords nach single precision floating point
Wert (nur XMM) |
| cvtps2si |
Parallele Konversion von single precision floating point Werten
nach Integer DWords (nur XMM) |
| cvtss2si |
Konversion eines single precision floating point Werts nach Integer
DWord (nur XMM) |
| MMX arithmetische Operationen |
pavgb/w |
Parallele Mittelwert-Operation für unsigned Bytes / Words |
| pminub |
Parallele Minimum-Operation für unsigned Bytes |
| pmaxub |
Parallele Maximum-Operation für unsigned Bytes |
| pminsw |
Parallele Minimum-Operation für signed Words |
| pmaxsw |
Parallele Maximum-Operation für signed Words |
| pmulhuw |
Parallele Multiplikation für unsigned Words und Speicherung der
oberen 16 Bits des Ergebnisses |
| psadbw |
Parallele Betrag-der-Differenz-Operation für unsigned Bytes und
Summierung der Ergebnisse |
| XMM arithmetische Operationen |
addps |
Parallele Addition für single precision floating point Werte |
| addss |
Addition für single precision floating point Wert in den unteren 32
Bits |
| subps |
Parallele Subtraktion für single precision floating point Werte |
| subss |
Subtration für single precision floating point Wert in den
unteren 32 Bits |
| mulps |
Parallele Multiplikation für single precision floating point Werte |
| mulss |
Multiplikation für single precision floating point Wert in den
unteren 32 Bits |
| divps |
Parallele Division für single precision floating point Werte |
| divss |
Division für single precision floating point Wert in den unteren 32
Bits |
| rcpps |
Parallele Kehrwert-Operation, approximiert, für single precision floating point
Werte |
| rcpss |
Kehrwert-Operation, approximiert, für single precision floating point
Wert in den unteren 32 Bits |
| sqrtps |
Parallele Wurzel-Operation für single precision floating point Werte |
| sqrtss |
Wurzel-Operation für single precision floating point Wert in den
unteren 32 Bits |
| rsqrtps |
Parallele Kehrwert-der-Wurzel-Operation, approximiert, für single precision
floating point Werte |
| rsqrtss |
Kehrwert-der-Wurzel-Operation, approximiert, für single precision floating point
Wert in den unteren 32 Bits |
| minps |
Parallele Minimum-Operation für single precision floating point Werte |
| minss |
Minimum-Operation für precision floating point Wert in den
unteren 32 Bits |
| maxps |
Parallele Maximum-Operation für single precision floating point Werte |
| maxss |
Maximum-Operation für precision floating point Wert in den
unteren 32 Bits |
| cmpps |
Parallele Vergleichs-Operation für single precision floating point
Werte mit Masken als Ergebnis |
| cmpss |
Vergleichs-Operation für single precision floating point Wert in
den unteren 32 Bits mit Maske als Ergebnis |
| comiss |
Vergleichs-Operation für single precision floating point Wert in
den unteren 32 Bits mit Ergebnis im Flag-Register |
| ucomiss |
Vergleichs-Operation, unordered, für single precision floating point
Wert in den unteren 32 Bits mit Ergebnis im Flag-Register |
| XMM logische Operationen |
andps |
Parallele Und-Operation auf allen 128 Bits |
| andnps |
Parallele Und-Nicht-Operation auf allen 128 Bits |
| orps |
Parallele Oder-Operation auf allen 128 Bits |
| xorps |
Parallele Xor-Operation auf allen 128 Bits |
Hier einige Beispiele:
|
Befehl
|
Operation
|
| prefetchnta [esi+64] |
Prefetch von Daten in den L1 (oder L2) Cache von [esi+64] |
| pminub mm3,mm4 |
Parallele Minimum-Operation von unsigned Bytes von mm3 und mm4 |
| mulps xmm0,xmm5 |
Parallele single precision floating point Addition von xmm5 nach xmm0 |
| maxps xmm1,[edi] |
Parallele single precision floating point Maximum-Operation von xmm1
und Datei bei [edi] |
Wie anhand der obigen Befehlsliste gesehen werden kann, gibt es nach
wie vor eine Reihe von Einschränkungen bei dieser Befehlssatzerweiterung:
- Nicht alle Datentypen werden von allen Operationen unterstützt,
z.B. fehlen Multiplikationen für vorzeichenlose Datentypen oder
Schiebe-Operationen für Bytes etc.
- Es werden nur 32 Bit floating point Datentypen unterstützt
- Es gibt keine Integer-Befehle für die XMM Register
- Es gibt keine wirkliche Unterstützung für nicht alignte Zugriffe
- Konstanten werden nicht unterstützt
Die spätere Einführung der SSE2 und SSE3 Befehlssatzerweiterungen hebt einige
dieser Einschränkungen auf.
Zum Seitenanfang zurück
Der Pentium 4 Prozessor führte die SSE2 Befehlssatzerweiterung in 2000
ein.
Der Befehlssatz enthält zwei wesentliche Verbesserungen:
- Unterstützung von 64 Bit (double precision) floating point
Datentypen
- Integer-Befehle für die XMM Register
Da der SSE2 Befehlssatz Integer-Befehle für die
XMM Register und double floating-point Datentypen zu den XMM Registern
hinzugefügt hat, können die XMM Register jetzt folgende Datentypen halten:
| Datentyp |
XMMx-Register |
| 1x 128 Bit Integer |
Bits 127 .. 0 |
| 2x 64 Bit Integer |
64 Bit Word 1 |
64 Bit Word 0 |
| 4x 32 Bit Integer |
32 Bit Word 3 |
32 Bit Word 2 |
32 Bit Word 1 |
32 Bit Word 0 |
| 8x 16 Bit Integer |
16 Bit Word 7 |
16 Bit Word 6 |
16 Bit Word 5 |
16 Bit Word 4 |
16 Bit Word 3 |
16 Bit Word 2 |
16 Bit Word 1 |
16 Bit Word 0 |
| 16x 8 Bit Integer |
Byte 15 |
Byte 14 |
Byte 13 |
Byte 12 |
Byte 11 |
Byte 10 |
Byte 9 |
Byte 8 |
Byte 7 |
Byte 6 |
Byte 5 |
Byte 4 |
Byte 3 |
Byte 2 |
Byte 1 |
Byte 0 |
| 2x 64 Bit floating point Werte |
64 Bit floating point Wert 1 |
64 Bit floating point Wert 0 |
| 4x 32 Bit floating point Werte |
32 Bit floating point Wert 3 |
32 Bit floating point Wert 2 |
32 Bit floating point Wert 1 |
32 Bit floating point Wert 0 |
Der SSE2 Befehlssatz schließt den SSE Befehlssatz mit ein (the MMX und
SSE Integer Befehle also apply to the XMM Registers now und the
single precision floating point Befehle of the SSE Befehlssatz also apply to the double precision data types);
die folgende Tabelle listet nur die zusätzlichen SSE2 Befehle auf:
Befehlskategorie
|
Befehl
|
Operation
|
| Prefetch und Write-Through Befehle |
movntdq / movntpd |
Schreibt Daten direkt in den Hauptspeicher an den Caches vorbei (nur
XMM) |
| movnti |
Schreibt Daten eines general Registers direkt in den Hauptspeicher
an den Caches vorbei |
| maskmovdqu |
Schreibt individuelle Bytes direkt in den Hauptspeicher an den
Caches vorbei (nur XMM) |
| XMM Datentransfer |
movapd / movdqa |
128 Bit Transfer von/nach xmm Register, Speicherdaten müssen
aligned sein |
| movupd / movdqu |
128 Bit Transfer von/nach xmm Register, Speicherdaten können
unaligned sein |
| movsd |
64 Bit Transfer von/nach xmm Register |
| movlpd |
64 Bit Transfer von/nach unteren 64 Bit eines xmm Registers |
| movhpd |
64 Bit Transfer von/nach oberen 64 Bit eines xmm Registers |
| movlhpd |
64 Bit Transfer from unteren 64 Bit eines xmm Registers nach
oberen 64 Bit eines xmm Register |
| movhlpd |
64 Bit Transfer von oberen 64 Bit eines xmm Registers nach unteren
64 Bit eines xmm Register |
| movmskpd |
Extrahiere oberste Bits von allen QWords und speichere das
Ergebnis in einem general Register |
| Datenformatskonversion oder -transfer |
pmovmskpd |
Extrahiere obere Bits von allen QWords und speichere das Ergebnis in
einem general Register |
| pshuflw |
Words in den unteren 64 Bits neu ordnen (nur XMM) |
| pshufhw |
Words in den oberen 64 Bits neu ordnen (nur XMM) |
| pshufpd |
DWords neu ordnen (nur XMM) |
| unpckhpd |
Parallele Unpack- und Interleave-Operation für obere QWords (nur
XMM) |
| unpcklpd |
Parallele Unpack- und Interleave-Operation für untere QWords (nur
XMM) |
| cvtpi2pd |
Parallele Konversion Integer DWords nach double precision floating point
Werte (nur XMM) |
| punpckhqdq |
Parallele Unpack-Operation für obere QWords |
| punpcklqdq |
Parallele Unpack für untere QWords |
| cvtpi2sd |
Konversion Integer DWord nach double precision floating point Wert
(nur XMM) |
| cvtpd2si |
Parallele Konversion double precision floating point Werte nach Integer
QWords (nur XMM) |
| cvtsd2si |
Konversion double precision floating point Wert nach Integer QWord
(nur XMM) |
| cvtps2pd |
Parallele Konversion single precision floating point Werte nach double
precision floating point Werte |
| cvtpd2ps |
Parallele Konversion double precision floating point Werte nach single
precision floating point Werte |
| cvtss2sd |
Konversion single precision floating point Wert nach double precision
floating point Wert |
| cvtsd2ss |
Konversion double precision floating point Wert nach single precision
floating point Wert |
| cvtps2dq |
Parallele Konversion single precision floating point Werte nach signed
DWord Integer |
| cvtdq2ps |
Parallele Konversion signed DWord Integer nach single precision
floating point Werte |
| movq2dq |
Transfer MMX Register Wert nach XMM Register |
| movdq2q |
Transfer untere 64 Bit eines XMM Registers nach MMX Register |
| Integer arithmetische Operationen |
paddq |
Parallele Addition für 64 Bit Integer |
| psubq |
Parallele Subtraktion für 64 Bit Integer |
| pmuludq |
Parallele Multiplikation für 32 Bit unsigned Integer mit 64 Bit
Ergebnis |
| XMM arithmetische Operationen |
addpd |
Parallele Addition für double precision floating point Werte |
| addsd |
Addition für double precision floating point Wert in den unteren 64
Bits |
| subpd |
Parallele Subtraktion für double precision floating point Werte |
| subsd |
Subtraktion für double precision floating point Wert in den
unteren 64 Bits |
| mulpd |
Parallele Multiplikation für double precision floating point Werte |
| mulsd |
Multiplikation für double precision floating point Wert in den
unteren 64 Bits |
| divpd |
Parallele Division für double precision floating point Werte |
| divsd |
Division für double precision floating point Wert in den unteren 64
Bits |
| rcppd |
Parallele Kehrwert-Operation, approximiert, für double precision floating point
Werte |
| rcpsd |
Kehrwert-Operation für double precision floating point Wert in
den unteren 64 Bits |
| sqrtpd |
Parallele Wurzel-Operation für double precision floating point Werte |
| sqrtsd |
Wurzel-Operation für double precision floating point Wert in den
unteren 64 Bits |
| rsqrtpd |
Parallele Kehrwert-der-Wurzel-Operation, approximiert, für double precision
floating point Werte |
| rsqrtsd |
Kehrwert-der-Wurzel-Operation, approximiert, für double precision floating point
Wert in den unteren 64 Bits |
| minpd |
Parallele Minimum-Operation für double precision floating point Werte |
| minsd |
Minimum-Operation für precision floating point Wert in den
unteren 64 Bits |
| maxpd |
Parallele Maximum-Operation für double precision floating point Werte |
| maxsd |
Maximum-Operation für precision floating point Wert in den
unteren 64 Bits |
| cmpps |
Vergleichs-Operation für double precision floating point Werte
mit Masken als Ergebnis |
| cmpsd |
Vergleichs-Operation für double precision floating point Wert in
den unteren 64 Bits mit Maske als Ergebnis |
| comisd |
Vergleichs-Operation für double precision floating point Wert in
den unteren 64 Bits mit Ergebnis im Flag-Register |
| ucomisd |
Vergleichs-Operation, unordered, für double precision floating point
Wert in den unteren 64 Bits mit Ergebnis im Flag-Register |
| XMM logische Operationen |
andpd |
Parallele Und-Operation auf allen 128 Bits |
| andnpd |
Parallele Und-Nicht-Operation auf allen 128 Bits |
| orpd |
Parallele Oder-Operation auf allen 128 Bits |
| xorpd |
Parallele Xor-Operation auf allen 128 Bits |
| XMM Schiebe-Operationen |
pslldq |
Schiebe alle 128 Bits nach links, Nullen werden eingefügt |
| psrldq |
Schiebe alle 128 Bits nach rechts, Nullen werden eingefügt |
Hier einige Beispiele:
|
Befehl
|
Operation
|
| paddd xmm0,xmm6 |
Parallele Addition von Integer DWords von xmm6 nach xmm0 |
| pmaddwd xmm2,[edx] |
Parallele Multiplikation von signed Integer Words in xmm2 und bei
[edi] mit nachfolgender Addition der Ergebnisse |
| sqrtpd xmm0,xmm0 |
Parallele double precision floating point Wurzel der Werte in
xmm0 |
| addpd xmm2,[ebx+16] |
Parallele Addition von double precision floating point Werten von [ebx+16]
nach xmm2 |
| psrldq xmm5,1 |
Schiebe-Operation nach rechts mit allen 128 Bits um eine Position,
wobei Nullen eingefügt werden |
Wie anhand der obigen Befehlsliste gesehen werden kann, gibt es nach
wie vor eine Reihe von Einschränkungen bei dieser Befehlssatzerweiterung:
- Nicht alle Datentypen werden von allen Operationen unterstützt,
z.B. fehlen saturated Additionen für 32 Bit Integer Werte oder
Schiebe-Operationen für Bytes etc.
- Es gibt nur 8 Register
- Es gibt keine wirkliche Unterstützung für nicht alignte Zugriffe
- Konstanten werden nicht unterstützt
Es ist unklar ob zukünftige Befehlssatzerweiterungen diese
Einschränkungen aufheben werden.
Nichtsdestotrotz ist der SSE2 Befehlssatz de facto eine parallele
Version der klassischen Integer und floating point Befehlssätze der
meisten Prozessoren, wodurch beeindruckende Beschleunigungen
ermöglicht werden.
Zum Seitenanfang zurück
SIMD Befehle arbeiten generell parallel auf n Datensätzen, wobei n
typischerweise 1, 2, 4,8 oder 16 ist. Dadurch treten einige Probleme auf:
- Wenn das Datenlayout nicht mit dem SIMD Anforderungen
übereinstimmt, können SIMD Befehle entweder nicht genutzt werden
oder es müssen zusätzliche Befehle eingefügt werden, die die Daten
umsortieren
- Wenn die Daten nicht aligned sind, wird die Geschwindigkeit
dramatisch einbrechen; die Lösung dieses Problems kann zu deutlich
komplizierterem Code führen
- Wenn die Aufgabenstellung nicht zu den möglichen Werten für n
passt, z.B. im Falle eines Filters, der n = 5 erfordert, wird die
Lösung recht kompliziert
- (Parallele) Tabellen-Lookups sind nicht möglich
- Die Vergleichsbefehle sind limitiert
Grundsätzlich gibt es für die Probleme Lösungen, aber sie erfordern
zusätzlichen oder smarten Code. Aufgrund dieser Probleme erzeugen selbst
Compiler, die grundsätzlich SIMD Code beherrschen, in vielen Fällen
keinen SIMD Code.
Zum Seitenanfang zurück
SIMD Befehle haben das Potential, Software 2x .. 16x oder sogar mehr
zu beschleunigen. Dies betrifft insbesondere rechenintensive Software,
die mit Arrays von Daten arbeitet.
Sehen Sie sie auch die Fallbeispiele,
dort werden entsprechende Beschleunigungsfaktoren angegeben.
Zum Seitenanfang zurück
SIMD Befehle haben das Potential, Software 2x .. 16x oder sogar mehr
zu beschleunigen.
Da allerdings die meisten Compiler diese Befehle nicht (vollständig)
unterstützen, kann diese Beschleunigung generell nur durch einen
Optimierungsexperten erzielt werden.
Hayes Technologies bietet entsprechende Services
an, um dieses hohe Potential der SIMD Befehlssätze zu realisieren.
Zum Seitenanfang zurück
|