[{"data":1,"prerenderedAt":579},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-gray-scott-school-jour-8":66,"-fr-gray-scott-school-jour-8-surround":574},[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":43,"badge":68,"body":69,"category":68,"description":562,"extension":563,"links":564,"meta":569,"navigation":571,"path":44,"seo":572,"stem":45,"tags":68,"__hash__":573},"docs_fr/fr/1.gray-scott-school/10.jour-8.md",null,{"type":70,"value":71,"toc":550},"minimark",[72,113,118,127,139,180,191,195,296,306,309,313,328,332,339,426,436,444,448,463,467,473,478,482,546],[73,74,75],"blockquote",{},[76,77,78,82,83,86,87,91,92,95,96,99,100,104,105,108,109,112],"p",{},[79,80,81],"strong",{},"1er juillet 2026"," · Matin : ",[79,84,85],{},"Vincent Lafage"," (IJCLab) — ",[88,89,90],"em",{},"Fortran 2018 on GPU"," ·\n17 h : ",[79,93,94],{},"Pierre Aubert"," (LAPP) — ",[88,97,98],{},"Julia … in Rust … and C++ … with pixi ?"," · Auditorium\nMarcel Vivargent + satellites (dont la CINERI). Le TP reprend le dépôt du Jour 3\n(",[101,102,103],"code",{},"day-3-a/","), côté ",[101,106,107],{},"GPU/"," cette fois — toutes les mesures ci-dessous sont ",[79,110,111],{},"reproduites en\nlocal"," (nvfortran + GTX 1650).",[114,115,117],"h2",{"id":116},"session-du-matin-le-fortran-standard-sur-gpu","Session du matin — le Fortran standard sur GPU",[119,120,122,123,126],"h3",{"id":121},"_1-do-concurrent-du-cpu-au-gpu-sans-changer-une-ligne","1. ",[101,124,125],{},"do concurrent"," : du CPU au GPU sans changer une ligne",[76,128,129,130,133,134,138],{},"Le pont du Jour 3 est franchi. Les boucles ",[101,131,132],{},"do"," imbriquées du Laplacien deviennent un\n",[79,135,136],{},[101,137,125],{}," — une construction du standard ISO qui affirme que les itérations sont\nindépendantes, donc exécutables dans n'importe quel ordre.",[140,141,146],"pre",{"className":142,"code":143,"language":144,"meta":145,"style":145},"language-fortran shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","do concurrent (i = 2:nx-1, j = 2:ny-1)\n   lap_u = sum(stencil * U0(i-1:i+1, j-1:j+1))\n   U1(i,j) = U0(i,j) + dt * (Diffusivity_u*lap_u - U0(i,j)*V0(i,j)**2 &\n                             + Feed_Rate*(1.0_pr - U0(i,j)))\nend do\n","fortran","",[101,147,148,156,162,168,174],{"__ignoreMap":145},[149,150,153],"span",{"class":151,"line":152},"line",1,[149,154,155],{},"do concurrent (i = 2:nx-1, j = 2:ny-1)\n",[149,157,159],{"class":151,"line":158},2,[149,160,161],{},"   lap_u = sum(stencil * U0(i-1:i+1, j-1:j+1))\n",[149,163,165],{"class":151,"line":164},3,[149,166,167],{},"   U1(i,j) = U0(i,j) + dt * (Diffusivity_u*lap_u - U0(i,j)*V0(i,j)**2 &\n",[149,169,171],{"class":151,"line":170},4,[149,172,173],{},"                             + Feed_Rate*(1.0_pr - U0(i,j)))\n",[149,175,177],{"class":151,"line":176},5,[149,178,179],{},"end do\n",[76,181,182,183,186,187,190],{},"Aucune directive, aucune API — du Fortran pur. Avec ",[101,184,185],{},"-stdpar=gpu",", ",[79,188,189],{},"nvfortran"," génère un noyau,\nalloue les tableaux en mémoire unifiée et déplace les données tout seul.",[119,192,194],{"id":193},"_2-trois-back-ends-doffload-une-seule-source","2. Trois back-ends d'offload, une seule source",[196,197,198,217],"table",{},[199,200,201],"thead",{},[202,203,204,208,211,214],"tr",{},[205,206,207],"th",{},"Variante",[205,209,210],{},"Mécanisme",[205,212,213],{},"Flag clé",[205,215,216],{},"Cible",[218,219,220,239,257,277],"tbody",{},[202,221,222,228,232,236],{},[223,224,225],"td",{},[101,226,227],{},"stdpar",[223,229,230],{},[101,231,125],{},[223,233,234],{},[101,235,185],{},[223,237,238],{},"GPU",[202,240,241,245,249,254],{},[223,242,243],{},[101,244,227],{},[223,246,247],{},[101,248,125],{},[223,250,251],{},[101,252,253],{},"-stdpar=multicore",[223,255,256],{},"cœurs CPU",[202,258,259,264,270,275],{},[223,260,261],{},[101,262,263],{},"openacc",[223,265,266,267],{},"directives ",[101,268,269],{},"!$acc",[223,271,272],{},[101,273,274],{},"-acc",[223,276,238],{},[202,278,279,284,289,294],{},[223,280,281],{},[101,282,283],{},"openmp_offload",[223,285,286],{},[101,287,288],{},"!$omp target",[223,290,291],{},[101,292,293],{},"-mp=gpu",[223,295,238],{},[76,297,298,301,302,305],{},[101,299,300],{},"-gpu=ccnative"," vise la compute capability du GPU présent ; ",[101,303,304],{},"-Minfo=accel"," fait dire au\ncompilateur quelles boucles il a offloadées — le premier réflexe de diagnostic.",[307,308],"d8-offload",{},[119,310,312],{"id":311},"_3-le-piège-hdf5","3. Le piège HDF5",[76,314,315,316,319,320,323,324,327],{},"Les fichiers de modules Fortran (",[101,317,318],{},".mod",") ne sont ",[79,321,322],{},"pas portables entre compilateurs"," : un HDF5\ncompilé avec gfortran est illisible par nvfortran. Soit on recompile HDF5 avec nvfortran, soit on\ndésactive la sortie (",[101,325,326],{},"do_write = .false.",") pour chronométrer le noyau GPU pur.",[119,329,331],{"id":330},"_4-mesurer-puis-comparer","4. Mesurer, puis comparer",[76,333,334,335,338],{},"Mesuré sur une ",[79,336,337],{},"GeForce GTX 1650"," (grille 1024×1024, 4000 pas, HDF5 off) :",[196,340,341,356],{},[199,342,343],{},[202,344,345,347,350,353],{},[205,346,207],{},[205,348,349],{},"Flag",[205,351,352],{},"Temps",[205,354,355],{},"Accélération",[218,357,358,379,394,409],{},[202,359,360,365,369,374],{},[223,361,362,364],{},[101,363,125],{}," → GPU",[223,366,367],{},[101,368,185],{},[223,370,371],{},[79,372,373],{},"1,12 s",[223,375,376],{},[79,377,378],{},"× 48",[202,380,381,384,388,391],{},[223,382,383],{},"OpenACC → GPU",[223,385,386],{},[101,387,274],{},[223,389,390],{},"1,46 s",[223,392,393],{},"× 37",[202,395,396,399,403,406],{},[223,397,398],{},"OpenMP target → GPU",[223,400,401],{},[101,402,293],{},[223,404,405],{},"1,55 s",[223,407,408],{},"× 35",[202,410,411,416,420,423],{},[223,412,413,415],{},[101,414,125],{}," → CPU (≈ 7 cœurs)",[223,417,418],{},[101,419,253],{},[223,421,422],{},"53,85 s",[223,424,425],{},"référence",[76,427,428,429,431,432,435],{},"Le GPU écrase le CPU multicœur (~× 48), et les trois back-ends se tiennent en moins de deux\ndixièmes — le ",[101,430,125],{}," standard ",[79,433,434],{},"égale les directives"," tout en restant du Fortran pur.",[437,438],"gs-bar-chart",{":categories":439,":series":440,"note":441,"title":442,"unit":443},"[\"do concurrent → GPU\",\"OpenACC → GPU\",\"OpenMP target → GPU\",\"do concurrent → CPU (~7c)\"]","[{\"name\":\"Temps\",\"values\":[1.12,1.46,1.55,53.85]}]","La barre CPU écrase les trois barres GPU — l'offload divise le temps par ~48.","Gray-Scott : GPU vs CPU (GTX 1650, 1024×1024, 4000 pas)"," s",[114,445,447],{"id":446},"session-de-clôture-17-h-julia-rust-c-réunis-par-pixi","Session de clôture (17 h) — Julia · Rust · C++, réunis par pixi",[76,449,450,451,454,455,458,459,462],{},"La journée se termine par une session ouverte : ",[88,452,453],{},"peut-on faire cohabiter Julia, Rust et C++ pour\nle même calcul, dans une seule chaîne d'outils reproductible ?"," Aucun langage ne possède le HPC —\nJulia pour le prototypage haut niveau, Rust pour la performance système sûre, C++ l'incontournable.\n",[79,456,457],{},"pixi"," est la réponse : il fige compilateurs, CUDA et les runtimes Julia/Rust dans un unique\nlockfile, pour que les trois mondes tournent côte à côte. La leçon dépasse Gray-Scott : c'est la\n",[79,460,461],{},"méthode"," qui se transfère, pas la syntaxe.",[114,464,466],{"id":465},"en-vidéo-les-replays-officiels","En vidéo — les replays officiels",[468,469],"yt-embed",{"caption":470,"id":471,"title":472},"Replay — Fortran On GPU (Gray Scott Thursdays)","jOAn5cM-26U","Fortran On GPU",[468,474],{"caption":475,"id":476,"title":477},"Replay — Introduction to Rust (Gray Scott Thursdays), en écho à la session polyglotte","rjEqukhkj0c","Introduction to Rust",[114,479,481],{"id":480},"sources-matériel-officiel","Sources & matériel officiel",[483,484,485,505,516,526,536],"ul",{},[486,487,488,491,492,499,500],"li",{},[79,489,490],{},"Les slides du jour"," (PDF, wiki GitLab de l'école) :\n",[493,494,498],"a",{"href":495,"rel":496},"https://gitlab.in2p3.fr/CTA-LAPP/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/-/wikis/uploads/GrayScottDay-8/FortranFuriousGPU_IJC_dual_GS_2026.pdf",[497],"nofollow","FortranFuriousGPU — IJC dual GS 2026"," ·\n",[493,501,504],{"href":502,"rel":503},"https://gitlab.in2p3.fr/CTA-LAPP/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/-/wikis/uploads/GrayScottDay-8/8-webinar_julia_in_rust_and_cpp_with_pixi.pdf",[497],"Julia in Rust and C++ with pixi",[486,506,507,510,511],{},[79,508,509],{},"Le dépôt du cours"," :\n",[493,512,515],{"href":513,"rel":514},"https://gitlab.in2p3.fr/lafage/GrayScottFortranTuto",[497],"gitlab.in2p3.fr/lafage/GrayScottFortranTuto",[486,517,518,510,521],{},[79,519,520],{},"Le compilateur",[493,522,525],{"href":523,"rel":524},"https://developer.nvidia.com/hpc-sdk",[497],"NVIDIA HPC SDK (nvfortran)",[486,527,528,510,531],{},[79,529,530],{},"Replays vidéo (YouTube)",[493,532,535],{"href":533,"rel":534},"https://www.youtube.com/playlist?list=PLiZttWgOMudb6PsUoWtxY3G4Gv8f2lurG",[497],"Gray Scott Thursdays",[486,537,538,510,541],{},[79,539,540],{},"Site de l'école",[493,542,545],{"href":543,"rel":544},"https://cta-lapp.pages.in2p3.fr/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/index.html",[497],"GrayScott2026",[547,548,549],"style",{},"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":145,"searchDepth":158,"depth":158,"links":551},[552,559,560,561],{"id":116,"depth":158,"text":117,"children":553},[554,556,557,558],{"id":121,"depth":164,"text":555},"1. do concurrent : du CPU au GPU sans changer une ligne",{"id":193,"depth":164,"text":194},{"id":311,"depth":164,"text":312},{"id":330,"depth":164,"text":331},{"id":446,"depth":158,"text":447},{"id":465,"depth":158,"text":466},{"id":480,"depth":158,"text":481},"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.","md",[565],{"label":566,"icon":567,"to":513,"target":568},"Dépôt du cours","i-lucide-git-branch","_blank",{"icon":570},"lucide:flame",true,{"title":43,"description":562},"f8V85sxHkKZjJgd_4JZ-rS4YFk3YsnUq_ernRjLYCko",[575,577],{"title":39,"path":40,"stem":41,"description":576,"children":-1},"30 juin, quatre sessions avec Alice Faure, Jean-Marc Colley, Sébastien Valat et Nabil Garroum : CuPy, cuPyNumeric et JAX portent le Gray-Scott du Jour 5 sur l'accélérateur — chiffres A100 officiels à l'appui.",{"title":47,"path":48,"stem":49,"description":578,"children":-1},"2 juillet, dernier jour : Kokkos sur GPU avec Paul Zehner, Juan-José Silva Cuevas et Thomas Padioleau — layout, transferts, recouvrement async — puis l'histoire de la racine cubique et la clôture.",1783172492966]