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
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_CPensé 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