[{"data":1,"prerenderedAt":953},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-gray-scott-school-jour-3":66,"-fr-gray-scott-school-jour-3-surround":948},[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":23,"badge":68,"body":69,"category":68,"description":936,"extension":937,"links":938,"meta":943,"navigation":945,"path":24,"seo":946,"stem":25,"tags":68,"__hash__":947},"docs_fr/fr/1.gray-scott-school/05.jour-3.md",null,{"type":70,"value":71,"toc":918},"minimark",[72,108,113,118,149,153,156,159,171,175,182,254,257,320,326,330,364,368,372,375,404,419,422,426,433,487,490,494,501,562,598,612,616,622,707,768,772,796,800,827,831,837,842,846,914],[73,74,75],"blockquote",{},[76,77,78,82,83,86,87,90,91,95,96,99,100,103,104,107],"p",{},[79,80,81],"strong",{},"24 juin 2026"," · Intervenant : ",[79,84,85],{},"Vincent Lafage"," (IJCLab) · Auditorium Marcel Vivargent +\nsites satellites (dont la CINERI) · au déjeuner, ",[79,88,89],{},"visite du Musée du LAPP",". Le TP du jour\nvit dans ",[92,93,94],"code",{},"GrayScott2026/day-3-a/"," — ",[79,97,98],{},"CPU uniquement"," : les dossiers ",[92,101,102],{},"GPU/"," et ",[92,105,106],{},"CUDA/"," du\nmême dépôt serviront au Jour 8.",[109,110,112],"h2",{"id":111},"session-du-matin-fortran-moderne-le-langage-des-tableaux","Session du matin — Fortran moderne, le langage des tableaux",[114,115,117],"h3",{"id":116},"_1-fortran-vit-toujours","1. Fortran vit toujours",[76,119,120,121,124,125,128,129,132,133,136,137,140,141,144,145,148],{},"Le cours s'ouvre sur une démonstration par l'exemple : le dossier ",[92,122,123],{},"Annexe/"," contient le même\nprogramme en FORTRAN 66 (",[92,126,127],{},"obact66.f",") et en Fortran 95 (",[92,130,131],{},"obact95.f90","), et un vrai plat de\nspaghetti historique (",[92,134,135],{},"spaghetti.f",") avec sa version dénouée (",[92,138,139],{},"unspaghetti.f","). Le langage de\n1957 est devenu un langage ",[79,142,143],{},"moderne"," — modules, interfaces génériques, coarrays — sans\nperdre sa spécialité : ",[79,146,147],{},"les tableaux numériques",".",[114,150,152],{"id":151},"_2-column-major-le-piège-venu-du-c","2. Column-major — le piège venu du C",[76,154,155],{},"Première différence structurante avec le C/C++ : l'ordre mémoire.",[157,158],"d3-col-major",{},[76,160,161,162,165,166,170],{},"Tout ce qu'on a appris au Jour 2 sur le parcours mémoire reste vrai — mais ",[79,163,164],{},"inversé"," : en\nFortran, la boucle interne doit parcourir la ",[167,168,169],"em",{},"première"," dimension. Un réflexe C recopié tel\nquel divise le débit.",[114,172,174],{"id":173},"_3-le-solveur-en-quatre-modules","3. Le solveur en quatre modules",[76,176,177,178,181],{},"Le Gray-Scott du TP est découpé proprement (",[92,179,180],{},"src/",") :",[183,184,185,198],"table",{},[186,187,188],"thead",{},[189,190,191,195],"tr",{},[192,193,194],"th",{},"Module",[192,196,197],{},"Rôle",[199,200,201,216,230,240],"tbody",{},[189,202,203,209],{},[204,205,206],"td",{},[92,207,208],{},"floating_point_precision.f90",[204,210,211,212,215],{},"le kind ",[92,213,214],{},"pr"," — toute la précision du solveur en une ligne",[189,217,218,223],{},[204,219,220],{},[92,221,222],{},"gray_scott_settings.f90",[204,224,225,226,229],{},"paramètres physiques + ",[79,227,228],{},"namelist"," (config sans recompiler)",[189,231,232,237],{},[204,233,234],{},[92,235,236],{},"hdf5_utils.f90",[204,238,239],{},"écriture HDF5 des images",[189,241,242,247],{},[204,243,244],{},[92,245,246],{},"gray_scott.f90",[204,248,249,250,253],{},"le programme : init → ",[92,251,252],{},"evolve"," → sortie",[76,255,256],{},"Le stencil du Laplacien est choisi parmi quatre variantes (isotropie vs précision) :",[183,258,259,272],{},[186,260,261],{},[189,262,263,266,269],{},[192,264,265],{},"Stencil",[192,267,268],{},"Centre",[192,270,271],{},"Note",[199,273,274,285,298,309],{},[189,275,276,279,282],{},[204,277,278],{},"Différences centrées",[204,280,281],{},"−4",[204,283,284],{},"le 5-points classique",[189,286,287,292,295],{},[204,288,289],{},[79,290,291],{},"Weights-pretty (défaut)",[204,293,294],{},"−8",[204,296,297],{},"isotrope, utilisé ici",[189,299,300,303,306],{},[204,301,302],{},"Oono-Puri (1988)",[204,304,305],{},"−12/4",[204,307,308],{},"meilleure isotropie",[189,310,311,314,317],{},[204,312,313],{},"Patra-Karttunen",[204,315,316],{},"−20/6",[204,318,319],{},"précis à l'ordre 4",[321,322],"gs-heatmap",{":matrix":323,"note":324,"title":325},"[[1,1,1],[1,-8,1],[1,1,1]]","Le centre pèse −8, ses huit voisins +1.","Stencil du Laplacien — Weights-pretty (défaut)",[114,327,329],{"id":328},"_4-dire-son-intention-au-compilateur","4. Dire son intention au compilateur",[76,331,332,333,336,337,340,341,344,345,348,349,352,353,356,357,360,361,148],{},"Les mots-clés modernes sont des ",[79,334,335],{},"promesses"," que le compilateur sait exploiter :\n",[92,338,339],{},"pure"," / ",[92,342,343],{},"elemental"," (pas d'effet de bord), ",[92,346,347],{},"contiguous"," (mémoire dense), ",[92,350,351],{},"do concurrent","\n(itérations indépendantes — la clé des Jours 8-9), et les opérations tableau\n(",[92,354,355],{},"sum(stencil * U(i-1:i+1, j-1:j+1))",") qui disent ",[167,358,359],{},"quoi"," calculer, pas ",[167,362,363],{},"comment",[109,365,367],{"id":366},"session-de-laprès-midi-précision-flags-variantes","Session de l'après-midi — Précision, flags, variantes",[114,369,371],{"id":370},"_5-la-précision-en-une-ligne","5. La précision en une ligne",[76,373,374],{},"Le module de précision du TP tient en trois lignes — et c'est voulu :",[376,377,382],"pre",{"className":378,"code":379,"language":380,"meta":381,"style":381},"language-fortran shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","module floating_point_precision\n  use, intrinsic :: iso_fortran_env, only: pr => REAL32\nend module\n","fortran","",[92,383,384,392,398],{"__ignoreMap":381},[385,386,389],"span",{"class":387,"line":388},"line",1,[385,390,391],{},"module floating_point_precision\n",[385,393,395],{"class":387,"line":394},2,[385,396,397],{},"  use, intrinsic :: iso_fortran_env, only: pr => REAL32\n",[385,399,401],{"class":387,"line":400},3,[385,402,403],{},"end module\n",[76,405,406,407,410,411,414,415,418],{},"Changer ",[92,408,409],{},"REAL32"," en ",[92,412,413],{},"REAL64"," bascule ",[79,416,417],{},"tout le solveur",". Ce qu'on échange :",[420,421],"d3-float",{},[114,423,425],{"id":424},"_6-la-sommation-compensée","6. La sommation compensée",[76,427,428,429,432],{},"L'ordre de sommation change le résultat flottant. Le TP implémente les quatre remèdes\nclassiques (",[92,430,431],{},"Solutions/compensated_summation.f90"," — interfaces génériques 1D/2D) :",[183,434,435,445],{},[186,436,437],{},[189,438,439,442],{},[192,440,441],{},"Méthode",[192,443,444],{},"Idée",[199,446,447,457,467,477],{},[189,448,449,454],{},[204,450,451],{},[92,452,453],{},"sum_pairwise",[204,455,456],{},"sommation récursive diviser-pour-régner",[189,458,459,464],{},[204,460,461],{},[92,462,463],{},"sum_Kahan",[204,465,466],{},"on traîne un terme de compensation",[189,468,469,474],{},[204,470,471],{},[92,472,473],{},"sum_Neumaier",[204,475,476],{},"robuste quand le terme suivant est plus grand",[189,478,479,484],{},[204,480,481],{},[92,482,483],{},"sum_KBN",[204,485,486],{},"Kahan-Babuška-Neumaier, le défaut pratique",[488,489],"d3-kahan",{},[114,491,493],{"id":492},"_7-lexercice-des-flags-mêmes-sources-6-à-8","7. L'exercice des flags — mêmes sources, ×6 à ×8",[76,495,496,497,500],{},"Le script ",[92,498,499],{},"run_flags_exo.sh"," du TP fait la démonstration de bout en bout, mesures à l'appui :",[502,503,504,515,545],"ol",{},[505,506,507,510,511,514],"li",{},[79,508,509],{},"Détecter le SIMD du CPU"," (",[92,512,513],{},"/proc/cpuinfo"," : AVX2 ? AVX-512 ?) ;",[505,516,517,520,521,524,525,528,529,532,533,536,537,540,541,544],{},[79,518,519],{},"C"," : ",[92,522,523],{},"speedcbrtf.c"," compilé scalaire (",[92,526,527],{},"-O2 -fno-tree-vectorize",") puis natif\n(",[92,530,531],{},"-Ofast -march=native -ftree-vectorize -mrecip …",") — on compte les registres ",[92,534,535],{},"ymm"," dans le\nbinaire (",[92,538,539],{},"objdump | grep -c ymm",") pour ",[167,542,543],{},"prouver"," la vectorisation ;",[505,546,547,520,550,553,554,557,558,561],{},[79,548,549],{},"Fortran",[92,551,552],{},"gfortran -fopt-info-vec"," affiche les boucles vectorisées, et\n",[92,555,556],{},"-fopt-info-vec-missed"," explique ",[79,559,560],{},"pourquoi"," une boucle est refusée.",[376,563,567],{"className":564,"code":565,"language":566,"meta":381,"style":381},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cd GrayScott2026/day-3-a\npixi run bash run_flags_exo.sh    # « les mêmes sources, ×6-8 selon les flags »\n","bash",[92,568,569,579],{"__ignoreMap":381},[385,570,571,575],{"class":387,"line":388},[385,572,574],{"class":573},"s2Zo4","cd",[385,576,578],{"class":577},"sfazB"," GrayScott2026/day-3-a\n",[385,580,581,585,588,591,594],{"class":387,"line":394},[385,582,584],{"class":583},"sBMFI","pixi",[385,586,587],{"class":577}," run",[385,589,590],{"class":577}," bash",[385,592,593],{"class":577}," run_flags_exo.sh",[385,595,597],{"class":596},"sHwdD","    # « les mêmes sources, ×6-8 selon les flags »\n",[76,599,600,601,604,605,103,608,611],{},"C'est le premier acte de « l'histoire de la racine cubique » — dont le dernier mot sera dit en\nclôture du Jour 9. Pour aller plus loin : ",[92,602,603],{},"maqao cqa --fct-loops=loop_cbrt"," analyse la boucle\nau niveau assembleur (dossiers ",[92,606,607],{},"OptimisationCbrtC/",[92,609,610],{},"OptimisationCbrtFortran/",").",[114,613,615],{"id":614},"_8-les-variantes-du-dépôt-un-solveur-dix-expériences","8. Les variantes du dépôt — un solveur, dix expériences",[76,617,618,621],{},[92,619,620],{},"Solutions/"," décline le même solveur pour isoler chaque idée :",[183,623,624,634],{},[186,625,626],{},[189,627,628,631],{},[192,629,630],{},"Variante",[192,632,633],{},"Ce qu'elle isole",[199,635,636,662,672,688],{},[189,637,638,655],{},[204,639,640,643,644,643,647,650,651,654],{},[92,641,642],{},"preopenmp"," → ",[92,645,646],{},"openmp",[92,648,649],{},"openmp_bis"," (+ ",[92,652,653],{},"_ptr",")",[204,656,657,658,661],{},"la parallélisation ",[92,659,660],{},"!$omp"," pas à pas",[189,663,664,669],{},[204,665,666],{},[92,667,668],{},"blocking_ptr",[204,670,671],{},"le blocking du Jour 2, en Fortran",[189,673,674,682],{},[204,675,676,340,679],{},[92,677,678],{},"RK",[92,680,681],{},"CK",[204,683,684,685],{},"intégrateurs Runge-Kutta / Cash-Karp — la précision ",[167,686,687],{},"temporelle",[189,689,690,701],{},[204,691,692,340,695,340,698],{},[92,693,694],{},"stdpar",[92,696,697],{},"openacc",[92,699,700],{},"openmp_offload",[204,702,703,704],{},"les back-ends GPU — ",[79,705,706],{},"rendez-vous au Jour 8",[183,708,709,721],{},[186,710,711],{},[189,712,713,715,718],{},[192,714,630],{},[192,716,717],{},"Mécanisme",[192,719,720],{},"Cible",[199,722,723,737,754],{},[189,724,725,729,734],{},[204,726,727],{},[92,728,646],{},[204,730,731,732],{},"directives ",[92,733,660],{},[204,735,736],{},"cœurs CPU",[189,738,739,743,747],{},[204,740,741],{},[92,742,694],{},[204,744,745],{},[92,746,351],{},[204,748,749,750,753],{},"CPU multicœur ",[79,751,752],{},"ou"," GPU",[189,755,756,762,765],{},[204,757,758,340,760],{},[92,759,697],{},[92,761,700],{},[204,763,764],{},"directives",[204,766,767],{},"GPU (Jour 8)",[114,769,771],{"id":770},"_9-testé-sinon-rien","9. Testé, sinon rien",[76,773,774,777,778,781,782,784,785,510,788,791,792,795],{},[92,775,776],{},"Solutions/test_stencil.f90"," vérifie les ",[79,779,780],{},"invariants"," du stencil (multiple du Laplacien,\nnormalisation) avec tolérance — l'application directe des règles du Jour 1. Et l'",[92,783,123],{},"\nmontre les tests ",[79,786,787],{},"pFUnit",[92,789,790],{},"test_roman_numeral.pf",", ",[92,793,794],{},"test_divisor.pf",") : le framework de\ntests unitaires du monde Fortran.",[109,797,799],{"id":798},"lannexe-le-cabinet-de-curiosités","L'Annexe — le cabinet de curiosités",[76,801,802,803,806,807,810,811,814,815,791,818,821,822,340,824,826],{},"La signature pédagogique de Vincent Lafage : ",[92,804,805],{},"santa_claus_problem_caf.f90"," (le problème du\nPère Noël… en ",[79,808,809],{},"coarrays",", le parallélisme natif de Fortran 2008), ",[92,812,813],{},"roman_numeral.F90"," (+ ses\ntests), ",[92,816,817],{},"physconst.f90",[92,819,820],{},"decimal_interface.f90",", et le duo ",[92,823,135],{},[92,825,139],{},"\nqui résume 60 ans d'évolution du langage.",[109,828,830],{"id":829},"en-vidéo-les-replays-officiels","En vidéo — les replays officiels",[832,833],"yt-embed",{"caption":834,"id":835,"title":836},"Replay — Fortran On CPU (Gray Scott Thursdays)","NytdgsWDqwY","Fortran On CPU",[832,838],{"caption":839,"id":840,"title":841},"Replay — Computing Precision : la précision flottante en pratique (Gray Scott Thursdays)","uSscpDxrPek","Computing Precision",[109,843,845],{"id":844},"sources-matériel-officiel","Sources & matériel officiel",[847,848,849,862,873,883,893],"ul",{},[505,850,851,854,855],{},[79,852,853],{},"Le dépôt du cours"," :\n",[856,857,861],"a",{"href":858,"rel":859},"https://gitlab.in2p3.fr/lafage/GrayScottFortranTuto",[860],"nofollow","gitlab.in2p3.fr/lafage/GrayScottFortranTuto",[505,863,864,867,868],{},[79,865,866],{},"Les slides du jour"," (PDF, wiki GitLab de l'école) :\n",[856,869,872],{"href":870,"rel":871},"https://gitlab.in2p3.fr/CTA-LAPP/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/-/wikis/uploads/GrayScottDay-3/FortranFurious_IJC_dual_GS_2026.pdf",[860],"FortranFurious — IJC dual GS 2026",[505,874,875,877,878],{},[79,876,787],{}," (tests unitaires Fortran) :\n",[856,879,882],{"href":880,"rel":881},"https://github.com/Goddard-Fortran-Ecosystem/pFUnit_demos",[860],"github.com/Goddard-Fortran-Ecosystem/pFUnit_demos",[505,884,885,854,888],{},[79,886,887],{},"Replays vidéo (YouTube)",[856,889,892],{"href":890,"rel":891},"https://www.youtube.com/playlist?list=PLiZttWgOMudb6PsUoWtxY3G4Gv8f2lurG",[860],"Gray Scott Thursdays",[505,894,895,898,899,902,903,908,909],{},[79,896,897],{},"Conteneurs du cours"," (podman/apptainer, images ",[92,900,901],{},"grayscott_fortran_*",") :\n",[856,904,907],{"href":905,"rel":906},"https://cta-lapp.pages.in2p3.fr/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/redirection.html?label=partContainerListTimeTable",[860],"liste des conteneurs"," ·\n",[856,910,913],{"href":911,"rel":912},"https://cta-lapp.pages.in2p3.fr/COURS/GRAY_SCOTT_REVOLUTIONS/GrayScott2026/index.html",[860],"site de l'école",[915,916,917],"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);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":381,"searchDepth":394,"depth":394,"links":919},[920,926,933,934,935],{"id":111,"depth":394,"text":112,"children":921},[922,923,924,925],{"id":116,"depth":400,"text":117},{"id":151,"depth":400,"text":152},{"id":173,"depth":400,"text":174},{"id":328,"depth":400,"text":329},{"id":366,"depth":394,"text":367,"children":927},[928,929,930,931,932],{"id":370,"depth":400,"text":371},{"id":424,"depth":400,"text":425},{"id":492,"depth":400,"text":493},{"id":614,"depth":400,"text":615},{"id":770,"depth":400,"text":771},{"id":798,"depth":394,"text":799},{"id":829,"depth":394,"text":830},{"id":844,"depth":394,"text":845},"24 juin, avec Vincent Lafage : Fortran 2018 sur CPU toute la journée — le langage des tableaux, la précision flottante, l'exercice des flags, et le solveur Gray-Scott en Fortran moderne.","md",[939],{"label":940,"icon":941,"to":858,"target":942},"Dépôt du cours","i-lucide-git-branch","_blank",{"icon":944},"lucide:function-square",true,{"title":23,"description":936},"lG4bSMuQW8TNNl8cQm3ZhLR0G-lpiq9CE_OT7g37uKc",[949,951],{"title":19,"path":20,"stem":21,"description":950,"children":-1},"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.",{"title":27,"path":28,"stem":29,"description":952,"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.",1783172490869]