Bitpacking und Komprimierung von Datenstrukturen im wissenschaftlichen Rechnen

8

Ich bin kürzlich auf dieses Papier gestoßen , das ein Schema zum Speichern von Speicher bei der Darstellung von Matrizen mit geringer Dichte beschreibt. Eine 32-Bit-Ganzzahl kann Zahlen bis zu ~ 4 Milliarden speichern. Aber wenn Sie eine PDE lösen, sind Sie parallel gegangen und haben das Problem aufgeteilt, lange bevor die Anzahl der Unbekannten bei 4 Milliarden liegt. Ihre Idee ist es, die Matrix für kleine Bandbreite neu zu ordnen. Anstatt die Indizes jaller Nicht-Null-Spalten in einer bestimmten Zeile zu ispeichern, speichern sie den Versatz j - i, dessen Größe aufgrund der Neuordnung tendenziell gering ist. Die Offsets können dann mit weniger Bits gespeichert werden als eine 32-Bit-Ganzzahl. Es gibt mehr Arithmetik zu tun, wenn über die Nicht-Null-Einträge der Matrix iteriert wird, aber die Einsparungen bei weniger Cache-Fehlschlägen machen dies mehr als wett. In diesem ArtikelSie wollten speziell 16-Bit-Indizes in einem hierarchischen Matrixformat verwenden, aber letztendlich ist es eine ähnliche Idee. Es gibt auch die Bibliothek zfp , die eher zum Komprimieren von Gleitkommadaten dient.

Da "Flops jetzt frei sind" und der Engpass der Speicherzugriff ist, scheinen diese Tricks wirklich vielversprechend, um den CPU-Cache besser zu nutzen.

Ich habe die meisten zitierten Werke dieser beiden Artikel durchsucht. Ich suche nach anderen Referenzen zur Effektivität des Bitpackens, zur spärlichen Matrix-Vektor-Multiplikation und nach anderen Problemen in der Computerwissenschaft . Ich stelle mir zum Beispiel vor, Sie könnten mit dieser Idee viel effizientere Datenstrukturen für Diagramme oder unstrukturierte Netze entwerfen.

Daniel Shapero
quelle

Antworten:

7

Speicher für spärliche Matrizen reduzieren

n×nn23×3

Eine ausführlichere Beschreibung des Formats finden Sie hier: http://www.netlib.org/utk/people/JackDongarra/etemplates/node375.html

Wenn Sie dichte Blöcke in der Matrix mit geringer Dichte speichern, können Sie die Matrix-Vektor-Multiplikation mit SSE- oder AVX-Anweisungen vektorisieren. Hier wird jedoch wahrscheinlich keine große Beschleunigung angezeigt, da Sie, wie bereits erwähnt, immer noch speichergebunden sind .

n

https://bebop.cs.berkeley.edu/pubs/vuduc2005-ubcsr-split.pdf

Natürlich hindert Sie nichts daran, die Bitpacking-Spiele mit einer neu geordneten BCSR-Matrix zu spielen, um den Speicherbedarf weiter zu reduzieren, aber Sie sollten wahrscheinlich zuerst die niedrig hängenden Früchte pflücken.

Bit-Packing im Allgemeinen

Wenn Sie speziell an Anwendungen des Bitpackens interessiert sind, geschieht dies im LLVM-Projekt aggressiv. Eine seiner (cleveren?) Ideen ist die Verwendung eines sogenannten PointerIntPair, bei dem ein Zeiger und eine kleine Ganzzahl zusammen im Raum eines einzelnen Zeigers gespeichert werden. Die Idee hier ist, die Tatsache auszunutzen, dass (auf Linux x64-Systemen) von malloc zurückgegebene Zeiger 16-Byte-ausgerichtet sind, was Ihnen unten 4 Bits gibt, mit denen Sie etwas tun können. Mit dieser Idee machen sie alle möglichen verrückten Dinge und bauen komplexe Datenstrukturen auf, die in einem einzigen Zeiger leben. Hier ist ein interessanter Konferenzvortrag, der vor einigen Jahren von einem der LLVM-Optimierer gehalten wurde. Er beginnt um 22:00 Uhr darüber zu sprechen. Faire Warnung: Dies war auf einer C ++ - Konferenz, daher ist eine große Menge von unerschrocken kompliziertem C ++ beteiligt.

https://www.youtube.com/watch?v=vElZc6zSIXM&t=22m&ab_channel=CppCon

Tyler Olsen
quelle