Ou comment vectra lance un topic de vectorisation
Bon alors, la vectorisation c'est le bien, alors il faut en mettre partout
Ce petit topic pour rassembler un minimum de documentation et de tutoriels sur la question, et aussi poser vos questions aux Men In Black sans pour autant dégoûter le reste des tauliers du topic de la programmation.
In a nutshell: la plupart des CPU Desktop possèdent dorénavant des unités de calcul vectorisées, qui ont remplacé presque toutes les unités scalaires depuis genre 1999 (pour le SSE). Maintenant, le scalaire est implémenté par une sous-partie du vectorisé, donc autant y aller franco.
Alors les unités vectorisées, qu'est-ce à dire? Visiblement, les fondeurs n'ont rien trouvé de plus drôle à faire que de rajouter des séries d'additionneurs, de multiplicateurs (etc) dans les unités d'addition, de multiplication (etc). Et donc, cette chaine d'unités peut fonctionner en simultané, chaque sous-unité ne traitant que les deux opérandes dont elle a la charge.
En conséquence, vous pouvez programmer une série d'opérations similaires qui vont s'effectuer en une seule passe sur des séries de nombres. L'addition flottante, par exemple, prend 3 cycles CPU pour traiter deux nombres flottants: on parle alors d'opération scalaires et d'opérandes scalaires, soit le mode par défaut quand vous écrivez un programme.
Hé bien figurez vous que l'addition vectorielle, traitant par exemple deux vecteurs de 4 flottants chacun, ne va prendre que 3 cycles CPU. Pas 12: 3.
Les additions se font en parallèle. Donc ouais, potentiellement, on peut réduire la durée en cycles CPU des calculs arithmétiques (entre autres) d'un facteur égal à la longueur du vecteur.
Bon, on a vu que les unités vectorisées, c'était du concret, du matos. Mais ces vecteurs alors? Hé bien, Intel et les autres rigolos ont fourni des jeux d'instructions assembleur et de registres assembleur qui permettent de programmer directement en vectorisé. On verra comment laisser ça aux masochistes et aux trve elite en se contentant de programmer ça en C via les Intrinsics.
Parmi ces jeux, on distingue le MMX (l'historique, celui du Pentiom 1, dont tout le monde se foutait à l'époque), le SSE qui rigole moins (v1 à 4 au moins), et le récent AVX.Les instructions: on vient d'en voir une, implémentée par une unité vectorisée flottante. Ben le vecteur, il est implémenté comme un long registre dont un set est fourni avec le jeu disponible sur notre CPU. Pour info, on ne perd jamais de fonctionnalité sur un processeur Intel/AMD: si vous avez l'AVX, vous avez du SSE4/3/2/1 et du MMX, donc au final ça vous fait du peuple, et en registres, et en instructions assembleur/intrinsics.
Sur le SSE4, vos registres ne font "que" 128 bits, et vos unités vectorisées ne peuvent pas traiter plus grand. Ca vous permet déjà de stocker 4 flottants 32 bits en simple précision, 2 flottants 64 bits, 8 variables 16 bits, et 16 char. Sur l'AVX (dispo dès le Core i5 2500k en gros), ces registres passent à 256 bits: ça rigole déjà moins dans le fond, hein
Si j'ai bien compris, depuis Sandy jusqu'à Skylake, on reste encore en 256 bits: seul le jeu d'instruction a été progressivement étendu de notre point de vue. Par contre, le Xéon Phi pour les grands (Intel Mic, Knight's Corner, etc) est le premier à implémenter des registres et instructions en 512 bits. Ca doit faire pile une ligne de cache mémoire, si j'ai bien compris.
Les instructions c'est bien, mais la mémoire?
Rien ne sert d'accélérer encore l'arithmétique si vous faites beaucoup d'accès mémoire. Le CPU en scalaire est déjà très limité par la mémoire pour des calculs simples sur de grands flux de données, en audio, en vidéo, en grosse 2-D, en 3-D, etc. On parle alors de streaming.
C'est pourquoi beaucoup de tutoriaux parlent par exemple de fractales de Mandelbrot, où qu'on fait plein de calculs en arithmétique complexe pour décider de la couleur d'un pixel, avant de l'écrire en mémoire. Dans ce cas de figure, les SSE/AVX font merveille, et parviennent à réduire le temps de calcul qui occulte le temps d'accès à la mémoire.
Mais le SSE a aussi été l'occasion de régler ce problème très chiant de bande passante mémoire pour des algos multimédia (MMX à l'origine). Le SSE fournit des instructions pour contourner carrément le cache, ce qui peut par exemple doubler les perfs en écriture (ouais, sans déconner) par rapport à un code trivial. Le SSE permet aussi de s'adresser au prefetcher (...)
Des tutoriels pour commencer:
Insérer ici une liste de tutos
Alab m'a envoyé des candidats, ça arrive.
Des docs de référence pour continuer:
une liste exhaustive et bien lisible des intrinsics selon Intel: https://software.intel.com/sites/lan...trinsicsGuide/
En cas d'erreur trop flagrante, je corrigerai!