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
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-, e isso não é uma subtração matemáticago vetverifica se o tamanho dos argumentos está corretoOpinião sobre a interpretação por LLMs (grandes modelos de linguagem): pode haver mal-entendidos na interpretação do código
Menção à linguagem de assembly interna
Plan9do Go: o Go usa sua própria linguagem de assemblyinttem 64 bits, e ao usarint32ele fica alinhado por palavra na lista de argumentosNOSPLITestá definido emtextflag.he só é válido no runtimeExplicaçã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
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
forFilosofia de design do compilador Go: prioriza um compilador simples e rápido em vez de um compilador complexo
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