Exploiter la concurrence et le parallélisme de Go
- Présentation d’un projet visant à améliorer les performances de calcul numérique en exploitant la concurrence et le parallélisme de Go.
- Les instructions SIMD (Same Instruction Multiple Data) permettent d’effectuer des calculs parallèles au niveau matériel.
- Le compilateur de Go n’exploite pas SIMD, et faute d’avoir trouvé un package SIMD généraliste adapté, l’auteur a décidé d’en développer un lui-même.
Langage assembleur Plan9
- Go utilise son propre langage assembleur, appelé Plan9, qui reprend les instructions et registres des plateformes cibles avec quelques adaptations.
- Plan9 pour x86 et Plan9 pour ARM sont différents.
- Les bases de son utilisation sont expliquées à travers un exemple simple de Plan9.
Exemple Plan9
- Les fichiers
AddInts_amd64.s et main.go servent à expliquer les bases de la déclaration et de l’utilisation des fonctions en Plan9.
- Le texte décrit comment stocker les arguments de fonction et les valeurs de retour sur la pile selon la convention d’appel de Go.
Plan de conception du package
- Conception d’un package fournissant une fine couche d’abstraction pour les opérations SIMD arithmétiques et bit à bit.
- Création d’un package interne contenant des implémentations Plan9 propres à chaque architecture, configurées via une fonction d’initialisation.
Exemple SIMD
- Un exemple de fonction Plan9 SIMD sur x86 montre comment utiliser SIMD.
- Les fichiers
Supported_amd64.s et AddFloat32_amd64.s illustrent comment vérifier la prise en charge de SSE et effectuer une addition sur des float32.
Performances et suite
- Un graphique comparant l’implémentation logicielle en Go et l’implémentation SIMD en Plan9 montre un gain de vitesse d’environ 200 à 450 %.
- L’auteur espère que ce mémo inspirera d’autres projets utilisant Plan9 et SIMD.
# Résumé de GN⁺
- Cet article présente une méthode pour maximiser les performances en exploitant la concurrence et le parallélisme de Go.
- Il explique comment effectuer des calculs parallèles au niveau matériel à l’aide du langage assembleur Plan9 et des instructions SIMD.
- Il ouvre aux développeurs Go des pistes d’utilisation de Plan9 et de SIMD, utiles pour explorer de nouvelles approches d’optimisation des performances.
- Parmi les projets comparables, il recommande des bibliothèques de prise en charge SIMD en Rust ou des bibliothèques SIMD liées à C++.
1 commentaires
Commentaires Hacker News
Explication de
NOSPLIT: une syntaxe particulière en assembleur Go qui décrit la taille de la frame et la taille des arguments-, et il ne s’agit pas d’une soustraction mathématiquego vetvérifie que la taille des arguments est correcteAvis sur l’interprétation des LLM (grands modèles de langage) : il peut y avoir des malentendus dans l’interprétation du code
Mention du langage d’assembleur interne de Go, « Plan9 » : Go utilise son propre langage d’assembleur
intest en 64 bits, et si l’on utiliseint32, il est aligné sur un mot dans la liste des argumentsNOSPLITest défini danstextflag.het n’est valable que dans le runtimeExplication de Rob Pike sur la conception de l’assembleur Go : créer un langage d’assembleur commun pour pouvoir communiquer avec la machine sans devoir apprendre une nouvelle syntaxe
Avis sur l’usage de fonctions pour les opérations SIMD : il faudrait des fonctions capables d’effectuer des opérations SIMD sur des slices
forPhilosophie de conception du compilateur Go : viser un compilateur simple et rapide plutôt qu’un compilateur complexe
Avis sur l’utilisation du GPU pour les opérations SIMD : un GPU peut être plus adapté aux opérations SIMD grâce au traitement parallèle et aux calculs matriciels