Zielgruppe
- Personen, die sich für SIMD-CPU-Programmierung interessieren
- Amiga-Programmierer, die wissen möchten, wie man „minterm“-Blitter-Werte berechnet
AVX-512-Bitlogik-Trinär-Operationsinstruktion
- Inspiriert von Tom Forsyths Vortrag über das Design der AVX-512-ISA
- Die Instruktion vpternlogd führt Bitlogik-Operationen mit drei Eingabequellen aus
- Verwendet 512-Bit-Register als Eingabe und kann komplexe logische Operationen mit einer einzigen Instruktion ausführen
- Definiert die konkrete Bitlogik-Operation mithilfe eines 8-Bit-Sofortwerts
Amiga-Blitter-Custom-Chip
- Computer der 1980er Jahre besaßen Custom-Chips für die Grafikverarbeitung
- Der Blitter-Chip des Commodore Amiga 500 verschiebt Bitmap-Grafiken und führt logische Operationen aus
- Durch Setzen eines 8-Bit-Werts, des „minterm“, wird die logische Kombination gesteuert
- Viele Amiga-Programmierer wussten nicht, wie man minterm-Werte berechnet
Wie man minterm-Werte leicht berechnet
- Es ist nicht nötig, den 8-Bit-Wert als Menge logischer Operatoren zu verstehen
- Man kann ihn einfach als Lookup-Tabelle verstehen
- Zum Beispiel kann man festlegen, dass das Ergebnis 1 ist, wenn von drei Eingabebits genau zwei den Wert 1 haben
- Liest man den 8-Bit-Wert von unten nach oben, erhält man 0x68
Ein lustiger Zufall
- Der auf dem Amiga häufig verwendete minterm-Wert 0xE2 wird für das maskierte 2D-Sprite-Rendering verwendet
- Dass in der Intel-Dokumentation als Beispiel für
#imm8 ebenfalls 0xE2 gewählt wurde, könnte ein Zufall sein
Fazit
- Vielleicht gibt es im Team für die Intel-Dokumentationsbeispiele einen Amiga-Fan
- Ein bisschen Retro-Einfluss kann nicht schaden
Zusammenfassung von GN⁺
- Die AVX-512-Instruktion vpternlogd ist ein leistungsfähiges Werkzeug, das komplexe Bitlogik-Operationen mit einer einzigen Instruktion ausführen kann
- Die Ähnlichkeit mit dem Blitter-Chip des Amiga ist aus historischer Sicht interessant
- Dieser Artikel zeigt die Verbindung zwischen moderner Programmierung und Retro-Technik und bietet Programmierern nützliche Einsichten
- Zu Projekten mit ähnlicher Funktionalität zählen Intels AVX-512 und AMDs Zen-Architektur
1 Kommentare
Hacker-News-Kommentare
Es gibt eine einfache Methode, bestimmte Ausdrücke zu berechnen. Wenn man zum Beispiel
(NOT A) OR ((NOT B) XOR (C AND A))berechnen möchte, kann man den Ausdruck mit den Konstanten_MM_TERNLOG_A,_MM_TERNLOG_B,_MM_TERNLOG_CformulierenIch dachte erst, der Titel wolle sagen, dass die Instruktion nicht richtig funktioniert, tatsächlich erklärt er aber nur ihre Funktionsweise
Ich habe einmal versucht, das Hardware-Handbuch zu verstehen, und bin gescheitert. Später bekam ich an der Universität ein A+ im Kurs über Schaltlogik
„Ternäre Logik“ bedeutet normalerweise Logik mit drei Wahrheitswerten, aber dieser Artikel behandelt eine Compiler-Instruktion, die alle binären Logikgatter mit drei Eingängen abdeckt
Die Beispiel-Funktion „E2“ in der Dokumentation ist die grundlegendste Boolesche Funktion mit 3 Eingängen, bekannt als MUX, der C auswählt, wenn A gleich B ist. Universell einsetzbar
Wie bei der Implementierung beliebiger Logikfunktionen in FPGAs wird eine Lookup-Tabelle (LUT) verwendet
Scheint, als hätte ich mich im Grundstudium im Unterricht zu diskreter Mathematik gut konzentriert
Wenn man bei sandpile.org nach VPTERNLOG sucht, kann man Intels frühere Pläne im Zusammenhang mit Byte- und Word-Masking (AVX512BITALG2) sehen
Auch in Nvidia SASS gibt es eine ähnliche Instruktion (
LOP3.LUT)Ein weiteres Beispiel dafür, Bit-Operationen in Integer zu packen, sind die GDI-ROP-Codes von win32