L'École Gray Scott

Jour 3 — Fortran sur CPU

24 juin, avec Vincent Lafage : Fortran 2018 sur CPU toute la journée — le langage des tableaux, la précision flottante, l'exercice des flags, et le solveur Gray-Scott en Fortran moderne.

24 juin 2026 · Intervenant : Vincent Lafage (IJCLab) · Auditorium Marcel Vivargent + sites satellites (dont la CINERI) · au déjeuner, visite du Musée du LAPP. Le TP du jour vit dans GrayScott2026/day-3-a/CPU uniquement : les dossiers GPU/ et CUDA/ du même dépôt serviront au Jour 8.

Session du matin — Fortran moderne, le langage des tableaux

1. Fortran vit toujours

Le cours s'ouvre sur une démonstration par l'exemple : le dossier Annexe/ contient le même programme en FORTRAN 66 (obact66.f) et en Fortran 95 (obact95.f90), et un vrai plat de spaghetti historique (spaghetti.f) avec sa version dénouée (unspaghetti.f). Le langage de 1957 est devenu un langage moderne — modules, interfaces génériques, coarrays — sans perdre sa spécialité : les tableaux numériques.

2. Column-major — le piège venu du C

Première différence structurante avec le C/C++ : l'ordre mémoire.

Fortran — column-major1591317261014183711151948121620A(i, j) : i varie le plus vite → on descend les colonnesC/C++ — row-major1234567891011121314151617181920A[i][j] : j varie le plus vite → on parcourt les lignesdo j … do i … A(i, j) ⇔ for i … for j … A[i][j]
Le même tableau 2D, deux ordres mémoire : en Fortran, la boucle interne doit parcourir la PREMIÈRE dimension — l’inverse du C

Tout ce qu'on a appris au Jour 2 sur le parcours mémoire reste vrai — mais inversé : en Fortran, la boucle interne doit parcourir la première dimension. Un réflexe C recopié tel quel divise le débit.

3. Le solveur en quatre modules

Le Gray-Scott du TP est découpé proprement (src/) :

ModuleRôle
floating_point_precision.f90le kind pr — toute la précision du solveur en une ligne
gray_scott_settings.f90paramètres physiques + namelist (config sans recompiler)
hdf5_utils.f90écriture HDF5 des images
gray_scott.f90le programme : init → evolve → sortie

Le stencil du Laplacien est choisi parmi quatre variantes (isotropie vs précision) :

StencilCentreNote
Différences centrées−4le 5-points classique
Weights-pretty (défaut)−8isotrope, utilisé ici
Oono-Puri (1988)−12/4meilleure isotropie
Patra-Karttunen−20/6précis à l'ordre 4
Stencil du Laplacien — Weights-pretty (défaut)
1
1
1
1
-8
1
1
1
1

Le centre pèse −8, ses huit voisins +1.

4. Dire son intention au compilateur

Les mots-clés modernes sont des promesses que le compilateur sait exploiter : pure / elemental (pas d'effet de bord), contiguous (mémoire dense), do concurrent (itérations indépendantes — la clé des Jours 8-9), et les opérations tableau (sum(stencil * U(i-1:i+1, j-1:j+1))) qui disent quoi calculer, pas comment.

Session de l'après-midi — Précision, flags, variantes

5. La précision en une ligne

Le module de précision du TP tient en trois lignes — et c'est voulu :

module floating_point_precision
  use, intrinsic :: iso_fortran_env, only: pr => REAL32
end module

Changer REAL32 en REAL64 bascule tout le solveur. Ce qu'on échange :

REAL32 — ~7 chiffres significatifs1exposant · 8mantisse · 23 bitsREAL64 — ~16 chiffres significatifsexposant · 11mantisse · 52 bitsuse iso_fortran_env, only: pr => REAL32 ! une ligne pour tout basculer
IEEE 754 : la précision, c’est la largeur de la mantisse. Le module floating_point_precision du TP change tout le solveur en une ligne

6. La sommation compensée

L'ordre de sommation change le résultat flottant. Le TP implémente les quatre remèdes classiques (Solutions/compensated_summation.f90 — interfaces génériques 1D/2D) :

MéthodeIdée
sum_pairwisesommation récursive diviser-pour-régner
sum_Kahanon traîne un terme de compensation
sum_Neumaierrobuste quand le terme suivant est plus grand
sum_KBNKahan-Babuška-Neumaier, le défaut pratique
pour chaque x du tableauy = x − ct = s + yc = (t − s) − ys = tles bits perdus par l’addition, capturés dans c
La sommation de Kahan : on traîne un terme de compensation c qui récupère à chaque pas ce que l’arrondi vient de perdre

7. L'exercice des flags — mêmes sources, ×6 à ×8

Le script run_flags_exo.sh du TP fait la démonstration de bout en bout, mesures à l'appui :

  1. Détecter le SIMD du CPU (/proc/cpuinfo : AVX2 ? AVX-512 ?) ;
  2. C : speedcbrtf.c compilé scalaire (-O2 -fno-tree-vectorize) puis natif (-Ofast -march=native -ftree-vectorize -mrecip …) — on compte les registres ymm dans le binaire (objdump | grep -c ymm) pour prouver la vectorisation ;
  3. Fortran : gfortran -fopt-info-vec affiche les boucles vectorisées, et -fopt-info-vec-missed explique pourquoi une boucle est refusée.
cd GrayScott2026/day-3-a
pixi run bash run_flags_exo.sh    # « les mêmes sources, ×6-8 selon les flags »

C'est le premier acte de « l'histoire de la racine cubique » — dont le dernier mot sera dit en clôture du Jour 9. Pour aller plus loin : maqao cqa --fct-loops=loop_cbrt analyse la boucle au niveau assembleur (dossiers OptimisationCbrtC/ et OptimisationCbrtFortran/).

8. Les variantes du dépôt — un solveur, dix expériences

Solutions/ décline le même solveur pour isoler chaque idée :

VarianteCe qu'elle isole
preopenmpopenmpopenmp_bis (+ _ptr)la parallélisation !$omp pas à pas
blocking_ptrle blocking du Jour 2, en Fortran
RK / CKintégrateurs Runge-Kutta / Cash-Karp — la précision temporelle
stdpar / openacc / openmp_offloadles back-ends GPU — rendez-vous au Jour 8
VarianteMécanismeCible
openmpdirectives !$ompcœurs CPU
stdpardo concurrentCPU multicœur ou GPU
openacc / openmp_offloaddirectivesGPU (Jour 8)

9. Testé, sinon rien

Solutions/test_stencil.f90 vérifie les invariants du stencil (multiple du Laplacien, normalisation) avec tolérance — l'application directe des règles du Jour 1. Et l'Annexe/ montre les tests pFUnit (test_roman_numeral.pf, test_divisor.pf) : le framework de tests unitaires du monde Fortran.

L'Annexe — le cabinet de curiosités

La signature pédagogique de Vincent Lafage : santa_claus_problem_caf.f90 (le problème du Père Noël… en coarrays, le parallélisme natif de Fortran 2008), roman_numeral.F90 (+ ses tests), physconst.f90, decimal_interface.f90, et le duo spaghetti.f / unspaghetti.f qui résume 60 ans d'évolution du langage.

En vidéo — les replays officiels

Replay — Fortran On CPU (Gray Scott Thursdays)
Replay — Computing Precision : la précision flottante en pratique (Gray Scott Thursdays)

Sources & matériel officiel

Copyright © 2026