Hayes Technologies - Software Speed Optimization

Geschwindigkeitsoptimierung · Software Speed Optimization · High Performance Computing · Number Crunching · C/C++ · Assembler · SIMD · MMX · SSE · SSE2 · SSE3 · 3DNow!

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.]

 

MMX Befehlssatz

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

 

SSE Befehlssatz

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

 

SSE2 Befehlssatz

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

 

Wichtige Eigenschaften der SIMD Befehle

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

 

Beschleunigungsfaktoren

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

 

Schlussfolgerung

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

Plattformen: x86 · Pentium · Pentium MMX · Pentium II · Pentium III · Pentium 4 · Core · Core 2 · Xeon · Itanium · Athlon · DSPs · Embedded CPUs · Windows · Linux · RT-OS

Besonders profitierende Applikationsgebiete: Bildverarbeitung · Signalverarbeitung · High Performance Computing / Number Crunching · Simulationen · Kompression · Spiele · 3D Software · Gerätetreiber · Multi-Prozessor Systeme · Multi-Computer Systeme / Cluster · Embedded Geräte · Echtzeit-Systeme · Interaktive Systeme · Und viele mehr...