Concevoir des algorithmes SIMD à partir de zéro
(mcyoung.xyz)Conception d’algorithmes SIMD
- Explication de l’optimisation SIMD : SIMD signifie Single Instruction, Multiple Data et demande de raisonner comme un concepteur de circuits.
- Le SIMD est souvent mentionné à propos des performances et du HPC (calcul haute performance), mais ce n’est pas un sujet familier pour les débutants.
- Dans la plupart des langages de programmation, les API de programmation SIMD sont difficiles à utiliser.
- Les algorithmes SIMD sont difficiles à comprendre avec une approche de programmation procédurale, et la programmation fonctionnelle peut aider.
- Le texte porte sur vb64, une implémentation d’un codec base64 utilisant la bibliothèque
std::simdde Rust.
Limites physiques
- Les ordinateurs existent dans le monde réel et sont soumis aux lois de la physique.
- Aux débuts de l’informatique, on pouvait améliorer les performances en achetant un nouvel ordinateur.
- L’effet du Dennard scaling s’est effondré : des transistors plus petits impliquent une consommation d’énergie plus élevée.
- Augmenter le nombre de cœurs est devenu la nouvelle tendance. On peut améliorer les performances CPU via le multithreading, mais cela entraîne un surcoût de synchronisation.
Lenteur du code procédural
- Les cœurs de processeurs modernes n’exécutent pas le code ligne par ligne.
- Grâce au parallélisme au niveau des instructions, plusieurs opérations peuvent être effectuées simultanément en l’absence de dépendances de données.
- Le parallélisme augmente lorsque le compilateur peut résoudre les risques de dépendance.
- Les branchements et les opérations mémoire provoquent des stalls, ce qui ralentit le code.
SIMD et lanes
- SIMD et vecteur sont souvent utilisés comme synonymes.
- Les instructions SIMD utilisent comme unité de base des vecteurs, c’est-à-dire des tableaux de nombres de taille fixe.
- Chaque élément d’un vecteur est appelé une lane, et les vecteurs SIMD sont généralement de petite taille.
Opérations sur de vrais vecteurs
- Les vecteurs SIMD offrent des opérations plus complexes que les registres ordinaires.
- Les registres vectoriels prennent en charge diverses opérations, comme les opérations bit à bit, l’arithmétique par lane, les comparaisons par lane et les shuffles.
- Les shuffles sont essentiels en programmation SIMD pour déplacer les données vers les bonnes positions.
Fonctions intrinsèques et sélection d’instructions
- Lorsqu’on écrit du code SIMD, les opérations disponibles varient selon l’architecture.
- Le compilateur résout le problème de sélection d’instructions, c’est-à-dire choisir quelles instructions utiliser pour les opérations demandées par l’utilisateur.
- Écrire du code SIMD portable est complexe, mais la détection des fonctionnalités à l’exécution permet de générer le code optimal sur différents processeurs.
Analyse syntaxique avec SIMD
- Il est possible d’utiliser le SIMD pour analyser du texte, et cela peut être extrêmement rapide.
- L’implémentation d’un décodage base64 en SIMD peut servir d’exemple.
- Supprimer toutes les branches est la clé du processus de création d’une version SIMD.
L’avis de GN⁺
Le point le plus important de cet article est que la programmation SIMD, contrairement à la programmation procédurale classique, peut améliorer les performances en traitant les données en parallèle. Le SIMD est très important dans le domaine du calcul haute performance et, en particulier, comprendre comment l’utiliser efficacement dans des langages de programmation modernes comme Rust peut être un sujet très intéressant pour les ingénieurs logiciel. En effet, le SIMD permet d’apprendre à optimiser des algorithmes complexes et à surmonter les limites du matériel réel.
1 commentaires
Discussion sur Hacker News
_mm256_cvtps_epu32n’est pas une instruction AVX2 mais AVX-512, et en AVX1 les entiers existent sous forme signée, la bonne instruction étant_mm256_cvtps_epi32.