Chargement…

SIMD dans Go

SIMD dans Go

Go 1.27 embarque un package simd portable et expérimental. Et pour moi, c'est l'une des news Go les plus excitantes depuis les generics.

Le SIMD (Single Instruction, Multiple Data), c'est la capacité d'un CPU à appliquer une même opération à tout un vecteur de données en une seule instruction : au lieu d'additionner 8 paires de float64 une par une, le processeur les traite d'un coup.

simd-avant-apres.svg

Crypto, traitement de données, IA, tout ce qui mouline des tableaux de nombres en profite. Le problème, c'est que jusqu'ici la seule porte d'entrée en Go, c'était l'assembleur Go.

Donc personne n'y touchait, sauf pour quelques kernels ultra-critiques, et une bonne partie du CPU restait simplement inutilisée.

Go 1.26 avait ouvert le package archsimd pour amd64, et Go 1.27 va beaucoup plus loin avec :

  • archsimd étendu à arm64 (NEON) et wasm
  • un package simd portable, inspiré de Highway (la lib C++ de Google)
  • une spécialisation automatique à la compilation pour AVX, AVX2, AVX-512, NEON et wasm
  • une émulation propre sur les plateformes sans support SIMD, donc votre code tourne partout

Alors, Go devient-il un C avec un gopher ?

Non, et je pense que c'est justement là que c'est malin.

Le GC, le runtime et les goroutines sont toujours là.

Mais Go se rapproche encore un peu plus des instructions CPU sans vous faire payer le prix du C : pas de gestion mémoire manuelle, pas d'intrinsics à maintenir plateforme par plateforme.

Vous écrivez une fois, le compilateur fait le sale boulot.

Et le gain de perf en vue est énorme.

Sur une boucle vectorisable, passer de 1 à 8 ou 16 éléments traités par instruction, ce n'est pas de l'optimisation à 10 %, c'est un autre ordre de grandeur.

Le runtime lui-même montre la voie : le GC Green Tea utilise déjà le SIMD pour scanner la mémoire.

Mais il faut bien retenir une chose : c'est encore expérimental (activation via GOEXPERIMENT=simd), l'API est volontairement conservatrice (pas de ReduceSum avant Go 1.28, pas encore de SVE), et le gain réel dépendra de la part vraiment vectorisable de votre code.

Reste que cette news m'excite énormément, et je vais suivre de très près ce qui arrive avec Go 1.28.

FAQ

Qu'est-ce que le SIMD apporte concrètement à un développeur Go ?

Cela permet de traiter plusieurs données en une seule instruction CPU, ce qui accélère fortement les boucles vectorisables comme les calculs sur des tableaux de nombres. Auparavant, seule l'assembleur Go permettait d'y accéder, ce qui limitait son usage à quelques kernels critiques.

Faut-il réécrire son code en assembleur pour en profiter ?

Non, c'est justement l'intérêt du nouveau package simd et de l'extension d'archsimd. Le compilateur se charge de spécialiser le code selon la plateforme cible, que ce soit AVX, AVX2, AVX-512, NEON ou wasm.

Que se passe-t-il si mon CPU ne supporte pas le SIMD ?

Go 1.27 prévoit une émulation propre sur les plateformes sans support matériel, donc le code continue de fonctionner sans modification. Seule la performance varie selon le matériel disponible.

Est-ce que Go devient aussi bas niveau que le C avec cette fonctionnalité ?

Pas vraiment, le garbage collector, le runtime et les goroutines restent inchangés. Go se rapproche du silicium tout en évitant la gestion mémoire manuelle et le maintien d'intrinsics par plateforme propres au C.

Peut-on déjà utiliser cette fonctionnalité en production ?

Pas encore vraiment, le package est expérimental et s'active via la variable GOEXPERIMENT=simd. L'API reste volontairement limitée, par exemple sans ReduceSum ni support SVE pour l'instant, ces éléments étant attendus pour Go 1.28.

Quel gain de performance peut-on réellement espérer ?

Cela dépend fortement de la part de code réellement vectorisable dans votre programme. Sur une boucle qui s'y prête, passer de 1 à 8 ou 16 éléments traités par instruction représente un gain d'un tout autre ordre de grandeur qu'une simple optimisation marginale.


Poursuivre la lecture

Streamer depuis une Freebox Ultra News
#freebox#streaming#golang

Streamer depuis une Freebox Ultra

Streamer les vidéos de sa Freebox sans copier les fichiers ni charger la box : voici comment un proxy maison résout le vrai problème derrière l'architecture.

Alexandre P.
Update du blog: bye bye NextJS, bonjour Go News
#update#nextjs#golang

Update du blog: bye bye NextJS, bonjour Go

Après plusieurs années sous NextJS, le blog dev freelance migre vers Go. Retour sur cette transition et son impact sur les performances du site.

Alexandre P.