MMX, SSE, SSE2 & Co mit 16 Bit Datentypen
-
Ich führe Berechnungen auf einem großen Feld von Daten aus, deren Elemente jeweils nur 16 Bit groß sind. Soweit ich sehen kann arbeiten die ganzen SIMD Operationen alle nur mit 32 Bit Datentypen.
Prinzipiell könnte ich alles einfach als 32 Bit Datentypen abspeichern und die Berechnungen dann damit optimieren, allerdings würde das dann in meinem Programm auch einen Schmerzhaft merkbaren Memory-Overhead darstellen (eben genau Faktor 2).
Kann ich mir die 16 Bit-Größe irgendwie zu Nutze machen?
-
Sind das 16-Bit-Floats? Ich glaube, manche Graphikkarten können mit sowas rechnen; aber wahrscheinlich steht diese Möglichkeit in OpenCL etc. eher nicht zur Verfügung.
Oder sind es 16-Bit-Integerzahlen? Wenn sie vorzeichenlos sind und du sicher bist, daß es keine Overflows/Underflows geben kann, kannst du auch vereinzelt 32-Bit-SIMD-Befehle auf zwei 16-Bit-Operanden benutzen, etwa Addition, Subtraktion und Multiplikation mit konstantem Faktor. Allerdings ist es nicht einfach, Overflows auszuschließen, und wahrscheinlich sparst du Zeit und Aufwand, wenn du die Argumente zumindest für die Rechnung auf 32 Bits expandierst.
-
Soweit ich sehen kann arbeiten die ganzen SIMD Operationen alle nur mit 32 Bit Datentypen.
Dann schaue nochmal genauer hin. Sie arbeiten auch mit 16 Bit.
-
Ab SSE2 kannst du auf 8 16Bit Zahlen Parallel arbeiten.