Branche Amaury dev : Différence entre versions

De LMDZPedia
Aller à : navigation, rechercher
(Page créée avec « Ceci est une page temporaire qui commente certains aspects de la branche [https://trac.lmd.jussieu.fr/LMDZ/browser/LMDZ6/branches/Amaury_dev Amaury_dev] en attendant qu'... »)
 
m
 
(11 révisions intermédiaires par le même utilisateur non affichées)
Ligne 12 : Ligne 12 :
 
* La mise à jour des sources FCM à la dernière version (mais sans passer à FCM2, on utilise encore les options legacy)
 
* La mise à jour des sources FCM à la dernière version (mais sans passer à FCM2, on utilise encore les options legacy)
 
* La correction de bugs mineurs (e.g. type casting) et majeurs (e.g. mauvais indices de boucles, appels erronés) trouvés lors du nettoyage
 
* La correction de bugs mineurs (e.g. type casting) et majeurs (e.g. mauvais indices de boucles, appels erronés) trouvés lors du nettoyage
* Le renommage des modules en <code>ldmz_*</code> pour éviter les collisions de namespace
+
* Le renommage des modules en <code>lmdz_*</code> pour éviter les collisions de namespace
* L'harmonisation de la syntaxe Fortran (cf [https://lmdz-forge.lmd.jussieu.fr/mediawiki/LMDZPedia/index.php/HowTo:_LMDZ_code_guidelines])
+
* L'harmonisation de la syntaxe Fortran (cf [[HowTo:_LMDZ_code_guidelines | LMDZ_code_guidelines]])
 
* Un linting de la plupart des fichiers
 
* Un linting de la plupart des fichiers
  
Ligne 21 : Ligne 21 :
 
    
 
    
 
   # Tests auto de convergence
 
   # Tests auto de convergence
  All good ! for r5017/r5155=-rad oldrad -parallel none -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad oldrad -parallel none -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad oldrad -parallel none -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-rad oldrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-rad rrtm -parallel none -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad rrtm -parallel none -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad rrtm -parallel mpi_omp -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad rrtm -parallel none -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad rrtm -parallel none -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-rad rrtm -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-rad ecrad -parallel none -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad ecrad -parallel none -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad ecrad -parallel mpi_omp -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget none -compilephysiq lmd
  All good ! for r5017/r5155=-rad ecrad -parallel none -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad ecrad -parallel none -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-rad ecrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
+
All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
  All good ! for r5017/r5155=-debug -rad oldrad -parallel none -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-debug -rad oldrad -parallel none -veget none -compilephysiq lmd
  All good ! for r5150/r5057=-cosp v1 -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
+
All good ! for r5155/r5017=-debug -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
 
+
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd -d 79
 
+
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmdiso -d 48x36x39
XIOS n'est pas testé vs 5017, car il segfault sur trunk à cette révision, mais on a bien convergence avec r5150:
+
All good ! for r5157/r5150=-xios -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
  All good ! for r5150/r5055=-xios -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
+
All good ! for r5157/r5017=-cosp v1 -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
 
 
 
 
''<TODO: Debug segfault de même avec une lib ompi moderne [-> vérif à la main]>''
 
  
 +
(XIOS est testé vs 5150 car il segfault sur 5017)
  
 
== Opérations mises "de côté" ==
 
== Opérations mises "de côté" ==
Ligne 48 : Ligne 46 :
 
=== Remplacement de FCTTRE.h ===
 
=== Remplacement de FCTTRE.h ===
  
</code>FCTTRE.h</code> contient des fonctions "en ligne", syntaxe qui est dépréciée. De plus, c'est utilisé via un <code>INCLUDE</code>.
+
<code>FCTTRE.h</code> contient des fonctions "en ligne", syntaxe qui est dépréciée. De plus, c'est utilisé via un <code>INCLUDE</code>.
 
Cependant, si on met ces fonctions dans un module à part (indépendament de questions de performance), on perd la convergence compilo car l'optimisation réalisée n'est pas la même.
 
Cependant, si on met ces fonctions dans un module à part (indépendament de questions de performance), on perd la convergence compilo car l'optimisation réalisée n'est pas la même.
 
Il sera donc intéressant, une fois qu'on est sur une version dont on est bien confiant, de tester cette migration, tant en performance qu'en résultats.
 
Il sera donc intéressant, une fois qu'on est sur une version dont on est bien confiant, de tester cette migration, tant en performance qu'en résultats.
Ligne 54 : Ligne 52 :
 
=== Remplacement du commun comgeom ===
 
=== Remplacement du commun comgeom ===
  
Le commun <code>/comgeom/</code> est partagé entre <code>lmdz_comgeom.f90</code> et <code>lmdz_comgeom2.f90</code>, afin de pouvoir de manière transparents passer les même tableaux en tant que 1D ou 2D.
+
Le common <code>/comgeom/</code> est partagé entre <code>lmdz_comgeom.f90</code> et <code>lmdz_comgeom2.f90</code>, afin de pouvoir de manière transparents passer les même tableaux en tant que 1D ou 2D.
 
Cette utilisation est dépréciée par Fortran, mais pas triviale à changer en module.
 
Cette utilisation est dépréciée par Fortran, mais pas triviale à changer en module.
 
Une solution serait de passer par des pointeurs et une routine d'initialisation.
 
Une solution serait de passer par des pointeurs et une routine d'initialisation.
 +
 +
=== Common iniCOSP ===
 +
 +
Le common défini dans <code>ini_COSP.h</code>  est un peu tricky à remplacer car il a besoin de <code>klon,klev</code> qui ne sont pas des constantes.
 +
Une (bonne) manière de faire serait de faire un type dérivé. C'est d'ailleurs ce que je préconise pour remplacer les très longues listes d'arguments, mais c'est à discuter avec le reste du groupe...
 +
 +
== Vitesse ==
 +
 +
A titre indicatif, quelques stats. Attention à l'interprétation (variabilité interne, etc.), la quantité intéressant est le <code>min</code>.
 +
 +
=== r5158 v r5017 ===
 +
 +
==== séquentiel ====
 +
 +
r5017:
 +
* compil lmdz: <code>Time (mean ± σ):    152.594 s ± 62.315 s | Range (min … max):  109.719 s … 263.752 s    10 runs</code>
 +
* bench: <code>Time (mean ± σ):    123.119 s ± 42.065 s | Range (min … max):  89.570 s … 200.606 s    10 runs</code>
 +
 +
r5158
 +
* compil lmdz: <code>Time (mean ± σ):    111.737 s ±  4.910 s | Range (min … max):  106.716 s … 118.421 s    10 runs</code>
 +
* bench: <code>Time (mean ± σ):    92.876 s ±  2.105 s | Range (min … max):  87.766 s … 94.780 s    10 runs</code>
 +
 +
==== mpi_omp ====
 +
 +
r5017:
 +
* compil lmdz: <code>Time (mean ± σ):    119.116 s ±  4.124 s | Range (min … max):  114.514 s … 125.466 s    10 runs</code>
 +
* bench: <code>Time (mean ± σ):    50.382 s ±  0.994 s | Range (min … max):  49.248 s … 52.130 s    10 runs</code>
 +
 +
r5158
 +
* compil lmdz:  <code>Time (mean ± σ):    130.779 s ±  5.543 s | Range (min … max):  123.503 s … 139.438 s    10 runs</code>
 +
* bench: <code>Time (mean ± σ):    52.444 s ±  1.080 s | Range (min … max):  51.387 s … 54.530 s    10 runs</code>
 +
 +
=== r5159 ===
 +
 +
This rev replaces all <code>INCLUDE "dimensions.h",INCLUDE"paramet.h"</code> by modules. One could think this would impact performance.
 +
The bench suggests otherwise:
 +
 +
Seq: <code>Time (mean ± σ):    101.333 s ± 20.405 s | Range (min … max):  91.460 s … 150.911 s    10 runs</code>
 +
 +
Para: <code>Time (mean ± σ):    49.341 s ±  0.353 s | Range (min … max):  48.740 s … 50.028 s    10 runs</code>

Version actuelle en date du 23 septembre 2024 à 09:14

 Ceci est une page temporaire qui commente certains aspects de la branche Amaury_dev en attendant qu'elle soit mergée

La branche Amaury_dev vise à moderniser une grande partie du code de LMDZ, en partant de r5056.

Les grands changements (r5155) sont :

  • Le remplacement de nombreux INCLUDE *.h par des modules, en particulier cela remplace un certain nombre de COMMON
  • La conversion de tous les fichiers fixed-form *.F en free-form *.[fF]90
  • Le remplacement d'un certain nombre d'utilisations de clés CPP par des booléens Fortran, et la création de wrappers associés au besoin
  • Le remplacement des appels à la librairie netcdf-fortran77 par la librairie netcdf-fortran90 (ce qui vire les INCLUDE "netcdf.h")
  • La suppression / déplacement dans obsolete de code très ancien et inutilisé
  • La correction de la plupart des warnings de compilation gfortran
  • La mise à jour des sources FCM à la dernière version (mais sans passer à FCM2, on utilise encore les options legacy)
  • La correction de bugs mineurs (e.g. type casting) et majeurs (e.g. mauvais indices de boucles, appels erronés) trouvés lors du nettoyage
  • Le renommage des modules en lmdz_* pour éviter les collisions de namespace
  • L'harmonisation de la syntaxe Fortran (cf LMDZ_code_guidelines)
  • Un linting de la plupart des fichiers

Convergence

La version r5157 (=r5155 + hotfix cosp) est quasiment convergée partout, et peut servir de référence :

 # Tests auto de convergence
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad oldrad -parallel none -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-rad oldrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-rad rrtm -parallel none -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad rrtm -parallel none -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-rad rrtm -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-rad ecrad -parallel none -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad ecrad -parallel none -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-rad ecrad -parallel mpi_omp -veget CMIP6 -compilephysiq lmd
All good ! for r5155/r5017=-debug -rad oldrad -parallel none -veget none -compilephysiq lmd
All good ! for r5155/r5017=-debug -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmd -d 79
All good ! for r5155/r5017=-rad oldrad -parallel none -veget none -compilephysiq lmdiso -d 48x36x39
All good ! for r5157/r5150=-xios -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd
All good ! for r5157/r5017=-cosp v1 -rad oldrad -parallel mpi_omp -veget none -compilephysiq lmd

(XIOS est testé vs 5150 car il segfault sur 5017)

Opérations mises "de côté"

Remplacement de FCTTRE.h

FCTTRE.h contient des fonctions "en ligne", syntaxe qui est dépréciée. De plus, c'est utilisé via un INCLUDE. Cependant, si on met ces fonctions dans un module à part (indépendament de questions de performance), on perd la convergence compilo car l'optimisation réalisée n'est pas la même. Il sera donc intéressant, une fois qu'on est sur une version dont on est bien confiant, de tester cette migration, tant en performance qu'en résultats.

Remplacement du commun comgeom

Le common /comgeom/ est partagé entre lmdz_comgeom.f90 et lmdz_comgeom2.f90, afin de pouvoir de manière transparents passer les même tableaux en tant que 1D ou 2D. Cette utilisation est dépréciée par Fortran, mais pas triviale à changer en module. Une solution serait de passer par des pointeurs et une routine d'initialisation.

Common iniCOSP

Le common défini dans ini_COSP.h est un peu tricky à remplacer car il a besoin de klon,klev qui ne sont pas des constantes. Une (bonne) manière de faire serait de faire un type dérivé. C'est d'ailleurs ce que je préconise pour remplacer les très longues listes d'arguments, mais c'est à discuter avec le reste du groupe...

Vitesse

A titre indicatif, quelques stats. Attention à l'interprétation (variabilité interne, etc.), la quantité intéressant est le min.

r5158 v r5017

séquentiel

r5017:

  • compil lmdz: Time (mean ± σ): 152.594 s ± 62.315 s | Range (min … max): 109.719 s … 263.752 s 10 runs
  • bench: Time (mean ± σ): 123.119 s ± 42.065 s | Range (min … max): 89.570 s … 200.606 s 10 runs

r5158

  • compil lmdz: Time (mean ± σ): 111.737 s ± 4.910 s | Range (min … max): 106.716 s … 118.421 s 10 runs
  • bench: Time (mean ± σ): 92.876 s ± 2.105 s | Range (min … max): 87.766 s … 94.780 s 10 runs

mpi_omp

r5017:

  • compil lmdz: Time (mean ± σ): 119.116 s ± 4.124 s | Range (min … max): 114.514 s … 125.466 s 10 runs
  • bench: Time (mean ± σ): 50.382 s ± 0.994 s | Range (min … max): 49.248 s … 52.130 s 10 runs

r5158

  • compil lmdz: Time (mean ± σ): 130.779 s ± 5.543 s | Range (min … max): 123.503 s … 139.438 s 10 runs
  • bench: Time (mean ± σ): 52.444 s ± 1.080 s | Range (min … max): 51.387 s … 54.530 s 10 runs

r5159

This rev replaces all INCLUDE "dimensions.h",INCLUDE"paramet.h" by modules. One could think this would impact performance. The bench suggests otherwise:

Seq: Time (mean ± σ): 101.333 s ± 20.405 s | Range (min … max): 91.460 s … 150.911 s 10 runs

Para: Time (mean ± σ): 49.341 s ± 0.353 s | Range (min … max): 48.740 s … 50.028 s 10 runs