Leçon 22 : Conditions de course en mémoire globale — pourquoi les atomics sont nécessaires
Jusqu'ici, presque tous les kernels que tu as écrits donnaient à chaque thread sa PROPRE case de sortie : c[i] = a[i] + b[i], où le thread i est le seul à jamais toucher c[i]. Comme aucune paire de threads ne partage une destination, l'ordre dans lequel ils tournent n'a pas d'importance — le résulta
Imagine 30 enfants qui partagent une seule feuille de comptage affichant 5. Deux la regardent ensemble, les deux voient 5, les deux écrivent 6 — et un comptage a disparu. Une opération atomique est une règle où un seul enfant tient le crayon à la fois (lire, ajouter, écrire), ainsi aucun comptage n'est perdu.
- condition de course (race condition)
- Un bug où le résultat dépend du timing et de l'ordre imprévisibles avec lesquels les threads touchent les mêmes données — ça peut fonctionner à une exécution et échouer à la suivante.
- lecture-modification-écriture (read-modify-write)
- x++ est en réalité trois étapes — lire x, ajouter 1, et écrire x. Un autre thread peut s'insérer entre ces étapes.
- mise à jour perdue (lost update)
- Deux threads lisent la même ancienne valeur et les deux écrivent en retour, donc l'un des incréments disparaît simplement et le comptage sort trop bas.
- opération atomique (atomic operation)
- Un read-modify-write indivisible qu'aucun autre thread ne peut interrompre — la solution à une course, par exemple atomicAdd.