Como rodar o benchmark do MPAS

## Obtenção do benchmark

O benchmark pode ser obtido a partir deste site da UCAR https://www2.mmm.ucar.edu/projects/mpas/benchmark/

Há dados para as versões v5.2, v6.x e v7.0. Neste documento os exemplos foram preparados para trabalhar com dados da versão v6.x. Baixar os dados com resolução de 10 km.

$ wget https://www2.mmm.ucar.edu/projects/mpas/benchmark/v6.x/MPAS-A_benchmark_10km_L56.tar.gz
$ tar zxvf MPAS-A_benchmark_10km_L56.tar.gz
$ cd MPAS-A_benchmark_10km_L56
$ ls -A1
CAM_ABS_DATA.DBL
CAM_AEROPT_DATA.DBL
GENPARM.TBL
LANDUSE.TBL
OZONE_DAT.TBL
OZONE_LAT.TBL
OZONE_PLEV.TBL
RRTMG_LW_DATA
RRTMG_LW_DATA.DBL
RRTMG_SW_DATA
RRTMG_SW_DATA.DBL
SOILPARM.TBL
VEGPARM.TBL
namelist.atmosphere
stream_list.atmosphere.diagnostics
stream_list.atmosphere.output
stream_list.atmosphere.surface
streams.atmosphere
x1.5898242.graph.info
x1.5898242.graph.info.part.1024
x1.5898242.graph.info.part.1536
x1.5898242.graph.info.part.16384
x1.5898242.graph.info.part.2048
x1.5898242.graph.info.part.3600
x1.5898242.graph.info.part.4096
x1.5898242.graph.info.part.512
x1.5898242.graph.info.part.6144
x1.5898242.graph.info.part.768
x1.5898242.graph.info.part.8192
x1.5898242.init.nc

Preparação para rodar o benchmark

Para executar o benchmark em paralelo, deve-se realizar uma preparação prévia. O arquivo x1.5898242.init.nc é o arquivo de malha, onde o número 5898242 corresponde ao número de células da malha, relativo a resolução de 10 km.

O arquivo x1.5898242.graph.info refere-se ao grafo associado a malha. Neste caso, o grafo possui 17694720 vértices e 11796480 arestas. Por exemplo, o arquivo x1.26214422.graph.info.part.512 contém informação do particionamento do grafo, dividido em 512 sub-regiões. Ao ser executado o MPAS em paralelo com "p" processos MPI (mpi ranks), deve existir no mesmo diretório de submissão o arquivo x1.5898242.graph.info.part.<p>. Portanto, o benchmark de 10 km já vem habilitado para ser executado em paralelo com número de mpi ranks entre 36 e 16384 mpi ranks. Para rodar com outro número de processos MPI, pode-se gerar o arquivo particionado com a bliblioteca METIS, sobretudo quando não houver o arquivo correspondente ao número de processos MPI que deseja ser utilizado.

Alguns ambientes computacionais já possuem o pacote/módulo da biblioteca METIS instalados para gerar o arquivo e particionamento em quantas partições forem necessárias. Por exemplo, para criar o arquivo de particionamento para executar o MPAS com 256 processos MPI:

$ module load metis
$ gpmetis -minconn -contig -niter=200 x1.5898242.graph.info 256  

Execução do benchmark do MPAS

O arquivo namelist.atmosphere configura os parâmetros de execução. O parâmetro que define o tempo de integração é dado por config_run_duration = '5_00:00:00', ou seja, 5 dias.

namelist.atmosphere

&nhyd_model
    config_time_integration_order = 2
    config_dt = 60.0
    config_start_time = '2010-10-23_00:00:00'
    config_run_duration = '5_00:00:00'
    config_split_dynamics_transport = true
    config_number_of_sub_steps = 2
    config_dynamics_split_steps = 3
    config_h_mom_eddy_visc2 = 0.0
    config_h_mom_eddy_visc4 = 0.0
    config_v_mom_eddy_visc2 = 0.0
    config_h_theta_eddy_visc2 = 0.0
    config_h_theta_eddy_visc4 = 0.0
    config_v_theta_eddy_visc2 = 0.0
    config_horiz_mixing = '2d_smagorinsky'
    config_len_disp = 10000.0
    config_visc4_2dsmag = 0.05
    config_w_adv_order = 3
    config_theta_adv_order = 3
    config_scalar_adv_order = 3
    config_u_vadv_order = 3
    config_w_vadv_order = 3
    config_theta_vadv_order = 3
    config_scalar_vadv_order = 3
    config_scalar_advection = true
    config_positive_definite = false
    config_monotonic = true
    config_coef_3rd_order = 0.25
    config_epssm = 0.1
    config_smdiv = 0.1
/
&damping
    config_zd = 22000.0
    config_xnutr = 0.2
/
&io
    config_pio_num_iotasks = 0
    config_pio_stride = 1
/
&decomposition
    config_block_decomp_file_prefix = 'x1.5898242.graph.info.part.'
/
&restart
    config_do_restart = false
/
&printout
    config_print_global_minmax_vel = true
    config_print_detailed_minmax_vel = false
/
&IAU
    config_IAU_option = 'off'
    config_IAU_window_length_s = 21600.
/
&physics
    config_sst_update = false
    config_sstdiurn_update = false
    config_deepsoiltemp_update = false
    config_radtlw_interval = '00:10:00'
    config_radtsw_interval = '00:10:00'
    config_bucket_update = 'none'
    config_physics_suite = 'mesoscale_reference'
/
&soundings
    config_sounding_interval = 'none'
/

O arquivo streams.atmosphere configura quais campos (variáveis) serão gravadas em disco durante a execução do modelo. Por exemplo, exemplo abaixo, somente as variáveis diagnósticas serão gravadas <stream name="diagnostics", e em um intervalo 3 horas entre as saídas output_interval="03:00:00".

streams.atmosphere

<streams>
<immutable_stream name="input"
                  type="input"
                  io_type="pnetcdf,cdf5"
                  precision="single"
                  filename_template="x1.5898242.init.nc"
                  input_interval="initial_only" />

<immutable_stream name="restart"
                  type="input;output"
                  filename_template="restart.$Y-$M-$D_$h.$m.$s.nc"
                  input_interval="initial_only"
                  output_interval="none" />

<stream name="output"
        type="output"
        filename_template="history.$Y-$M-$D_$h.$m.$s.nc"
        output_interval="none" >

        <file name="stream_list.atmosphere.output"/>
</stream>

<stream name="diagnostics"
        type="output"
        filename_template="diag.$Y-$M-$D_$h.$m.$s.nc"
        output_interval="03:00:00" >

        <file name="stream_list.atmosphere.diagnostics"/>
</stream>

<stream name="surface"
        type="input"
        filename_template="x1.5898242.sfc_update.nc"
        filename_interval="none"
        input_interval="none" >

        <var name="sst" />
        <var name="xice" />
</stream>

<immutable_stream name="iau"
                  type="input"
                  filename_template="x1.5898242.AmB.$Y-$M-$D_$h.$m.$s.nc"
                  filename_interval="none"
                  packages="iau"
                  input_interval="initial_only" />

</streams>

Para fazer uma execução do benchmark do MPAS, por exemplo, com 256 processos MPI:

mpirun -np 256 ./atmosphere_model 

Se a execução tiver sido bem-sucedida, no final haverá o arquivo log.atmosphere.0000.out mais os arquivos de saída diag.$Y-$M-$D_$h.$m.$s.nc:

$ ls -A1 diag.2010-10-2*
diag.2010-10-23_00.00.00.nc
diag.2010-10-23_03.00.00.nc
diag.2010-10-23_06.00.00.nc
diag.2010-10-23_09.00.00.nc
diag.2010-10-23_12.00.00.nc
diag.2010-10-23_15.00.00.nc
diag.2010-10-23_18.00.00.nc
diag.2010-10-23_21.00.00.nc
diag.2010-10-24_00.00.00.nc

...

diag.2010-11-02_00.00.00.nc

No final do arquivo log.atmosphere.0000.out, com conteúdo similar abaixo, onde constam diversas informações sobre o tempo de execução do modelo. Eestes tempos mostrados abaixo NÃO SÃO referência para este benchmark. Servem unicamente para ilustrar como os tempos devem aparecer no arquivo log.atmosphere.0000.out.

 ********************************************************
    Finished running the atmosphere core
 ********************************************************


  Timer information:
     Globals are computed across all threads and processors

  Columns:
     total time: Global max of accumulated time spent in timer
     calls: Total number of times this timer was started / stopped.
     min: Global min of time spent in a single start / stop
     max: Global max of time spent in a single start / stop
     avg: Global max of average time spent in a single start / stop
     pct_tot: Percent of the timer at level 1
     pct_par: Percent of the parent timer (one level up)
     par_eff: Parallel efficiency, global average total time / global max total time


    timer_name                                            total       calls        min            max            avg      pct_tot   pct_par     par_eff
  1 total time                                        3774.92407         1     3774.91846     3774.92407     3774.92139   100.00       0.00       1.00
  2  initialize                                        150.40375         1      150.31792      150.40375      150.39342     3.98       3.98       1.00
  2  time integration                                 3618.48730      1440        1.97318       33.40007        2.51205    95.86      95.86       1.00
  3   physics driver                                  1794.53015      1440        0.47506       30.66323        1.01738    47.54      49.59       0.82
  4    calc_cldfraction                                 37.72757       144        0.10280        0.30112        0.19196     1.00       2.10       0.73
  4    driver_sfclayer                                  38.91610      1440        0.00829        0.10979        0.01556     1.03       2.17       0.58
  5     Monin-Obukhov                                   37.74515      1440        0.00763        0.10173        0.01476     1.00      96.99       0.56
  4    Noah                                            398.69632      1440        0.00670        0.31040        0.10756    10.56      22.22       0.39
  4    PBL Scheme                                       28.18152      1440        0.01831        0.18569        0.01912     0.75       1.57       0.98
  5     YSU                                             18.03782      1440        0.01189        0.03441        0.01238     0.48      64.01       0.99
  4    GWDO_YSU                                          5.10650      1440        0.00311        0.01023        0.00333     0.14       0.28       0.94
  4    New_Tiedtke                                      69.10799      1440        0.03966        0.15385        0.04497     1.83       3.85       0.94
  3   atm_rk_integration_setup                           2.44509      1440        0.00148        0.26099        0.00164     0.06       0.07       0.96
  3   atm_compute_moist_coefficients                     5.66098      1440        0.00371        0.03462        0.00382     0.15       0.16       0.97
  3   physics_get_tend                                  19.40721      1440        0.01049        0.28351        0.01262     0.51       0.54       0.94
  3   atm_compute_vert_imp_coefs                         7.26115      4320        0.00157        0.06722        0.00164     0.19       0.20       0.98
  3   atm_compute_dyn_tend                             226.43816     12960        0.01394        0.25307        0.01695     6.00       6.26       0.97
  3   small_step_prep                                   14.93314     12960        0.00108        0.25423        0.00112     0.40       0.41       0.97
  3   atm_advance_acoustic_step                        160.02155     17280        0.00855        0.02139        0.00900     4.24       4.42       0.97
  3   atm_divergence_damping_3d                         11.98194     17280        0.00066        0.00524        0.00067     0.32       0.33       0.97
  3   atm_recover_large_step_variables                  43.91561     12960        0.00320        0.01631        0.00329     1.16       1.21       0.97
  3   atm_compute_solve_diagnostics                     72.96220     12960        0.00497        0.07662        0.00547     1.93       2.02       0.97
  3   atm_rk_dynamics_substep_finish                    25.99814      4320        0.00438        0.03459        0.00581     0.69       0.72       0.97
  3   atm_advance_scalars                               56.72322      2880        0.01886        0.03387        0.01907     1.50       1.57       0.97
  3   atm_advance_scalars_mono                         105.81931      1440        0.06356        0.50133        0.07237     2.80       2.92       0.98
  3   atm_rk_reconstruct                                 3.24145      1440        0.00214        0.02676        0.00218     0.09       0.09       0.97
  3   microphysics                                     108.32672      1440        0.03956        0.09928        0.07134     2.87       2.99       0.95
  4    WSM6                                             88.15473      1440        0.02281        0.07295        0.05739     2.34      81.38       0.94
  3   atm_rk_summary                                   111.37351      1440        0.04168        0.29677        0.06442     2.95       3.08       0.83
  3   mpas update GPU data on host                      46.42823      1440        0.02295        0.07186        0.02970     1.23       1.28       0.92

 -----------------------------------------
 Total log messages printed:
    Output messages =                18973
    Warning messages =                   3
    Error messages =                     0
    Critical error messages =            0
 -----------------------------------------

As instruções para a versão v7.0 e superior seguem o mesmo padrão.

Execução do benchmark do MPAS com OpenACC (GPU)

Referência: GPU-enabled MPAS-Atmosphere (site) https://mpas-dev.github.io/atmosphere/OpenACC/running.html

Suportado com MPAS compilado com o compilador PGI/NVIDIA.

Configuração do ambiente

O número de processos MPI neste caso deverá ser atribuído para execuçao híbrida em GPU e em CPU, é determinado em tempo de execução por variáveis ​​de ambiente. Antes de rodar o executável atmosphere_model, as duas variáveis ​​de ambiente a seguir devem ser definidas previamente:

MPAS_DYNAMICS_RANKS_PER_NODE - o número de processos MPI por nó que executará o modelo em GPUs.

MPAS_RADIATION_RANKS_PER_NODE – o número de processos MPI por nó que executará os esquemas de radiação nas CPUs.

No momento, essas duas variáveis ​​de ambiente devem ser definidas para números inteiros pares, pois o código pressupõe que cada nó tenha ao menos dois sockets, nos quais as tarefas de CPU e GPU devem ser distribuídas uniformemente. A soma de MPAS_DYNAMICS_RANKS_PER_NODE e MPAS_RADIATION_RANKS_PER_NODE deve ser igual ao número total de processos MPI em execução em cada nó.

Por exempo:

$ export MPAS_DYNAMICS_RANKS_PER_NODE = 4    # processamento em GPU
$ export MPAS_RADIATION_RANKS_PER_NODE = 12  # processamento em CPU
$ mpirun -np 16 ./atmosphere_model

E devem ter sido previamente gerados também os respectivos arquivos de partição x1.5898242.graph.info.part.4 (para porcessamento em GPU) e x1.5898242.graph.info.part.12 (para porcessamento em CPU).

Em geral, se o modelo for executado em n nós, dois arquivos de partição de malha serão necessários pelo modelo: um arquivo com partições (n × MPAS_DYNAMICS_RANKS_PER_NODE) ​​e outro arquivo com partições (n × MPAS_RADIATION_RANKS_PER_NODE).

Por exemplo:

$ export MPAS_DYNAMICS_RANKS_PER_NODE = 4    # processamento em GPU
$ export MPAS_RADIATION_RANKS_PER_NODE = 12  # processamento em CPU
$ mpirun -np 64 ./atmosphere_model

A execução paralela sendo realizada em 4 nós, devem ter sido previamente gerados também os respectivos arquivos de partição x1.5898242.graph.info.part.16 (para porcessamento em GPU) e x1.5898242.graph.info.part.48 (para processaento em CPU).

Arquivos de saída da execução

Na versão padrão do MPAS, todos os ranks MPI participam de todos os cálculos de física e dinâmica, e apenas o rank 0 grava um arquivo de log por padrão. Quando diferentes partições do comunicador global MPI executam funções diferentes – seja computação de radiação em CPUs ou física e dinâmica de não radiação em GPUs – cada uma das duas funções criará um arquivo de log.

O arquivo log.atmosphere.role01.0000.out contém mensagens de log do rank 0 do intracomunicador MPI rodando em GPUs, enquanto o arquivo log.atmosphere.role02.0000.out contém mensagens de log do rank 0 do intracommunicator MPI rodando em CPUs .