4 points par GN⁺ 2024-10-19 | 1 commentaires | Partager sur WhatsApp

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

 
GN⁺ 2024-10-19
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

    • La taille de la frame et celle des arguments sont séparées par -, et il ne s’agit pas d’une soustraction mathématique
    • L’outil go vet vérifie que la taille des arguments est correcte
  • Avis sur l’interprétation des LLM (grands modèles de langage) : il peut y avoir des malentendus dans l’interprétation du code

    • Certains estiment qu’une reconnaissance franche de l’auteur aiderait à l’apprentissage
  • Mention du langage d’assembleur interne de Go, « Plan9 » : Go utilise son propre langage d’assembleur

    • Sur amd64, int est en 64 bits, et si l’on utilise int32, il est aligné sur un mot dans la liste des arguments
    • NOSPLIT est défini dans textflag.h et n’est valable que dans le runtime
  • Explication 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

    • Il est possible de générer automatiquement un assembleur en utilisant comme entrée les manuels d’une nouvelle architecture
  • 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

    • Lorsqu’on additionne deux slices, on pourrait utiliser SIMD pour les traiter en parallèle au lieu d’une boucle for
  • Philosophie de conception du compilateur Go : viser un compilateur simple et rapide plutôt qu’un compilateur complexe

    • Le support x64 de base inclut SSE et SSE2, et privilégie la simplicité à la performance
  • 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

    • Cependant, cela peut ne pas convenir à Go en raison du manque de packages GPU et de communauté autour du sujet