L'École Gray Scott

Jour 4 — Kokkos sur CPU

25 juin, avec Paul Zehner, Juan-José Silva Cuevas et Thomas Padioleau : Kokkos sur CPU — une seule source C++, des backends choisis à la compilation, Views, parallel_for et SIMD.

25 juin 2026 · Intervenants : Paul Zehner, Juan-José Silva Cuevas & Thomas Padioleau (Maison de la Simulation, CEA) · Auditorium Marcel Vivargent + sites satellites (dont la CINERI). Le TP du jour vit dans GrayScott2026/day-4/exercises/CPU uniquement : les exercices gpu* attendront le Jour 9. Bonus rare : le cours lui-même est dans le dépôt (courses/kokkos_cpu.tex, thème beamer Gray-Scott).

Session du matin — du séquentiel au premier noyau

1. Pourquoi Kokkos

Le cours ouvre sur les promesses — et elles sont précises. Kokkos vise les 3P : Performance (le meilleur d'un matériel donné), Portabilité (le même code sur des matériels différents), Productivité (écrire, maintenir, étendre vite) — et y ajoute la maturité (production, pas un produit de recherche), la communauté, la longévité et l'interopérabilité (I/O, algèbre linéaire, ML).

ApprocheTourne surVous écrivez
CUDA / HIP brutsle GPU d'un seul vendeurdes kernels bas niveau
OpenMP / OpenACCCPU (+ certains GPU)des directives sur les boucles
std::execution::pardépend du compilateurdes algorithmes standard
KokkosCPU + GPU NVIDIA / AMD / Inteldes patrons C++ + Views

2. La thèse : un code, des backends

une seule source Kokkosparallel_for + lambda + Viewchoix du backend À LA COMPILATION-DKokkos_ENABLE_…=ONaujourd'hui — CPUSerialOpenMPThreadsJour 9 — GPUCUDAHIPSYCLPerformance · Portability · Productivity
La thèse de Kokkos : le même code, recompilé avec un autre flag, vise un autre matériel — aujourd'hui les backends CPU, au Jour 9 les GPU

3. Le TP démarre : hello_worldsequential

La progression du dépôt est pensée pour isoler chaque idée. hello_world vérifie l'installation (init/finalize via Kokkos::ScopeGuard) ; sequential pose le Gray-Scott séquentiel de référence — l'étalon contre lequel toutes les variantes seront comparées. L'infrastructure partagée vit dans common/ (paramètres CLI11, écriture des sorties, helpers).

Session de l'après-midi — Views, parallélisme, SIMD

4. View — le conteneur qui abstrait la mémoire

Pourquoi un conteneur abstrait ? Le cours répond : plus d'allocation manuelle, une sémantique mémoire unifiée CPU/GPU, l'allocation vendeur cachée, des capacités avancées (layout abstrait, sous-tableaux, multidimensionnel) et de la sûreté (vérifications compile/runtime).

Kokkos::View<double**> · tableau logique 3 × 4LayoutRight — lignes d'abord (le row-major du C)123456789101112LayoutLeft — colonnes d'abord (le column-major de Fortran)147102581136912défaut : Right sur CPU, Left sur GPU — Kokkos choisit le layout qui va au matérielv(i, j) — le noyau ne change pas
La View sépare l'indexation logique v(i, j) de l'ordre mémoire réel : changer de layout ne change pas une ligne du noyau

La boucle est bouclée avec les Jours 2-3 : le layout était le plus gros levier — Kokkos en fait un paramètre de type, réglé par défaut sur ce qui va au matériel.

5. parallel_for et parallel_reduce

Le noyau devient une lambda passée à un patron parallèle, avec une politique d'itération :

Kokkos::parallel_for("compute",
  Kokkos::MDRangePolicy<Kokkos::Rank<2>>({1, 1}, {rows - 1, cols - 1}),
  KOKKOS_LAMBDA (int i, int j) {
    u_temp(i, j) = u(i, j) + dt * (/* … le stencil … */);
  });

La réduction (somme de contrôle du champ) suit le même patron avec parallel_reduce — la version parallèle et sûre de l'accumulation.

6. Basculer sur le backend CPU

L'exercice cpu active OpenMP (-DKokkos_ENABLE_OPENMP=ON) : mêmes Views, mêmes lambdas, tous les cœurs. Honnêteté du dépôt : le fichier porte un avertissement explicite — cette version « ne tourne que sur CPU, ce n'est pas encore du Kokkos portable ». Ce qui manque pour le GPU (layouts, transferts, fence) est exactement le programme du Jour 9.

BackendFlag
Serial-DKokkos_ENABLE_SERIAL=ON
OpenMP-DKokkos_ENABLE_OPENMP=ON
Threads-DKokkos_ENABLE_THREADS=ON

7. SIMD — la vectorisation explicite, version Kokkos

L'exercice cpu_simd descend d'un cran : les types Kokkos::Experimental::simd empaquettent simd_width = SimdType::size() valeurs par opération, chargées depuis les Views (simd_flag_default). C'est le même parallélisme intra-cœur qu'au Jour 1 — et l'avant-goût direct d'EVE au Jour 6.

8. Vérifier, toujours

scripts/check_outcome.sh rejoue chaque implémentation sur le cas 10 × 10 et compare les checksums ; scripts/run_all.sh lance toutes les variantes d'un build. La règle du Jour 1 (équivalence séquentiel/parallèle) est ici outillée.

Le TP — GrayScott2026/day-4/

Dépendances : CMake ≥ 3.28, Kokkos ≥ 5.1.1, HDF5 (C++), CLI11. Deux voies :

# 1) dépendances gérées par CMake (sauf HDF5)
cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_DOWNLOAD_FALLBACK=ON -DHDF5_ROOT=…
cmake --build build --parallel $(nproc)

# 2) vérifier une implémentation
bash exercises/scripts/check_outcome.sh build/cpu/gray_scott_cpu

Des images Docker officielles (CPU : interactive, jupyter, vscode, code_server) sont listées dans le README du dépôt.

En vidéo — le replay officiel

Replay — Kokkos On CPU and GPU (Gray Scott Thursdays)

Sources & matériel officiel

Copyright © 2026