GAD-DIMNT-CPTEC / oensMB09

Método de Perturbação baseado em EOFs para o Brazilian global Atmospheric Model - BAM
https://gad-dimnt-cptec.github.io/oensMB09/
0 stars 1 forks source link

Testes com o compilador Intel #3

Closed cfbastarz closed 1 year ago

cfbastarz commented 1 year ago

Nesta issue, serão realizados testes com o compilador Intel na Egeon.

cfbastarz commented 1 year ago

A compilação com ambiente de programação da Intel na máquina Egeon, para o oensMB09, deve ser feita da seguinte forma:

  1. Login na Egeon;

  2. Carregamento do ambiente:

    module purge
    module load ohpc
    module swap gnu9 intel
    module swap openmpi4 impi
    module load hwloc
    module load phdf5
    module load netcdf
    module load netcdf-fortran
    module swap intel intel/2022.1.0
  3. Compilação do oensMB09:

    make comp=intel
  4. Compilação do pré-processamento, modelo e pós-processamento (testado com o BAM_V1.2.1):

    cd pre/sources
    make linux_intel_egeon
    cd ../../model/source
    make linux_intel_egeon
    cd ../../pos/source
    make linux_intel_egeon

O ambiente de referência tem, portanto, os seguintes módulos carregados:

Currently Loaded Modules:
1) autotools      6) compiler-rt/2021.4.0  11) mkl/2021.4.0    16) netcdf/4.7.4
2) prun/2.2       7) debugger/2021.6.0     12) intel/2022.1.0  17) netcdf-fortran/4.5.3
3) ohpc           8) dpl/2021.4.0          13) mpi/2021.4.0
4) hwloc/2.5.0    9) oclfpga/2021.4.0      14) impi/2021.4.0
5) tbb/2021.4.0  10) compiler/2022.1.0     15) phdf5/1.10.8

Nota: foram feitos alguns ajustes para a compilação das bibliotecas bacio e nemsio do pré-processamento. Foi adicionado o arquivo Makefile.linux_intel_egeon ao pré, model e pós. Para a compilação da w3lib do pós-processamento, foram feitos alguns ajustes sugeridos pelo @JAAravequia em https://projetos.cptec.inpe.br/projects/smna/wiki/Portabilidade_do_sistema/34#w3lib-14.

cfbastarz commented 1 year ago

Realizando testes de execução do pré-processamento com os executáveis gerados pelo compilador da Intel na Egeon, percebi que o Chopping não é executado da forma correta. O código pára na chamada da biblioteca nemsio, mais especificamente na chamada do módulo baopenr, indicando um problema com o código de retorno da rotina:

Boundary Run-Time Check Failure for variable 'nemsio_openclose_mp_nemsio_open_$IOS'

Entrei em contato com o pessoal do EMC para obter mais informações (https://github.com/NOAA-EMC/NCEPLIBS-nemsio/issues/64), mas acredito que esse problema seja devido ou ao compilador (versão) ou aos módulos que estou carregando para a compilação ou mesmo dentro do script do submissão.

Foram testados diferentes flags de debug e níveis de otimização para a compilação da biblioteca e do código do pré-processamento, sempre resultando no mesmo problema. De fato, o código roda quando a análise já se encontra em disco (e.g., em um teste anterior com o GNU, esqueci de remover a análise do model/datain e o Chopping_parallel aceitou essa análise (?)).

cfbastarz commented 1 year ago

Conversando com o pessoal do EMC, foi sugerido (vide issue lincada na mensagem anterior) utilizar a versão mais recento do nemsio. Para fazer isso, foi necessário utilizar também as bibliotecas bacio e w3emc (no modelo BAM, esta biblioteca é a w3lib). A estrutura de compilação das versões atuais destas bibliotecas utiliza do CMake, mas foi possível compilar elas por fora da estutura de compilação do modelo (ver instruções a seguir) e depois utilizar as bibliotecas geradas na compilação do pré-processamento do modelo BAM. Um detalhe é que foi necessário inserir a compilação da rotina nemsio_gfs.f90 dentro da estrutura de compilação do nameio, e isso foi feito apenas adionando o nome da rotina dentro do arquivo NCEPLIBS-nemsio-2.5.4/src/CMakeLists.txt. Fiz um teste com o Chopping_parallel e funcionou sem problemas.

Nota: olhando em https://github.com/NOAA-EMC/NCEPLIBS, percebi que a rotina nemsio_gfs.f90 está em um repositório separado em https://github.com/NOAA-EMC/NCEPLIBS-nemsiogfs

Para compilar o pré-processamento utilizando as bibliotecas NCEPLIBS-bacio, NCEPLIBS_w3emc e NCEPLIBS-nemsio utilizando o compilador Intel na Egeon:

Nota: atualização das instruções registradas na mensagem original desta issue.

  1. Carregar os módulos para a compilação com o ambiente da Intel:

    module purge
    module load ohpc
    module swap gnu9 intel
    module swap openmpi4 impi
    module load hwloc
    module load phdf5
    module load netcdf
    module load netcdf-fortran
    module swap intel intel/2022.1.0
  2. Carregar o módulo cmake/3.21.3:

    module load cmake/3.21.3
  3. Com as releases das bibliotecas NCEPLIBS-bacio, NCEPLIBS_w3emc e NCEPLIBS-nemsio baixadas, utilizar o cmake para a compilação, da seguinte forma e ordem:

    • NCEPLIBS-bacio-2.5.0:

      cd NCEPLIBS-bacio-2.5.0
      mkdir build
      cd build
      CC=/opt/intel/oneapi/mpi/2021.4.0/bin/mpiicc cmake -DCMAKE_INSTALL_PREFIX=/mnt/beegfs/carlos.bastarz/NCEPLIBS-bacio-2.5.0/rls ..
      make -j2
      make install
    • NCEPLIBS-w3emc-2.9.3:

      cd NCEPLIBS-w3emc-2.9.3
      mkdir build
      cd build
      CC=/opt/intel/oneapi/mpi/2021.4.0/bin/mpiicc FC=/opt/intel/oneapi/mpi/2021.4.0/bin/mpif90 cmake -DCMAKE_INSTALL_PREFIX=/mnt/beegfs/carlos.bastarz/NCEPLIBS-w3emc-2.9.3/rls -DCMAKE_PREFIX_PATH="/mnt/beegfs/carlos.bastarz/NCEPLIBS-bacio-2.5.0/rls" ..
      make -j2
      make install
    • NCEPLIBS-nemsio-2.5.4:

      cd NCEPLIBS-nemsio-2.5.4
      mkdir build
      cd build
      CC=/opt/intel/oneapi/mpi/2021.4.0/bin/mpiicc FC=/opt/intel/oneapi/mpi/2021.4.0/bin/mpif90 cmake -DCMAKE_INSTALL_PREFIX=/mnt/beegfs/carlos.bastarz/NCEPLIBS-nemsio-2.5.4/rls -DCMAKE_PREFIX_PATH="/mnt/beegfs/carlos.bastarz/NCEPLIBS-bacio-2.5.0/rls;/mnt/beegfs/carlos.bastarz/NCEPLIBS-w3emc-2.9.3/rls" ..
      make -j2
      make intall

Nota: Nos procedimentos de compilação, foram passadas as variáveis FC e CC para indicar corretamente os compiladores a serem indicados, caso contrário, mesmo com o módulos do ambiente de compilação Intel carregados, o gfortran será utilizado; há dois pontos .. que fazem parte do comando cmake e eles não podem ser omitidos, pois indicam para o cmake que o arquivo CMakeLists.txt utilizado na compilação, está no diretório anterior.

  1. Compilação do pré-processamento:

    Considerando que as bibliotecas nemsio, bacio e w3emc (ou w3lib) já estão compiladas, não foi necessário compilar as versões que vem junto com o modelo. Apesar disso, a w3lib do modelo foi compilada. Com isso, foi necessário apenas linkar os arquivo *.a e *.mod que foram gerados nas etapas anteriores para os locais em que se espera que estes arquivos estejam. Dessa forma, foi feito o seguinte:

    • Link da biblioteca libnemsio.a e arquivos de módulos:

      cd /mnt/beegfs/carlos.bastarz/oensMB09/pre/sources/nemsio/v2.2.2/src
      ln -s /mnt/beegfs/carlos.bastarz/NCEPLIBS-nemsio-2.5.4.mod/rls/lib64/libnemsio.a .
      
      cd /mnt/beegfs/carlos.bastarz/oensMB09/pre/sources/nemsio/v2.2.2/src/incmod
      ln -s /mnt/beegfs/carlos.bastarz/NCEPLIBS-nemsio-2.5.4.mod/rls/include/* .
    • Link das bibliotecas libbacio_8.a e libbacio_4.a:

      cd /mnt/beegfs/carlos.bastarz/oensMB09/pre/sources/bacio/v2.0.2/src_64bits
      ln -s /mnt/beegfs/carlos.bastarz/NCEPLIBS-bacio-2.5.0/rls/lib/libbacio.a .
      ln -s libbacio.a libbacio_8.a
      
      cd /mnt/beegfs/carlos.bastarz/oensMB09/pre/sources/bacio/v2.0.2/src_32bits
      ln -s /mnt/beegfs/carlos.bastarz/NCEPLIBS-bacio-2.5.0/rls/lib/libbacio.a .
      ln -s libbacio.a libbacio_4.a
    • Ajustes no arquivo /mnt/beegfs/carlos.bastarz/oensMB09/pre/sources/Makefile:

      Para evitar a compilação das bibliotecas bacio e nemsio do pré-processamento, foram comentadas as linhas referentes às estas bibliotecas no referido arquivo Makefile:

      47 .DEFAULT:
      48
      49 # @- (cd .; if [ -f makefiles/Makefile.$@ -a ! -f bacio/v2.0.2/src_32bits/Makefile.$@ ];\
      50 #    then ln -fs ../../../makefiles/Makefile.$@ bacio/v2.0.2/src_32bits/Makefile.$@; fi)
      51 #
      52 # @- (cd .; if [ -f makefiles/Makefile.$@ -a ! -f bacio/v2.0.2/src_64bits/Makefile.$@ ];\
      53 #    then ln -fs ../../../makefiles/Makefile.$@ bacio/v2.0.2/src_64bits/Makefile.$@; fi)
      54
      55   @- (cd .; if [ -f makefiles/Makefile.$@ -a ! -f w3lib-1.4/Makefile.$@ ];\
      56      then ln -fs ../makefiles/Makefile.$@ w3lib-1.4/Makefile.$@; fi)
      57
      58 # @- (cd .; if [ -f makefiles/Makefile.$@ -a ! -f nemsio/v2.2.2/src/Makefile.$@ ];\
      59 #    then ln -fs ../../../makefiles/Makefile.$@ nemsio/v2.2.2/src/Makefile.$@; fi)
      223 #
      224 # builds the binaries
      225 #
      226
      227 ##  @- (cd bacio/v2.0.2/src_32bits;$(MAKE) -f Makefile.$@;$(MAKE) -f Makefile.$@)
      228 ##  @- (cd bacio/v2.0.2/src_64bits;$(MAKE) -f Makefile.$@;$(MAKE) -f Makefile.$@)
      229 # @- (rm -rf bacio/v2.0.2/$@; cd bacio/v2.0.2/src_64bits; ./makebacio_cptec.sh $@)
      230 # @- (cd bacio/v2.0.2/src_64bits; ln -sf ../$@/libbacio_8.a .)
      231 # @- (cd bacio/v2.0.2/src_32bits; ln -sf ../$@/libbacio_4.a .)
      232   @- (cd w3lib-1.4;$(MAKE) -f Makefile.$@;$(MAKE) -f Makefile.$@)
      233 ##  @- (cd nemsio/v2.2.2/src;$(MAKE) -f Makefile.$@;$(MAKE) -f Makefile.$@)
      234 # @- (cd nemsio/v2.2.2/src; ./makenemsio_cptec.sh $@; $(MAKE))
      402 clean:
      403   @echo "$(MAKE)"
      404
      405   (cd w3lib-1.4;$(MAKE) -f Makefile.common clean)
      406 # (cd bacio/v2.0.2/src_32bits/;$(MAKE) -f Makefile.common clean)
      407 # (cd bacio/v2.0.2/src_64bits/;$(MAKE) -f Makefile.common clean)
      408 # (cd nemsio/v2.2.2/src/;$(MAKE) -f Makefile.common clean)

    Finalmente, a compilação do pré-processamento pode ser feita com o comando:

    make linux_intel_egeon
cfbastarz commented 1 year ago

Comentando um pouco sobre os últimos pushes:

Estas modificações deverão ser integradas à versão BAM_V1.2.1 que está no repositório em https://github.com/GAD-DIMNT-CPTEC/cfbastarz/tree/main/BAM_V1.2.1.