L'École Gray Scott

Jour 9 — Kokkos sur GPU

2 juillet, dernier jour : Kokkos sur GPU avec Paul Zehner, Juan-José Silva Cuevas et Thomas Padioleau — layout, transferts, recouvrement async — puis l'histoire de la racine cubique et la clôture.

2 juillet 2026 — dernier jour · Matin : Paul Zehner, Juan-José Silva Cuevas & Thomas Padioleau (Maison de la Simulation, CEA) — Kokkos on GPU · 17 h : Vincent LafageA story about cubic root optimisation in C++ and Fortran · puis la présentation de clôture. Le TP reprend le dépôt du Jour 4 (day-4/exercises/), côté gpugpu_asyncgpu_async_more.

Session du matin — Kokkos atteint l'accélérateur

1. Une source, tous les backends

Le noyau Kokkos du Jour 4 atterrit sur le GPU : le backend est choisi à la compilation — OpenMP pour les cœurs CPU, CUDA (NVIDIA), HIP (AMD), SYCL (Intel). Le même Gray-Scott tourne sur une station, sur un nœud Jean-Zay (GPU Volta), ou demain sur un accélérateur AMD.

2. La portabilité n'est pas gratuite

La leçon honnête du jour. Le Kokkos « CPU » du Jour 4 portait un avertissement explicite dans le code : il ne tourne que sur CPU, il n'est pas encore portable. Atteindre le GPU a exigé deux ajustements :

  • Kokkos::LayoutRight sur les View et Iterate::Right dans la politique, pour que des threads voisins lisent des adresses voisines — la coalescence mémoire du Jour 6. Un layout qui l'ignore effondre la bande passante GPU.
  • La gestion explicite hôte↔device.

Kokkos garantit qu'un seul code compile et tourne partout, pas qu'il soit rapide partout.

3. Faire voyager les données

auto u_h = Kokkos::create_mirror_view(u);  // tampon hôte associé à la View device
Kokkos::deep_copy(u_h, u);                  // device → hôte, seulement au besoin
Kokkos::fence("wait for compute");          // les noyaux sont asynchrones

Minimiser ces transferts, c'est le « couper les allers-retours » du Jour 2, transposé au bus PCIe.

4. Recouvrir : gpugpu_asyncgpu_async_more

VarianteIdée
gpude base : calcul sur device, copies synchrones
gpu_asyncécriture asynchrone — l'I/O recouvre le calcul suivant
gpu_async_moresynchronisation et écriture asynchrones — transferts masqués au maximum
gpu — synchrone : chaque copie bloque le calculgpu_async / gpu_async_more — l'écriture recouvre le calcul suivanttemps gagnécalcul (device)copie D→H + écriture HDF5temps →
Le recouvrement : les noyaux Kokkos sont asynchrones par nature — en écrivant l'image n pendant le calcul de n+1, les transferts disparaissent du chemin critique

Fin d'après-midi (17 h) & clôture

La racine cubique — le dernier mot

L'exposé final optimise une racine cubique en C++ et en Fortran — rebouclant sur le Jour 3, et nouant la semaine : le compilateur, le langage, la mesure, et ne jamais se fier à l'intuition avant d'avoir chronométré.

L'arc de l'optimisation — la clôture

Des fondations CPU (Jour 1) au noyau GPU portable (aujourd'hui), l'école a tracé un seul arc : le même Gray-Scott, rendu plus rapide étape par étape — vectorisation, multicœur, Fortran, do concurrent, Python, et enfin Kokkos — à résultat numérique constant. La leçon n'est ni un langage ni une API : c'est une méthode. Mesurer, trouver le facteur limitant, exploiter le matériel.

En vidéo — le replay officiel

Replay — Kokkos on GPU (Gray Scott Thursdays)

Sources & matériel officiel

Copyright © 2026