[{"data":1,"prerenderedAt":684},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-gray-scott-school-jour-5":66,"-fr-gray-scott-school-jour-5-surround":679},[4,50,60],{"title":5,"path":6,"stem":7,"children":8},"L'École Gray Scott","/fr/gray-scott-school","fr/1.gray-scott-school/01.index",[9,10,14,18,22,26,30,34,38,42,46],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Présentation CINERI","/fr/gray-scott-school/presentation-cineri","fr/1.gray-scott-school/02.presentation-cineri",{"title":15,"path":16,"stem":17},"Jour 1 — Fondations","/fr/gray-scott-school/jour-1","fr/1.gray-scott-school/03.jour-1",{"title":19,"path":20,"stem":21},"Jour 2 — C++ sur CPU","/fr/gray-scott-school/jour-2","fr/1.gray-scott-school/04.jour-2",{"title":23,"path":24,"stem":25},"Jour 3 — Fortran sur CPU","/fr/gray-scott-school/jour-3","fr/1.gray-scott-school/05.jour-3",{"title":27,"path":28,"stem":29},"Jour 4 — Kokkos sur CPU","/fr/gray-scott-school/jour-4","fr/1.gray-scott-school/06.jour-4",{"title":31,"path":32,"stem":33},"Jour 5 — Python sur CPU","/fr/gray-scott-school/jour-5","fr/1.gray-scott-school/07.jour-5",{"title":35,"path":36,"stem":37},"Jour 6 — SIMD avec EVE + architecture GPU","/fr/gray-scott-school/jour-6","fr/1.gray-scott-school/08.jour-6",{"title":39,"path":40,"stem":41},"Jour 7 — Python sur GPU","/fr/gray-scott-school/jour-7","fr/1.gray-scott-school/09.jour-7",{"title":43,"path":44,"stem":45},"Jour 8 — Fortran sur GPU","/fr/gray-scott-school/jour-8","fr/1.gray-scott-school/10.jour-8",{"title":47,"path":48,"stem":49},"Jour 9 — Kokkos sur GPU","/fr/gray-scott-school/jour-9","fr/1.gray-scott-school/11.jour-9",{"title":51,"path":52,"stem":53,"children":54},"Projets","/fr/projets","fr/2.projets/1.index",[55,56],{"title":51,"path":52,"stem":53},{"title":57,"path":58,"stem":59},"SenLand","/fr/projets/senland","fr/2.projets/2.senland",{"title":61,"path":62,"stem":63,"children":64},"À propos","/fr/a-propos","fr/3.a-propos/1.index",[65],{"title":61,"path":62,"stem":63},{"id":67,"title":31,"badge":68,"body":69,"category":68,"description":668,"extension":669,"links":670,"meta":675,"navigation":494,"path":32,"seo":677,"stem":33,"tags":68,"__hash__":678},"docs_fr/fr/1.gray-scott-school/07.jour-5.md",null,{"type":70,"value":71,"toc":649},"minimark",[72,115,120,130,159,163,190,194,213,217,221,235,239,278,281,307,311,325,329,339,407,410,418,422,432,439,442,519,541,545,551,555,645],[73,74,75],"blockquote",{},[76,77,78,82,83,86,87,86,90,93,94,97,98,101,102,106,107,110,111,114],"p",{},[79,80,81],"strong",{},"26 juin 2026"," · Intervenants : ",[79,84,85],{},"Alice Faure",", ",[79,88,89],{},"Jean-Marc Colley",[79,91,92],{},"Sébastien Valat","\n& ",[79,95,96],{},"Nabil Garroum"," · Auditorium Marcel Vivargent + sites satellites (dont la CINERI). Le TP\nest une suite de ",[79,99,100],{},"six notebooks Jupyter"," (",[103,104,105],"code",{},"GrayScott2026/day-5/CPU/tutorial/",", solutions\nincluses) — le dossier ",[103,108,109],{},"GPU/"," attendra le ",[79,112,113],{},"Jour 7",".",[116,117,119],"h2",{"id":118},"session-du-matin-mesurer-puis-vectoriser","Session du matin — mesurer, puis vectoriser",[121,122,124,125,129],"h3",{"id":123},"_1-profiler-dabord-temps-et-mémoire","1. Profiler d'abord — temps ",[126,127,128],"em",{},"et"," mémoire",[76,131,132,133,136,137,86,140,143,144,150,151,154,155,158],{},"Fidèle à la règle du Jour 1, le premier notebook (",[103,134,135],{},"1_Optimization",") n'optimise rien : il\nmesure. Chronométrage (",[103,138,139],{},"timeit",[103,141,142],{},"cProfile","), puis — c'est la spécialité du jour, les slides\ns'appellent ",[126,145,146,147],{},"gray-scott-python-",[79,148,149],{},"mem"," — le ",[79,152,153],{},"profilage mémoire"," avec ",[103,156,157],{},"tracemalloc"," : en\nPython, chaque tableau temporaire est une allocation, et le Gray-Scott naïf en crée à chaque\npas de temps.",[121,160,162],{"id":161},"_2-le-gil-pourquoi-les-threads-ne-sauvent-pas-python","2. Le GIL — pourquoi les threads ne sauvent pas Python",[76,164,165,166,169,170,173,174,177,178,181,182,185,186,189],{},"Le ",[79,167,168],{},"Global Interpreter Lock"," sérialise les threads Python ",[126,171,172],{},"purs",". Le vrai parallélisme CPU\npasse par les bibliothèques qui ",[79,175,176],{},"libèrent le GIL"," pendant le calcul natif — NumPy, le\n",[103,179,180],{},"prange"," de Numba, XLA sous JAX — ou par ",[103,183,184],{},"multiprocessing",". Aucune accélération du jour ne\ncombat le GIL : elles descendent toutes ",[126,187,188],{},"sous"," lui, dans du code compilé.",[121,191,193],{"id":192},"_3-des-boucles-aux-tableaux","3. Des boucles aux tableaux",[76,195,196,197,200,201,204,205,208,209,212],{},"Notebooks ",[103,198,199],{},"2_Numpy"," et ",[103,202,203],{},"3_Python_Implementation"," : le Laplacien s'écrit en ",[79,206,207],{},"slices"," NumPy\n(",[103,210,211],{},"u[:-2, 1:-1] + u[2:, 1:-1] + … − 4*u[1:-1, 1:-1]",") — zéro boucle Python, les itérations\npartent dans les boucles C de NumPy. C'est la ligne de base du benchmark du jour.",[116,214,216],{"id":215},"session-de-laprès-midi-compiler-python","Session de l'après-midi — compiler Python",[121,218,220],{"id":219},"_4-numba-compiler-la-boucle-quon-a-déjà","4. Numba — compiler la boucle qu'on a déjà",[76,222,223,224,227,228,231,232,234],{},"Notebook ",[103,225,226],{},"4_Numba_Implementation"," : on garde la boucle explicite, on ajoute ",[103,229,230],{},"@njit",", et\nLLVM compile la fonction à la première exécution. Idéal quand l'algorithme est naturellement\nune boucle (stencils !) — et ",[103,233,180],{}," la parallélise.",[121,236,238],{"id":237},"_5-jax-tracer-puis-laisser-xla-fusionner","5. JAX — tracer, puis laisser XLA fusionner",[76,240,223,241,244,245,101,248,251,252,255,256,259,260,86,263,86,266,269,270,273,274,277],{},[103,242,243],{},"5_JAX",", le morceau de choix du jour. JAX impose une discipline en échange de la\nvitesse : tableaux ",[79,246,247],{},"immuables",[103,249,250],{},"u.at[i, j].set(v)"," au lieu de l'affectation), ",[79,253,254],{},"pas de\nvérification d'index"," (l'erreur silencieuse guette), et surtout des ",[79,257,258],{},"transformations\ncomposables"," — ",[103,261,262],{},"jit",[103,264,265],{},"vmap",[103,267,268],{},"grad"," — qui ne fonctionnent que sur des fonctions ",[79,271,272],{},"pures",".\nLe mécanisme derrière ",[103,275,276],{},"jax.jit"," :",[279,280],"d5-trace",{},[76,282,283,284,287,288,291,292,86,295,298,299,302,303,306],{},"Le notebook détaille les contraintes : arguments statiques à déclarer (",[103,285,286],{},"static_argnums","),\nformes fixes (chaque nouvelle forme retrace), débogage via ",[103,289,290],{},"jax.debug",", et les opérateurs de\ncontrôle de flux (",[103,293,294],{},"lax.cond",[103,296,297],{},"lax.fori_loop",") qui remplacent ",[103,300,301],{},"if","/",[103,304,305],{},"for"," dans le code tracé.",[121,308,310],{"id":309},"_6-porter-gray-scott-en-jax","6. Porter Gray-Scott en JAX",[76,312,223,313,316,317,320,321,324],{},[103,314,315],{},"6_JAX_Implementation"," : deux versions concurrentes — le ",[79,318,319],{},"stencil générique","\n(convolution 3×3 quelconque) et le ",[79,322,323],{},"stencil 3×3 spécialisé"," (les neuf termes écrits à la\nmain, que XLA fusionne en un seul noyau). Les deux colonnes JAX du benchmark, c'est elles.",[121,326,328],{"id":327},"_7-le-verdict-un-gray-scott-quatre-vitesses","7. Le verdict — un Gray-Scott, quatre vitesses",[76,330,331,332,335,336,277],{},"Chiffres officiels du dépôt (",[103,333,334],{},"CPU/Benchmarks.md","), ",[79,337,338],{},"32×1000 itérations",[340,341,342,365],"table",{},[343,344,345],"thead",{},[346,347,348,352,356,359,362],"tr",{},[349,350,351],"th",{},"CPU",[349,353,355],{"align":354},"center","NumPy",[349,357,358],{"align":354},"Numba",[349,360,361],{"align":354},"JAX (générique)",[349,363,364],{"align":354},"JAX (3×3)",[366,367,368,388],"tbody",{},[346,369,370,374,377,380,383],{},[371,372,373],"td",{},"Intel Xeon Silver 4210R",[371,375,376],{"align":354},"7800 s",[371,378,379],{"align":354},"3257 s",[371,381,382],{"align":354},"1031 s",[371,384,385],{"align":354},[79,386,387],{},"377 s",[346,389,390,393,396,399,402],{},[371,391,392],{},"AMD EPYC 7313",[371,394,395],{"align":354},"2545 s",[371,397,398],{"align":354},"1219 s",[371,400,401],{"align":354},"386 s",[371,403,404],{"align":354},[79,405,406],{},"141 s",[408,409],"d5-ladder",{},[411,412],"gs-bar-chart",{":categories":413,":series":414,"note":415,"title":416,"unit":417},"[\"NumPy\",\"Numba\",\"JAX (générique)\",\"JAX (3×3)\"]","[{\"name\":\"Xeon 4210R\",\"values\":[7800,3257,1031,377]},{\"name\":\"EPYC 7313\",\"values\":[2545,1219,386,141]}]","Chiffres officiels du dépôt du cours (CPU/Benchmarks.md). Plus court = mieux.","Gray-Scott Python : NumPy / Numba / JAX (32×1000 itérations)"," s",[121,419,421],{"id":420},"_8-le-pont-vers-le-gpu","8. Le pont vers le GPU",[76,423,424,425,427,428,431],{},"Cette implémentation est la référence que le ",[79,426,113],{}," porte sur l'accélérateur : JAX rejoue\nle même code sur GPU, rejoint par CuPy et cuNumeric. C'est aussi exactement la démarche du\nprojet ",[429,430,57],"a",{"href":58}," — profiler PyTorch, porter en JAX, comparer honnêtement.",[116,433,435,436],{"id":434},"le-tp-grayscott2026day-5cpu","Le TP — ",[103,437,438],{},"GrayScott2026/day-5/CPU/",[76,440,441],{},"Trois façons de suivre, au choix :",[443,444,449],"pre",{"className":445,"code":446,"language":447,"meta":448,"style":448},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1) en local, environnement épinglé par pixi\ngit clone https://gitlab.in2p3.fr/alice.faure/gray-scott-python.git\npixi run jupyter-lab           # ouvre les notebooks de tutorial/\n\n# 2) sur le cluster MUST (LAPP) : https://jupyter.must-dc.cloud\n#    → « Gray-Scott Revolutions » → « Python CPU »\n\n# 3) en conteneur (apptainer / podman / docker) : image vscode du cours\n","bash","",[103,450,451,460,474,489,496,502,508,513],{"__ignoreMap":448},[452,453,456],"span",{"class":454,"line":455},"line",1,[452,457,459],{"class":458},"sHwdD","# 1) en local, environnement épinglé par pixi\n",[452,461,463,467,471],{"class":454,"line":462},2,[452,464,466],{"class":465},"sBMFI","git",[452,468,470],{"class":469},"sfazB"," clone",[452,472,473],{"class":469}," https://gitlab.in2p3.fr/alice.faure/gray-scott-python.git\n",[452,475,477,480,483,486],{"class":454,"line":476},3,[452,478,479],{"class":465},"pixi",[452,481,482],{"class":469}," run",[452,484,485],{"class":469}," jupyter-lab",[452,487,488],{"class":458},"           # ouvre les notebooks de tutorial/\n",[452,490,492],{"class":454,"line":491},4,[452,493,495],{"emptyLinePlaceholder":494},true,"\n",[452,497,499],{"class":454,"line":498},5,[452,500,501],{"class":458},"# 2) sur le cluster MUST (LAPP) : https://jupyter.must-dc.cloud\n",[452,503,505],{"class":454,"line":504},6,[452,506,507],{"class":458},"#    → « Gray-Scott Revolutions » → « Python CPU »\n",[452,509,511],{"class":454,"line":510},7,[452,512,495],{"emptyLinePlaceholder":494},[452,514,516],{"class":454,"line":515},8,[452,517,518],{"class":458},"# 3) en conteneur (apptainer / podman / docker) : image vscode du cours\n",[76,520,521,524,525,528,529,532,533,536,537,540],{},[103,522,523],{},"tutorial/"," pose les exercices, ",[103,526,527],{},"solutions/"," les corrige, ",[103,530,531],{},"scripts/gray_scott_utils.py","\nfournit l'I/O commun, et ",[103,534,535],{},"results/"," contient une simulation témoin (",[103,538,539],{},"simulation.h5"," + vidéo).",[116,542,544],{"id":543},"en-vidéo-le-replay-officiel","En vidéo — le replay officiel",[546,547],"yt-embed",{"caption":548,"id":549,"title":550},"Replay — Python On CPU (Gray Scott Thursdays)","ldWlh6r0bOw","Python On CPU",[116,552,554],{"id":553},"sources-matériel-officiel","Sources & matériel officiel",[556,557,558,571,582,593,603,625,635],"ul",{},[559,560,561,564,565],"li",{},[79,562,563],{},"Le dépôt du cours"," (notebooks + solutions + benchmarks) :\n",[429,566,570],{"href":567,"rel":568},"https://gitlab.in2p3.fr/alice.faure/gray-scott-python",[569],"nofollow","gitlab.in2p3.fr/alice.faure/gray-scott-python",[559,572,573,576,577],{},[79,574,575],{},"Les slides du jour"," (PDF, wiki GitLab de l'école) :\n",[429,578,581],{"href":579,"rel":580},"https://gitlab.in2p3.fr/CTA-LAPP/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/-/wikis/uploads/GrayScottDay-5/2026-06-gray-scott-python-mem.pdf",[569],"2026-06-gray-scott-python-mem.pdf",[559,583,584,587,588],{},[79,585,586],{},"La plateforme Jupyter du cluster MUST"," :\n",[429,589,592],{"href":590,"rel":591},"https://jupyter.must-dc.cloud",[569],"jupyter.must-dc.cloud",[559,594,595,587,598],{},[79,596,597],{},"Le conteneur de base de l'école",[429,599,602],{"href":600,"rel":601},"https://gitlab.in2p3.fr/CTA-LAPP/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScottBaseContainer",[569],"GrayScottBaseContainer",[559,604,605,587,608,613,614,619,620],{},[79,606,607],{},"Les bibliothèques",[429,609,612],{"href":610,"rel":611},"https://numpy.org/",[569],"numpy.org"," · ",[429,615,618],{"href":616,"rel":617},"https://numba.pydata.org/",[569],"numba.pydata.org"," ·\n",[429,621,624],{"href":622,"rel":623},"https://docs.jax.dev/",[569],"docs.jax.dev",[559,626,627,587,630],{},[79,628,629],{},"Replays vidéo (YouTube)",[429,631,634],{"href":632,"rel":633},"https://www.youtube.com/playlist?list=PLiZttWgOMudb6PsUoWtxY3G4Gv8f2lurG",[569],"Gray Scott Thursdays",[559,636,637,587,640],{},[79,638,639],{},"Site de l'école",[429,641,644],{"href":642,"rel":643},"https://cta-lapp.pages.in2p3.fr/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/index.html",[569],"GrayScott2026",[646,647,648],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":448,"searchDepth":462,"depth":462,"links":650},[651,657,664,666,667],{"id":118,"depth":462,"text":119,"children":652},[653,655,656],{"id":123,"depth":476,"text":654},"1. Profiler d'abord — temps et mémoire",{"id":161,"depth":476,"text":162},{"id":192,"depth":476,"text":193},{"id":215,"depth":462,"text":216,"children":658},[659,660,661,662,663],{"id":219,"depth":476,"text":220},{"id":237,"depth":476,"text":238},{"id":309,"depth":476,"text":310},{"id":327,"depth":476,"text":328},{"id":420,"depth":476,"text":421},{"id":434,"depth":462,"text":665},"Le TP — GrayScott2026/day-5/CPU/",{"id":543,"depth":462,"text":544},{"id":553,"depth":462,"text":554},"26 juin, avec Alice Faure, Jean-Marc Colley, Sébastien Valat et Nabil Garroum : profiler Python, vectoriser avec NumPy, compiler avec Numba, puis tracer avec JAX — jusqu'à ×18 sans quitter Python.","md",[671],{"label":672,"icon":673,"to":567,"target":674},"Dépôt du cours","i-lucide-git-branch","_blank",{"icon":676},"lucide:braces",{"title":31,"description":668},"wUfvocI8zd7C_Bg3QeR8pMHmgPIJcoLpjMpVQz7Vm8s",[680,682],{"title":27,"path":28,"stem":29,"description":681,"children":-1},"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.",{"title":35,"path":36,"stem":37,"description":683,"children":-1},"29 juin, deux sessions : Joël Falcou ouvre la semaine avec EVE et Kiwaku (SIMD C++20 explicite et portable), Pierre Aubert enchaîne avec l'architecture GPU qui portera les trois derniers jours.",1783172491904]