L'École Gray Scott

Jour 8 — Fortran sur GPU

1er juillet, avec Vincent Lafage : le Fortran standard sur GPU via do concurrent, comparé à OpenACC et OpenMP target — mesuré en local sur GTX 1650 — puis la session polyglotte Julia · Rust · C++ · pixi de Pierre Aubert.

1er juillet 2026 · Matin : Vincent Lafage (IJCLab) — Fortran 2018 on GPU · 17 h : Pierre Aubert (LAPP) — Julia … in Rust … and C++ … with pixi ? · Auditorium Marcel Vivargent + satellites (dont la CINERI). Le TP reprend le dépôt du Jour 3 (day-3-a/), côté GPU/ cette fois — toutes les mesures ci-dessous sont reproduites en local (nvfortran + GTX 1650).

Session du matin — le Fortran standard sur GPU

1. do concurrent : du CPU au GPU sans changer une ligne

Le pont du Jour 3 est franchi. Les boucles do imbriquées du Laplacien deviennent un do concurrent — une construction du standard ISO qui affirme que les itérations sont indépendantes, donc exécutables dans n'importe quel ordre.

do concurrent (i = 2:nx-1, j = 2:ny-1)
   lap_u = sum(stencil * U0(i-1:i+1, j-1:j+1))
   U1(i,j) = U0(i,j) + dt * (Diffusivity_u*lap_u - U0(i,j)*V0(i,j)**2 &
                             + Feed_Rate*(1.0_pr - U0(i,j)))
end do

Aucune directive, aucune API — du Fortran pur. Avec -stdpar=gpu, nvfortran génère un noyau, alloue les tableaux en mémoire unifiée et déplace les données tout seul.

2. Trois back-ends d'offload, une seule source

VarianteMécanismeFlag cléCible
stdpardo concurrent-stdpar=gpuGPU
stdpardo concurrent-stdpar=multicorecœurs CPU
openaccdirectives !$acc-accGPU
openmp_offload!$omp target-mp=gpuGPU

-gpu=ccnative vise la compute capability du GPU présent ; -Minfo=accel fait dire au compilateur quelles boucles il a offloadées — le premier réflexe de diagnostic.

une seule source Fortrando concurrent — ISO, zéro directivenvfortran — le flag choisit la cible-stdpar=gpu1,12 s-acc1,46 s-mp=gpu1,55 s-stdpar=multicore53,85 s×48mesuré sur GTX 1650 · 1024² · 4000 pas
Le même do concurrent, quatre flags : le standard ISO égale les directives sur GPU, et le GPU écrase le CPU multicœur (×48)

3. Le piège HDF5

Les fichiers de modules Fortran (.mod) ne sont pas portables entre compilateurs : un HDF5 compilé avec gfortran est illisible par nvfortran. Soit on recompile HDF5 avec nvfortran, soit on désactive la sortie (do_write = .false.) pour chronométrer le noyau GPU pur.

4. Mesurer, puis comparer

Mesuré sur une GeForce GTX 1650 (grille 1024×1024, 4000 pas, HDF5 off) :

VarianteFlagTempsAccélération
do concurrent → GPU-stdpar=gpu1,12 s× 48
OpenACC → GPU-acc1,46 s× 37
OpenMP target → GPU-mp=gpu1,55 s× 35
do concurrent → CPU (≈ 7 cœurs)-stdpar=multicore53,85 sréférence

Le GPU écrase le CPU multicœur (~× 48), et les trois back-ends se tiennent en moins de deux dixièmes — le do concurrent standard égale les directives tout en restant du Fortran pur.

Gray-Scott : GPU vs CPU (GTX 1650, 1024×1024, 4000 pas)
do concurrent → GPU
1,12 s
OpenACC → GPU
1,46 s
OpenMP target → GPU
1,55 s
do concurrent → CPU (~7c)
53,85 s

La barre CPU écrase les trois barres GPU — l'offload divise le temps par ~48.

Session de clôture (17 h) — Julia · Rust · C++, réunis par pixi

La journée se termine par une session ouverte : peut-on faire cohabiter Julia, Rust et C++ pour le même calcul, dans une seule chaîne d'outils reproductible ? Aucun langage ne possède le HPC — Julia pour le prototypage haut niveau, Rust pour la performance système sûre, C++ l'incontournable. pixi est la réponse : il fige compilateurs, CUDA et les runtimes Julia/Rust dans un unique lockfile, pour que les trois mondes tournent côte à côte. La leçon dépasse Gray-Scott : c'est la méthode qui se transfère, pas la syntaxe.

En vidéo — les replays officiels

Replay — Fortran On GPU (Gray Scott Thursdays)
Replay — Introduction to Rust (Gray Scott Thursdays), en écho à la session polyglotte

Sources & matériel officiel

Copyright © 2026