Jour 1 — Fondations
1. Le CPU
Un processeur est composé de plusieurs cœurs indépendants. La fréquence d'horloge stagne depuis ~2005 (limite thermique) ; la performance vient désormais du nombre de cœurs, ce qui rend le parallelisme incontournable.
La performance provient du nombre de cœurs, non de la fréquence brute.
2. La compilation
La compilation traduit le C++ en code machine avant l'exécution, avec optimisation. Ses quatre étapes : préprocesseur, compilation (assembleur + optimisation), assemblage, édition de liens. L'optimisation et la vectorisation naissent à la compilation.
Options recommandées : -O3 -march=native. Sans optimisation (-O0), le code peut être un
ordre de grandeur plus lent.
3. La vectorisation (SIMD)
Single Instruction, Multiple Data : une instruction traite plusieurs valeurs à la fois. Le compilateur la génère automatiquement quand la boucle est régulière (accès contigus, sans dépendances).
Gain typique : ×4 à ×16 selon la largeur des registres (SSE 128 bits, AVX2 256 bits, AVX-512 512 bits).
4. Concurrence et parallélisme
| Concurrence | Parallélisme | |
|---|---|---|
| Objectif | masquer l'attente (E/S, réseau) | accélérer le calcul |
| Matériel | possible sur un seul cœur | exige plusieurs cœurs |
| Domaine | serveurs, E/S asynchrones | calcul intensif |
La concurrence est un outil de structuration ; le parallélisme en est le résultat lorsque le matériel le permet.
5. Memory-bound et compute-bound
- Compute-bound — limité par les unités de calcul → ajouter des cœurs aide.
- Memory-bound — limité par la bande passante ; les cœurs attendent les données → l'ajout de cœurs n'apporte qu'un gain marginal.
L'intensité arithmétique (opérations par octet chargé) détermine le régime. Les stencils ont une faible intensité arithmétique et sont généralement memory-bound. Outil d'analyse de référence : le roofline model.
Ordres de grandeur typiques — un accès RAM coûte ~100× un hit L1.
6. La pureté
Une fonction est pure lorsque sa sortie ne dépend que de ses entrées, sans effet de bord. Un calcul pur n'a pas de dépendance cachée : il est parallélisable sans data race. Un schéma à double tampon (lecture d'un tableau, écriture d'un autre) est pur et trivialement parallèle.
La pureté est ce qui autorise la parallélisation sans bug.
7. Tests unitaires en calcul scientifique
Les arrondis flottants interdisent la comparaison exacte. Trois règles guident la validation :
1. Comparaison avec tolérance |a − b| < ε (jamais d'égalité stricte)
2. Vérification d'invariants énergie, symétrie, absence de NaN, cas analytique
3. Équivalence séq. / parallèle une divergence révèle une data race
Présentation CINERI
La présentation de la CINERI en direct à toute la Gray Scott School 2026 — session spéciale du 25 juin, retransmise sur le live officiel.
Jour 2 — C++ sur CPU
Deux sessions le 23 juin : C++ 17/20/23 sur CPU le matin, optimisation avancée (blocking & Pyramide) l'après-midi. Mesurer, comprendre le stencil, exploiter le cache.