wiki:IntegrationOpenMP/EnteteCommandesOccigen

Version 3 (modified by mafoipsl, 9 years ago) (diff)

--

Entête des jobs et commandes occigen

Cette page décrit les entêtes des jobs sur occigen ainsi que les commandes à lancer pour avoir un exécutable simple ou un couplé (oasis ou XIOS).

Un executable séquentiel

  • Entête du job
    #!/bin/bash
    #SBATCH -J job_name
    #SBATCH -e job_name.e%j
    #SBATCH -o job_name.o%j
    #SBATCH --nodes=1
    #SBATCH --ntasks=1
    #SBATCH --ntasks-per-node=24
    #SBATCH --threads-per-core=1
    #SBATCH --time=00:10:00
    
    
  • Commande
    time ./mon_executable param1 param2 …
    

Un executable parallélisé avec MPI seulement

  • Entête du job
    #!/bin/bash
    #SBATCH -J job_name
    #SBATCH --nodes=2
    #SBATCH --ntasks=48
    #SBATCH --ntasks-per-node=24
    #SBATCH --threads-per-core=1
    #SBATCH --time=00:30:00
    #SBATCH --output job_name.output
    
  • Commande
    module purge
    module load intel/15.0.0.090
    module load bullxmpi/1.2.8.3
    time srun --mpi=pmi2 -K1 --resv-ports -n $SLURM_NTASKS ./mon_executable param1  param2 …
    
  • Résultat : srun lance 48 tâches MPI

NEMO MPI seul et XIOS en mode serveur

  • Merci à JMM, DRAKKAR et CINES
  • Entête du job
    #!/bin/bash
    #SBATCH --nodes=554
    #SBATCH --ntasks=13296
    #SBATCH --ntasks-per-node=24
    #SBATCH --threads-per-core=1
    #SBATCH -J nemo_occigen
    #SBATCH -e nemo_occigen.e%j
    #SBATCH -o nemo_occigen.o%j
    #SBATCH --time=24:00:00
    #SBATCH --exclusive
    }}}quit
     * Commande (exemple) :
    {{{
     time srun --mpi=pmi2  -m cyclic \
    --cpu_bind=map_cpu:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23\
        --multi-prog  ./ztask_file.conf
    }}}
      * avec ./ztask_file.conf contenant, oasis en premier obligatoirement:
    {{{
    0-295   ./xios_server.exe
    296-13295   ./opa
    }}}
     * Résultat : srun lance 13296 processus : 13000 pour NEMO et 296 pour XIOS
    
    == Couplage IPSL : LMDZ + NEMO + 1 XIOS en mode serveur  ==
    
     * ajouter dans le .bashrc ou au début du script slurm
    {{{
    ulimit -S -s unlimited  # stack
    ulimit -S -d unlimited  # data area
    ulimit -S -m unlimited  # memory
    ulimit -S -c 20
    ulimit -S -n unlimited  # memory
    ulimit -S -q unlimited  # memory
    }}}
     * script automatique de création du rankfile : create_rankfile_cyclic_nemo_16ppn.sh (notation logique avec BullxMPI sur noeuds HT)
    {{{
    MPI_LMDZ=$1
    OMP_LMDZ=$2
    PPN_LMDZ=$3
    MPI_NEMO=$4
    PPN_NEMO=$5
    MPI_XIOS=$6
    PPN_XIOS=$7
    
    # ...........................................................
    
    for i in $( nodeset -e $SLURM_NODELIST) ; do
      echo $i >> atos_host
      for j in {1..24}; do
      echo $i >> atos_host1
      done
    done
    
    rm -rf atos_lmdz_rankfile atos_xios_rankfile atos_nemo_rankfile
    
    compt=1 # rang absolu 
    go_nemo=0
    go_xios=0
    
    for node in $( nodeset -e $SLURM_NODELIST ) ; do boucle sur les noeuds présents dans la liste fournie par SLURM 
    	compt1=1 # rang local pour LMDZ
    	FIRST_CORE=0
    	FIRST_CORE1=0
        while [[ $compt -le $MPI_LMDZ && $compt1 -le $PPN_LMDZ ]]; do
    
    	if [ $compt1 -le $(( $PPN_LMDZ / 2 )) ] ; then
    
    	SOC=0  # scoket 0
    
    	LAST_CORE=$(( $FIRST_CORE + ( $OMP_LMDZ * 2)   ))
    	STRING=""
    
    	for core in ` seq $FIRST_CORE 2 $(( $LAST_CORE - 2  )) `; do
     		if [ $core == $FIRST_CORE ]; then
       			STRING=$( echo $core )
     		else
       			STRING=$( echo $STRING','$core )
     		fi
    	done
    	FIRST_CORE=$LAST_CORE
    
    	else # socket 1 
    
    	SOC=1
    	LAST_CORE=$(( $FIRST_CORE1 + ( $OMP_LMDZ * 2)   ))
    	STRING=""
    
    	for core in `seq $FIRST_CORE1 2 $(( $LAST_CORE - 2  ))  `; do
     		if [ $core == $FIRST_CORE1 ]; then
       			STRING=$( echo $core )
     		else
       			STRING=$( echo $STRING','$core )
     		fi
    	done
    	FIRST_CORE1=$LAST_CORE
    	fi
    
        echo "rank "$(( $compt - 1 ))"="$node" slot="$SOC":"$STRING >> atos_lmdz_rankfile
    
        compt=$(( $compt + 1 )) # maj rang absolu
        compt1=$(( $compt1 + 1 )) # maj rang local LMDZ
    
        old_node=$node # dernier noeud occupé par LMDZ
    
        done # end while for lmdz #------------------------------------------------------------
    #
    #   NEMO ne coexiste pas sur le même noeud que des tâches LMDZ
    #   NEMO : creation d'uh fichier temporaire NODEFILE pour NEMO 
    #
        if [[ $compt -eq $(( $MPI_LMDZ + 1 )) && $old_node != $node ]]; then
    	go_nemo=1
        fi
    
        if [[ $go_nemo -eq 1 && $compt -le $(( $MPI_LMDZ + $MPI_NEMO ))  ]]; then
    
    	compt2=1 # rang local NEMO
    	while [[ $compt2 -le $PPN_NEMO && $compt  -le $(( $MPI_LMDZ + $MPI_NEMO ))  ]]; do
    
    		STRING=$(( ( $compt2 - 1 ) * 2 ))
    
    
    		echo "rank "$(( $compt - 1 ))"="$node" slot="$STRING >> atos_nemo_rankfile
    		compt=$(( $compt + 1 )) # rang absolu
    		compt2=$(( $compt2 + 1 )) # rang local NEMO
    	done
        fi
    #
    # XIOS
    #
        if [[ $compt -eq $(( $MPI_LMDZ + $MPI_NEMO + 1 ))  ]]; then
    	go_xios=1
        fi
    
    	while [[ $go_xios -eq 1 && $compt -le $(( $MPI_LMDZ + $MPI_NEMO + $MPI_XIOS ))  ]]; do
    		STRING=$(( ( $compt2 + 1 ) * 2 ))
    		echo "rank "$(( $compt - 1 ))"="$node" slot="$STRING >> atos_xios_rankfile
    		compt=$(( $compt + 1 ))
    		compt2=$(( $compt2 + 1 ))
    	done
    done  # boucle for sur les noeuds présents dans la liste de SLURM
    # -------------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------------
    # NEMO : travail spécifique sur la distribution cyclique
    # Cyclic for NEMO
    #
    First_rank_nemo=$(( $MPI_LMDZ + 1 ))
    compt=1  # rang  NEMO
    while [[ $compt  -le $MPI_NEMO  ]]; do # boucle locale sur les rangs NEMO
    
    	compt2=1 # nombre de rangs NEMO sur le noeud en cours ( pour dépeuplement) 
    	compt_core=$compt2 # initialisation compteur position du core utilisé sur le socketen suivant la numérotation logique
            max_on_socket=$((  $PPN_NEMO /2 ))
    	while [[ $compt2 -le $PPN_NEMO && $compt  -le $MPI_NEMO ]]; do  # parcours des rangs NEMO 
    
    		for i in $( cat atos_nemo_rankfile | sed 's@=@ @g' | awk '{print $3}' | sort | uniq ) ; do  # parcours de tous les noeuds pour NEMO
    
    			if [ $compt  -le $MPI_NEMO ] ; then
    				echo "rank "$(( $First_rank_nemo + $compt - 2  ))"="$i" slot="$(( 2 * ( $compt_core - 1 )  )) >> atos_nemo_rankfile1
    				last_compt=$(( $First_rank_nemo + $compt - 2  )) # compteur rang nemo
    				old_node1=$i
    				old_string=$((  $compt_core - 1   ))
    				compt=$(( $compt + 1 )) # rang  NEMO
    			fi
    
    		done # fin parcours sur les noeuds du fichier temporaire NODEFILE pour NEMO
      	compt2=$(( $compt2 + 1  )) # rang local  NEMO
    
    #       depeuplement 8 NEMO par socket et 16 par noeud 
    #       Quand commence -t on au deuxième socket ?
    ###	if [ $compt2 -eq 9 ]; then # 8 rangs NEMO non consecutifs sont déjà placés
    	if [ $compt2 -eq $(( $max_on_socket + 1 )) ]; then # premier socket a atteint la limite max_on_socket 
      		compt_core=13 # on passe au deuxieme socket (numerotation logigue pour OpenMPI et pour le deuxieme socket sur Occigen cela commence au slot=24 == 2*(13-1) 
    	else
      		compt_core=$(( $compt_core + 1 ))
    	fi
    	done
    done
    mv atos_nemo_rankfile1 atos_nemo_rankfile
    
    ######## XIOS with cyclic nemo
    
    if [ $MPI_XIOS = 1 ]; then
    
    echo "rank "$(( $last_compt + 1 ))"="$old_node1" slot="$(( ( $old_string + 1 ) * 2  )) > atos_xios_rankfile
    
    fi
    
    
    ########
    
    rm -f atos_rankfile
    
    cat atos_lmdz_rankfile >> atos_rankfile
    cat atos_nemo_rankfile >> atos_rankfile
    cat atos_xios_rankfile >> atos_rankfile
    
    }}}
     * script SLURM sur OCCIGEN
    {{{
    #!/bin/bash
    #SBATCH  --nodes=26
    #SBATCH --ntasks=269
    #SBATCH --time=00:30:00
    #SBATCH -J IPSL
    ##SBATCH -o IPSL_occigen.o.%J
    ##SBATCH -e IPSL_occigen.e.%J
    #SBATCH --mem=120GB
    #SBATCH --cpu_bind=none
    #SBATCH --exclusive
    
    module load intel/15.0.3.187
    module load  bullxmpi/1.2.8.4-mxm
    
    module load  hdf5/1.8.14_parallel_bullxmpi
    module load  netcdf/bullxmpi/4.3.3-rc2
    module load  netcdf/bullxmpi/fortran-4.4.1_4.3.3-rc2
    module load  ferret/6.93
    
    MPI_LMDZ=47 # nombre de tâches LMDZ
    PPN_LMDZ=4  # nombre de tâches LMDZ par noeud de 24 cores
    OMP_LMDZ=$(( 24 / $PPN_LMDZ )) # nombre de threads par tâche MPI LMDZ 
    MPI_NEMO=221 # nombre de tâches NEMO
    
    export OMP_NUM_THREADS=$OMP_LMDZ
    #export KMP_STACKSIZE=2g
    export KMP_STACKSIZE=3g
    
     * tuning pour bullxmpi
    
    export KMP_BLOCKTIME=infinite
    export OMP_NESTED=FALSE
    export MXM_MEM_ON_DEMAND_MAP=n
    export OMPI_MCA_mpi_leave_pinned=0
    
    export bin_dir=$HOME/bin-with-xCORE-AVX2
    cp $bin_dir/* .
    
    # recopie des scripts 
    cp ../scripts/s*ksh .
    # recopie des donnees d entree 
    ln -sf ../INPUT_CURIE/* .
    # les arguments passes au script de creation automatique du rankfile sont :
    # nb de tâches LMDZ - nb de threads/tâche - nombre de tâches LMDZ/noeud - nombre de tâches NEMO - nombre de tâches NEMO par noeud - nombre de tâches XIOS - nombre de tâches XIOS par noeud 
    bash $SLURM_SUBMIT_DIR/create_rankfile_cyclic_nemo_16ppn.sh $MPI_LMDZ $OMP_LMDZ $PPN_LMDZ $MPI_NEMO 16 1 1
    
    # ------------------------------------------------------------------------------------------------------------------------------------------------------
    echo "RUN STARTS"
    date
    #
    #  recopie du script slurm en cours dans le repertoire de travail sur $SCRATCHDIR
    cp $0 .
    #
    # execution 
    #
    /usr/bin/time mpirun  --rankfile atos_rankfile -np $MPI_LMDZ ./script_lmdz.ksh : -np $MPI_NEMO ./script_opa.ksh : -np 1  ./script_xios.ksh
    #
    #####################################################################################################################################################
     * scripts ksh de lancement des trois codes gmc.e opa et xios_serve.exe
    {{{
    cat  script_lmdz.ksh
    #!/bin/ksh
    export KMP_STACKSIZE=3g
    ./gcm.e
    }}}
    {{{
    cat script_opa.ksh
    #!/bin/ksh
    ./opa
    }}}
    {{{
     cat script_xios.ksh
    #!/bin/ksh
    ./xios_server.exe
    }}}
    
    
    
    
    }}}