2 Punkte von GN⁺ 2024-10-07 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-10-07
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_C formulieren

    • In GCC und Clang lässt sich das mit den in den Intrinsic-Headern definierten Konstanten sofort berechnen
    • In MSVC muss man die Konstanten selbst definieren
  • Ich 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