2 pontos por GN⁺ 2024-10-07 | 1 comentários | Compartilhar no WhatsApp

Público-alvo

  • Pessoas interessadas em programação de CPU com SIMD
  • Programadores de Amiga que querem saber como calcular valores de "minterm" do blitter

Instrução ternária de lógica de bits do AVX-512

  • Inspirado por uma apresentação de Tom Forsyth sobre o design da ISA AVX-512
  • A instrução vpternlogd realiza operações lógicas bit a bit usando três fontes de entrada
  • É possível executar operações lógicas complexas em uma única instrução usando registradores de 512 bits como entrada
  • Um valor imediato de 8 bits é usado para definir a operação lógica bit a bit específica

Chip customizado blitter do Amiga

  • Os computadores dos anos 1980 tinham chips customizados para processamento gráfico
  • O chip blitter do Commodore Amiga 500 movia gráficos em bitmap e realizava operações lógicas
  • A combinação lógica era controlada configurando um valor de 8 bits chamado "minterm"
  • Muitos programadores de Amiga não sabiam como calcular valores de minterm

Como calcular valores de minterm com facilidade

  • Não é necessário entender o valor de 8 bits como um conjunto de operadores lógicos
  • Ele pode ser entendido simplesmente como uma tabela de consulta
  • Por exemplo, é possível configurar para que o resultado seja 1 quando exatamente dois dos três bits de entrada forem 1
  • Lendo o valor de 8 bits de baixo para cima, obtém-se 0x68

Uma coincidência divertida

  • No Amiga, o valor de minterm 0xE2 era frequentemente usado para renderização de sprites 2D com máscara
  • O fato de a documentação da Intel ter escolhido 0xE2 como exemplo de #imm8 pode ser apenas coincidência

Conclusão

  • Talvez haja um fã de Amiga na equipe que escreve os exemplos da documentação da Intel
  • Um pouco de influência retrô não faz mal a ninguém

Resumo do GN⁺

  • A instrução vpternlogd do AVX-512 é uma ferramenta poderosa para executar operações lógicas complexas bit a bit em uma única instrução
  • A semelhança com o chip blitter do Amiga é interessante do ponto de vista histórico
  • Este texto mostra a conexão entre programação moderna e tecnologia retrô, oferecendo insights úteis para programadores
  • Projetos com funcionalidade semelhante incluem o AVX-512 da Intel e a arquitetura Zen da AMD

1 comentários

 
GN⁺ 2024-10-07
Comentários do Hacker News
  • Há uma maneira simples de calcular certas expressões. Por exemplo, se você quiser calcular (NOT A) OR ((NOT B) XOR (C AND A)), pode escrever a expressão usando as constantes _MM_TERNLOG_A, _MM_TERNLOG_B, _MM_TERNLOG_C

    • No GCC e no Clang, é possível calcular isso imediatamente usando as constantes definidas no cabeçalho de intrinsics
    • No MSVC, é preciso definir as constantes manualmente
  • Achei que o título dizia que a instrução não funcionava corretamente, mas na verdade ele explica como ela funciona

  • Já tive a experiência de tentar entender o manual de hardware e falhar. Mais tarde, tirei A+ em uma disciplina de lógica computacional na faculdade

  • "Lógica ternária" normalmente significa uma lógica com três valores de verdade, mas este texto trata de uma instrução de compilador que lida com todas as portas lógicas binárias com três entradas

  • A função de exemplo "E2" na documentação é a função booleana mais básica com 3 entradas, chamada de MUX, que seleciona C quando A é igual a B. É universal

  • Assim como um FPGA implementa funções lógicas arbitrárias, isso usa uma tabela de consulta (LUT)

  • Acho que prestei atenção nas aulas de matemática discreta na graduação

  • Se você procurar por VPTERNLOG em sandpile.org, poderá ver os planos antigos da Intel relacionados a mascaramento de bytes e words (AVX512BITALG2)

  • O SASS da Nvidia também tem uma instrução semelhante (LOP3.LUT)

  • Outro exemplo de empacotar operações de bits como inteiros são os códigos GDI ROP do win32