Public visé
- Les personnes intéressées par la programmation CPU SIMD
- Les programmeurs Amiga qui veulent savoir comment calculer les valeurs de blitter « minterm »
Instruction d’opération logique ternaire bit à bit AVX-512
- Inspiré par une présentation de Tom Forsyth sur la conception de l’ISA AVX-512
- L’instruction vpternlogd effectue une opération logique bit à bit en utilisant trois sources d’entrée
- Elle peut utiliser des registres de 512 bits en entrée pour exécuter des opérations logiques complexes en une seule instruction
- Une valeur immédiate sur 8 bits est utilisée pour définir l’opération logique bit à bit précise
Puce personnalisée blitter de l’Amiga
- Les ordinateurs des années 1980 disposaient de puces personnalisées pour le traitement graphique
- La puce blitter du Commodore Amiga 500 déplace les graphismes bitmap et exécute des opérations logiques
- Une valeur de 8 bits appelée « minterm » permet de contrôler les combinaisons logiques
- Beaucoup de programmeurs Amiga ne savaient pas comment calculer les valeurs de minterm
Comment calculer facilement une valeur de minterm
- Il n’est pas nécessaire de comprendre la valeur sur 8 bits comme un ensemble d’opérateurs logiques
- On peut simplement la voir comme une table de correspondance
- Par exemple, on peut définir le résultat à 1 lorsque exactement deux des trois bits d’entrée valent 1
- En lisant la valeur sur 8 bits de bas en haut, on obtient 0x68
Coïncidence amusante
- Sur Amiga, la valeur de minterm 0xE2, souvent utilisée, sert au rendu de sprites 2D masqués
- Le fait qu’Intel ait choisi 0xE2 comme exemple de valeur #imm8 dans sa documentation est peut-être une simple coïncidence
Conclusion
- Il y a peut-être un fan d’Amiga dans l’équipe qui rédige les exemples de la documentation Intel
- Un léger parfum rétro ne ferait pas de mal
Le résumé de GN⁺
- L’instruction vpternlogd d’AVX-512 est un outil puissant capable d’exécuter des opérations logiques bit à bit complexes en une seule instruction
- Sa ressemblance avec la puce blitter de l’Amiga est intéressante d’un point de vue historique
- Cet article montre le lien entre la programmation moderne et les technologies rétro, et apporte des pistes utiles aux programmeurs
- Parmi les projets offrant des fonctions similaires, on trouve l’AVX-512 d’Intel et l’architecture Zen d’AMD
1 commentaires
Commentaires Hacker News
Il existe une méthode simple pour calculer certaines expressions. Par exemple, si vous voulez calculer
(NOT A) OR ((NOT B) XOR (C AND A)), il suffit d’écrire l’expression en utilisant les constantes_MM_TERNLOG_A,_MM_TERNLOG_B,_MM_TERNLOG_CJ’ai d’abord cru que le titre disait que l’instruction ne fonctionnait pas correctement, alors qu’en réalité il explique simplement son fonctionnement
J’ai déjà essayé de comprendre un manuel matériel sans y parvenir. Plus tard, j’ai eu A+ en logique computationnelle à l’université
« Logique ternaire » désigne habituellement une logique à trois valeurs de vérité, mais cet article traite d’une instruction de compilation qui gère toutes les portes logiques binaires à trois entrées
La fonction d’exemple « E2 » dans la documentation est la fonction booléenne la plus élémentaire à 3 entrées, appelée MUX, qui sélectionne C lorsque A est égal à B. Elle est universelle
Cela utilise une table de correspondance (LUT), exactement comme un FPGA implémente une fonction logique arbitraire
On dirait que je me suis bien concentré en maths discrètes pendant ma licence
En cherchant VPTERNLOG sur sandpile.org, on peut voir d’anciens projets d’Intel liés au masquage par octets et par mots (AVX512BITALG2)
Il existe aussi une instruction similaire dans le SASS de Nvidia :
LOP3.LUTUn autre exemple d’empaquetage d’opérations sur les bits sous forme d’entiers est le code GDI ROP de win32