Jour 6 — SIMD avec EVE + architecture GPU
29 juin 2026 — la semaine 2 s'ouvre · Matin : Joël Falcou (LISN, CodeReckons) — C++ 20 Computing with EVE + Kiwaku · Après-midi (14 h) : Pierre Aubert (LAPP) — GPU Architecture, massively parallel computing · Auditorium Marcel Vivargent + satellites (dont la CINERI). Le TP du jour vit dans
GrayScott2026/day-6/— les fichiers d'exercice de Falcou + la bibliothèque EVE clonée.
Session du matin — EVE + Kiwaku, le SIMD assumé
1. Le problème : un parallélisme fragile
Un seul cœur traite déjà plusieurs flottants par instruction (8 en AVX2, 16 en AVX-512) — c'est orthogonal au multithreading. Mais ce parallélisme est fragile : l'auto-vectorisation du compilateur n'est pas garantie (le Jour 3 a montré des boucles refusées), et les intrinsics écrits à la main ne survivent pas au changement de jeu d'instructions. La réponse de Falcou : en faire un type.
2. eve::wide — le registre devient un type C++
Premier exercice du TP, basic.cpp — sept lignes qui contiennent toute la thèse :
eve::wide<float, eve::fixed<8>> x( [](auto i, auto) { return 1.f + i; } );
std::cout << "EVE is optimizing for: " << eve::current_api << "\n";
std::cout << eve::sqrt(eve::abs(1 - x)) << "\n"; // les 8 voies d'un coup
eve::current_api imprime l'ISA détectée à la compilation — le même source émet de l'AVX2
ici, de l'AVX-512 ou du NEON ailleurs.
3. La progression du TP
| Fichier | Ce qu'il enseigne |
|---|---|
basic.cpp | wide, les fonctions mathématiques vectorielles, current_api |
math.cpp | les familles de fonctions EVE sur un vrai tableau |
hypot.cpp | précision et performance : l'hypoténuse naïve vs robuste, vectorisées |
bilateral.cpp | un filtre bilatéral d'image — SIMD sur un algorithme réel |
gray_scott.cpp | le stencil du cours, vectorisé à la main |
4. Le Gray-Scott EVE — la vectorisation garantie
Le noyau final charge les neuf voisins en wide et enchaîne les FMA explicites :
auto u = eve::load(&su[i]);
auto full_u1 = w00 * (eve::load(&su[i - W - 1]) - u); // 8 cellules à la fois
full_u1 = eve::fma(w12, (eve::load(&su[i + 1]) - u), full_u1);
// … les 9 termes du stencil, fusionnés en chaînes de FMA
Ce que le Jour 3 obtenait en négociant avec -fopt-info-vec, EVE l'obtient par
construction — la vectorisation n'est plus un espoir, c'est le type qui l'impose.
5. Kiwaku — les conteneurs qui vont avec
Même auteur, étage au-dessus : Kiwaku fournit les conteneurs et vues multidimensionnels (shape, strides, adaptation au matériel) pensés pour brancher EVE dessus — le duo annoncé « containers » de la session. Encore jeune, mais la direction est claire : un code d'algorithme, des cibles.
Session de l'après-midi — l'architecture GPU (14 h)
6. Changer de philosophie
À 14 h, Pierre Aubert retourne la perspective : le CPU cache la latence (gros caches, peu de cœurs puissants) ; le GPU la noie sous le nombre — des dizaines de Streaming Multiprocessors, des centaines de cœurs simples chacun, et des threads qui avancent par warps de 32.
7. La hiérarchie mémoire du GPU
La session détaille les trois étages qui commanderont tout le reste de la semaine : registres (par thread), mémoire partagée (par SM — le « cache géré à la main »), et mémoire globale (HBM) dont les accès doivent être coalescés : les 32 threads d'un warp lisent des adresses voisines, ou le débit s'effondre. C'est la leçon de layout des Jours 2-4, transposée à 32 voies.
8. nvc++ en éclaireur, puis les Jours 7-9
La journée se clôt (15 h, Pierre Aubert encore) par un éclaireur : nvc++ compile du C++17
standard directement pour le GPU depuis 2020 — std::transform + politiques d'exécution
parallèles, sans bibliothèque externe. C'est l'esprit stdpar qu'on retrouvera en Fortran au
Jour 8 (do concurrent).
Tout est en place : Python sur GPU demain (Jour 7), Fortran sur GPU (Jour 8), Kokkos sur GPU (Jour 9) — trois langages, une seule architecture cible, celle de cet après-midi.
Le TP — GrayScott2026/day-6/
EVE est header-only : cloner et compiler suffit.
cd GrayScott2026/day-6
g++ -std=c++20 -O3 -march=native -I eve/include basic.cpp -o basic
./basic # → "EVE is optimizing for: X86 AVX2" (selon ta machine)
Puis dérouler math.cpp, hypot.cpp, bilateral.cpp et gray_scott.cpp dans le même
moule. Sur la machine du TP local : AVX2 détecté, 8 floats par instruction.
En vidéo — les replays officiels
Sources & matériel officiel
- Les slides d'EVE (le cours en ligne de Joël Falcou) : events.codereckons.com/eve
- Le PDF du jour (wiki GitLab de l'école) : gray_scott.pdf
- Les bibliothèques : github.com/jfalcou/eve · github.com/jfalcou/kiwaku
- Replays vidéo (YouTube) : Gray Scott Thursdays
- Site de l'école : GrayScott2026
Jour 5 — Python sur CPU
26 juin, avec Alice Faure, Jean-Marc Colley, Sébastien Valat et Nabil Garroum : profiler Python, vectoriser avec NumPy, compiler avec Numba, puis tracer avec JAX — jusqu'à ×18 sans quitter Python.
Jour 7 — Python sur GPU
30 juin, quatre sessions avec Alice Faure, Jean-Marc Colley, Sébastien Valat et Nabil Garroum : CuPy, cuPyNumeric et JAX portent le Gray-Scott du Jour 5 sur l'accélérateur — chiffres A100 officiels à l'appui.