2 points par GN⁺ 2024-10-07 | 1 commentaires | Partager sur WhatsApp

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

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

    • Avec GCC et Clang, on peut la calculer immédiatement en utilisant les constantes définies dans l’en-tête des intrinsics
    • Avec MSVC, il faut définir soi-même les constantes
  • J’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.LUT

  • Un autre exemple d’empaquetage d’opérations sur les bits sous forme d’entiers est le code GDI ROP de win32