4 pontos por GN⁺ 2024-10-19 | 1 comentários | Compartilhar no WhatsApp

Uso de concorrência e paralelismo no Go

  • Introdução a um projeto que busca melhorar a capacidade de cálculo numérico aproveitando a concorrência e o paralelismo do Go.
  • É possível realizar computação paralela em nível de hardware usando instruções SIMD (Same Instruction Multiple Data).
  • Como o compilador de Go não utiliza SIMD e não foi encontrado um pacote SIMD de propósito geral adequado, decidiu-se desenvolver um pacote próprio.

Linguagem assembly Plan9

  • O Go usa sua própria linguagem assembly chamada Plan9, que emprega instruções e registradores de plataformas específicas com pequenas modificações.
  • x86 Plan9 e ARM Plan9 são diferentes entre si.
  • Os conceitos básicos de uso são explicados por meio de um exemplo simples de Plan9.

Exemplo de Plan9

  • Os arquivos AddInts_amd64.s e main.go mostram a forma básica de declarar e usar funções em Plan9.
  • Também é explicado como armazenar argumentos e valores de retorno na pilha de acordo com a convenção de chamada do Go.

Plano de design do pacote

  • Foi projetado um pacote que fornece uma camada fina de abstração para operações SIMD aritméticas e bit a bit.
  • Também foi criado um pacote interno com implementações Plan9 específicas por arquitetura, configuradas por meio de uma função de inicialização.

Exemplo de SIMD

  • O uso de SIMD é explicado por meio de exemplos de funções Plan9 SIMD em x86.
  • Os arquivos Supported_amd64.s e AddFloat32_amd64.s mostram como verificar suporte a SSE e como realizar soma de float32.

Desempenho e futuro

  • Um gráfico mostrando a diferença de desempenho entre a implementação em software em Go e a implementação SIMD em Plan9 confirma um ganho de velocidade de cerca de 200% a 450%.
  • O autor espera que esta nota inspire projetos que usem Plan9 e SIMD.

# Resumo do GN⁺

  • Este texto apresenta formas de maximizar desempenho aproveitando concorrência e paralelismo no Go.
  • Também explica como usar a linguagem assembly Plan9 e instruções SIMD para realizar computação paralela em nível de hardware.
  • Para desenvolvedores Go, o texto mostra o potencial de uso de Plan9 e SIMD e pode ser útil para explorar novas abordagens de otimização de desempenho.
  • Como projetos com funcionalidades semelhantes, são recomendadas bibliotecas de suporte a SIMD em Rust ou bibliotecas relacionadas a SIMD em C++.

1 comentários

 
GN⁺ 2024-10-19
Comentários no Hacker News
  • Explicação sobre NOSPLIT: é uma sintaxe peculiar no assembly do Go para descrever o tamanho do frame e o tamanho dos argumentos

    • O tamanho do frame e o tamanho dos argumentos são separados por -, e isso não é uma subtração matemática
    • A ferramenta go vet verifica se o tamanho dos argumentos está correto
  • Opinião sobre a interpretação por LLMs (grandes modelos de linguagem): pode haver mal-entendidos na interpretação do código

    • Houve a opinião de que seria útil para o aprendizado se o autor admitisse isso com franqueza
  • Menção à linguagem de assembly interna Plan9 do Go: o Go usa sua própria linguagem de assembly

    • Em amd64, int tem 64 bits, e ao usar int32 ele fica alinhado por palavra na lista de argumentos
    • NOSPLIT está definido em textflag.h e só é válido no runtime
  • Explicação de Rob Pike sobre o design do assembly do Go: criar uma linguagem de assembly comum para que seja possível se comunicar com a máquina sem precisar aprender uma nova sintaxe

    • É possível gerar automaticamente o assembler usando como entrada a documentação de uma nova arquitetura
  • Opinião sobre o uso de funções para operações SIMD: são necessárias funções capazes de executar operações SIMD em slices

    • Ao somar dois slices, seria possível processá-los em paralelo com SIMD em vez de usar um loop for
  • Filosofia de design do compilador Go: prioriza um compilador simples e rápido em vez de um compilador complexo

    • O suporte básico a x64 inclui SSE e SSE2, priorizando a simplicidade em vez do desempenho
  • Opinião sobre o uso de GPU para operações SIMD: como GPUs são excelentes em processamento paralelo e operações de matriz, podem ser mais adequadas para operações SIMD

    • Porém, no Go, a falta de pacotes para GPU e de uma comunidade nessa área pode torná-lo menos apropriado