Go 1.26 e 1.27 trazem SIMD experimental independente de plataforma
\n
David Chase e Junyang Shao anunciaram em 24 de setembro de 2026 que as versões 1.26 e 1.27 do Go incluem APIs experimentais para operações SIMD (Single Instruction Multiple Data). O SIMD \u00e9 uma fun\u00e7\u00e3o nativa de muitas CPUs modernas que permite a execu\u00e7\u00e3o r\u00e1pida de tarefas uniformes em vetores de dados, como a adi\u00e7\u00e3o de oito pares de valores float64 em uma \u00fanica instru\u00e7\u00e3o.
\n
Esses ganhos de velocidade s\u00e3o valiosos para cargas de trabalho intensivas em computa\u00e7\u00e3o, desde criptografia e processamento de dados at\u00e9 tarefas de IA. Surpreendentemente, at\u00e9 mesmo o coletor de lixo Green Tea do Go utiliza SIMD para acelerar a digitaliza\u00e7\u00e3o da mem\u00f3ria em busca de objetos ativos.
\n
Antes dessas novas APIs experimentais, a \u00fanica maneira de acessar SIMD do Go era escrevendo c\u00f3digo assembly em Go. Essa abordagem era recomendada apenas para kernels de computa\u00e7\u00e3o realmente cr\u00edticos em termos de desempenho, deixando grande parte do potencial da CPU inexplorado em muitos outros softwares.
\n
A vers\u00e3o 1.26 do Go introduziu uma API SIMD para amd64, enquanto a vers\u00e3o 1.27 adicionou suporte para arm64 (NEON) e wasm. O desafio central para qualquer API SIMD \u00e9 a enorme varia\u00e7\u00e3o entre plataformas, n\u00e3o apenas em termos das opera\u00e7\u00f5es oferecidas, mas tamb\u00e9m na forma como os vetores s\u00e3o representados. Algumas arquiteturas fornecem vetores de tamanho fixo, geralmente entre 128 bits e 512 bits; outras exigem que o tamanho do vetor seja consultado no in\u00edcio da execu\u00e7\u00e3o do programa.
\n
Para lidar com essa diversidade, as APIs permanecem no pacote dependente de arquitetura archsimd. No entanto, a vers\u00e3o 1.27 do Go avan\u00e7a alm\u00e1 disso com um novo pacote experimental chamado simd, que oferece uma interface totalmente port\u00e1til, independente de plataforma e de tamanho, inspirada vagamente na biblioteca Highway para C++. O objetivo \u00e9 permitir que desenvolvedores escrevam c\u00f3digo SIMD uma vez, com desempenho pr\u00f3ximo ao do assembly, em plataformas que suportam SIMD, e fornecer uma emula\u00e7\u00e3o eficiente em plataformas que ainda n\u00e3o possuem suporte nativo.
\n
O pacote simd implementa atualmente suporte para AVX, AVX2 e AVX512 em amd64, NEON em arm64 e as instru\u00e7\u00f5es SIMD do wasm. Ele abstrai as diferen\u00e7as entre as arquiteturas SIMD removendo vetores de tamanho fixo do sistema de tipos e incluindo apenas opera\u00e7\u00f5es presentes na interse\u00e7\u00e3o de todas as plataformas, complementando lacunas na interse\u00e7\u00e3o com emula\u00e7\u00e3o eficiente usando outras instru\u00e7\u00f5es SIMD. Essa abordagem visa um conjunto de opera\u00e7\u00f5es consistente e seguro para execu\u00e7\u00e3o multiplataforma.
\n
Nos sistemas onde as instru\u00e7\u00f5es SIMD n\u\u00e3o est\u00e3o dispon\u00edveis ou onde o archsimd n\u00e3o oferece suporte, todas as opera\u00e7\u00f5es s\u00e3o emuladas, garantindo que o c\u00f3digo escrito com o pacote simd funcione em qualquer lugar. Para experimentar o pacote experimental, os desenvolvedores devem definir a vari\u00e1vel de ambiente GOEXPERIMENT=simd durante a compila\u00e7\u00e3o, assim como ocorre com o archsimd.\n
Os tipos de vetor no pacote simd s\u00e3o apenas tipos primitivos capitalizados no plural, como simd.Uint8s ou simd.Float32s. Os vetores s\u00e3o carregados de e armazenados em slices, por exemplo:
\n
As compara\u00e7\u00f5es SIMD geram valores de m\u00e1scara que s\u00e3o espec\u00edficos para a largura do elemento do vetor correspondente, de modo que a compara\u00e7\u00e3o de Int8s produz Mask8s, e assim por diante. Os valores de m\u00e1scara podem ser usados para selecionar e filtrar vetores. Observa\u00e7\u00f5es adicionais sobre compatibilidade de opera\u00e7\u00f5es e modos de m\u00e1scara est\u00e3o documentadas em detalhes nas notas de vers\u00e3o do pacote.
\n
Embora o pacote simd atenda a um amplo conjunto de casos de uso, ele ainda pode ser limitado para componentes espec\u00edficos de uma aplica\u00e7\u00e3o, ou pode haver necessidade de recursos de emula\u00e7\u00e3o ainda n\u00e3o fornecidos. Para essas situa\u00e7\u00f5es, o pacote simd permite que os desenvolvedores recorram a outras abordagens, como o archsimd nativo ou extens\u00f5es personalizadas, garantindo que n\u00e3o haja perdas de desempenho inevit\u00e1veis.
\n
Com o pacote experimental simd, o ecossistema Go se move em dire\u00e7\u00e3o a um modelo verdadeiramente port\u00e1til, onde os desenvolvedores podem escrever c\u00f3digo SIMD uma vez e executar em v\u00e1rias arquiteturas sem sacrificar o desempenho. O foco cont\u00ednuo em expandir a emula\u00e7\u00e3o e adicionar opera\u00e7\u00f5es adicionais deve tornar o SIMD mais acess\u00edvel para uma base ainda maior de programadores nos pr\u00f3ximos lan\u00e7amentos.
\n
Com informa\u00e7\u00f5es de: Hacker News (Y Combinator)