2 puntos por GN⁺ 2024-10-07 | 1 comentarios | Compartir por WhatsApp

Público objetivo

  • Personas interesadas en la programación de CPU SIMD
  • Programadores de Amiga que quieran saber cómo calcular valores minterm del blitter

Instrucción ternaria de lógica de bits de AVX-512

  • Inspirado por una presentación de Tom Forsyth sobre el diseño de la ISA de AVX-512
  • La instrucción vpternlogd realiza operaciones lógicas de bits usando tres fuentes de entrada
  • Puede ejecutar operaciones lógicas complejas en una sola instrucción usando registros de 512 bits como entrada
  • Usa un valor inmediato de 8 bits para definir la operación lógica de bits específica

Chip personalizado blitter del Amiga

  • Las computadoras de los años 80 contaban con chips personalizados para el procesamiento gráfico
  • El chip blitter del Commodore Amiga 500 movía gráficos de mapa de bits y realizaba operaciones lógicas
  • La combinación lógica se controlaba configurando un valor de 8 bits llamado minterm
  • Muchos programadores de Amiga no sabían cómo calcular los valores minterm

Cómo calcular fácilmente los valores minterm

  • No hace falta entender el valor de 8 bits como un conjunto de operadores lógicos
  • Simplemente puede entenderse como una tabla de consulta
  • Por ejemplo, puede configurarse para que el resultado sea 1 cuando exactamente dos de los tres bits de entrada sean 1
  • Leyendo el valor de 8 bits de abajo hacia arriba se obtiene 0x68

Una coincidencia curiosa

  • El valor minterm 0xE2, muy usado en Amiga, se utilizaba para el renderizado de sprites 2D con máscara
  • Que Intel haya elegido 0xE2 como ejemplo del valor #imm8 en su documentación podría ser una coincidencia

Conclusión

  • Puede que en el equipo que prepara los ejemplos de documentación de Intel haya algún fan de Amiga
  • Un pequeño toque retro nunca viene mal

Resumen de GN⁺

  • La instrucción vpternlogd de AVX-512 es una herramienta potente capaz de realizar operaciones lógicas de bits complejas en una sola instrucción
  • La similitud con el chip blitter del Amiga resulta interesante desde una perspectiva histórica
  • Este artículo muestra la conexión entre la programación moderna y la tecnología retro, y ofrece ideas útiles para programadores
  • Entre proyectos con funciones parecidas están AVX-512 de Intel y la arquitectura Zen de AMD

1 comentarios

 
GN⁺ 2024-10-07
Comentarios de Hacker News
  • Hay una forma sencilla de calcular ciertas expresiones. Por ejemplo, si quieres calcular (NOT A) OR ((NOT B) XOR (C AND A)), puedes escribir la expresión usando las constantes _MM_TERNLOG_A, _MM_TERNLOG_B, _MM_TERNLOG_C

    • En GCC y Clang se puede calcular de inmediato usando las constantes definidas en el encabezado de intrinsics
    • En MSVC hay que definir las constantes manualmente
  • Pensé que el título decía que la instrucción no funcionaba correctamente, pero en realidad explica cómo funciona

  • Intenté entender el manual de hardware, pero fracasé. Después saqué A+ en una materia de lógica computacional en la universidad

  • "Lógica ternaria" normalmente significa lógica con tres valores de verdad, pero este artículo trata sobre una instrucción del compilador que maneja todas las compuertas lógicas binarias con tres entradas

  • La función de ejemplo "E2" en la documentación es la función booleana más básica con 3 entradas, llamada MUX, que selecciona C cuando A es B. Es universal

  • Usa una tabla de consulta (LUT), igual que la forma en que los FPGA implementan funciones lógicas arbitrarias

  • Parece que sí presté atención en la clase de matemáticas discretas en la universidad

  • Si buscas VPTERNLOG en sandpile.org, puedes ver planes pasados de Intel relacionados con enmascarado de bytes y palabras (AVX512BITALG2)

  • Nvidia SASS también tiene una instrucción similar (LOP3.LUT)

  • Otro ejemplo de empaquetar operaciones de bits como enteros son los códigos GDI ROP de win32