= Entête des jobs et commandes curie = Cette page décrit les entêtes des jobs sur curie ainsi que les commandes à lancer pour avoir un exécutable simple ou un couplé. [[PageOutline]] == Un executable séquentiel == * Entête du job {{{ #MSUB -n 1 }}} * Commande {{{ time ccc_mprun ./create_etat0_limit.e }}} == Un executable parallélisé avec OpenMP seulement == * Entête du job {{{ #MSUB -n 1 #MSUB -c 16 }}} * Commande {{{ export OMP_NUM_THREADS=16 time ccc_mprun ./gcm.e }}} * Résultat : 4 threads seront lancés sur 1 processus gcm.e A noter : on peut réserver un noeud entier pour soi tout seul : {{{ #MSUB -x }}} == Un executable parallélisé avec MPI seulement == * Entête du job {{{ #MSUB -n 32 BATCH_NUM_PROC_TOT=32 }}} * Commande {{{ time ccc_mprun ./gcm.e time ccc_mprun -n 32 ./gcm.e time ccc_mprun -n ${BRIDGE_MSUB_NPROC} ./gcm.e time ccc_mprun -n ${BATCH_NUM_PROC_TOT} ./gcm.e # A valider? }}} * Résultat : ccc_mprun lance 32 processus gcm.e == Un executable parallélisé avec MPI et OpenMP == * Méthode 1 sur un seul noeud : * Entête du job {{{ #MSUB -n 8 # Reservation de 8 processus MPI #MSUB -c 4 # Chaque tâche MPI lance 4 threads }}} * Commande {{{ export KMP_STACKSIZE=2g export KMP_LIBRARY=turnaround export MKL_SERIAL=YES export OMP_NUM_THREADS=4 # Utilisation de 4 threads OpenMP par processus MPI time ccc_mprun ./gcm.e }}} * Résultat : ccc_mprun lance 8 tâches MPI gcm.e sur 4 threads chacun * Méthode 2 sur un seul noeud : * Entête du job {{{ #MSUB -n 32 # Reservation de 32 procs }}} * Commande {{{ export OMP_NUM_THREADS=4 # Utilisation de 4 threads OpenMP par processus MPI time ccc_mprun -n 8 -c 4 ./gcm.e }}} * Résultat : ccc_mprun lance 8 tâches MPI gcm.e sur 4 threads chacun * Méthode pour plusieurs noeuds : * Entête du job {{{ #MSUB -N 4 # 4 noeuds #MSUB -n 4 # 4 tâches MPI #MSUB -c 16 # Chaque tâche MPI lance 16 threads }}} * Commande {{{ export OMP_NUM_THREADS=16 # Utilisation de 16 threads OpenMP par processus MPI time ccc_mprun ./gcm.e }}} * Résultat : ccc_mprun lance 4 tâches MPI gcm.e sur 4 noeuds différents, chacune avec 16 threads OpenMP === LMDZ en OpenMP/MPI avec sorties différentes par tâche MPI === {{{ #!/usr/bin/ksh ###################### ## CURIE TGCC/CEA ## ###################### #MSUB -r NEWCON32CM6 # nom de la requete #MSUB -o Script_Output_NEWCON32CM6.000001 # nom du fichier de sortie #MSUB -e Script_Output_NEWCON32CM6.000001 # nom du fichier de sortie #MSUB -eo #MSUB -c 8 #MSUB -n 4 #MSUB -q standard # noeuds fins #MSUB -x #MSUB -T 3600 # Limite temps (en secondes) ##MSUB -p XXXXXXX BATCH_NUM_PROC_TOT=32 }}} {{{ cat <<-EOF > script_lmdz.x.ksh #!/bin/ksh export KMP_STACKSIZE=3g export KMP_LIBRARY=turnaround export MKL_SERIAL=YES export OMP_NUM_THREADS=8 ./lmdz.x > out_lmdz.x.out.\${SLURM_PROCID} 2>out_lmdz.x.err.\${SLURM_PROCID} EOF chmod +x script_lmdz.x.ksh /usr/bin/time ccc_mprun -n 4 ./script_lmdz.x.ksh >> ${Exe_Output} 2>&1 }}} * Résultat : mpirun lance 4 processus gcm.e avec 8 threads chacun et sur 2 noeuds (de 2 processeurs octocoeurs) * 308 s (run.card, NEWTON, 96x71x19) * config.card : ATM= (gcm.e, lmdz.x, 4MPI, 8OMP) * Comment surveiller les threads : * top avec f puis j pour avoir le numero du coeur utilise * 1 pour voir les %cpu * H pour voir les threads == Un couplé avec Oasis sur 1 proc, NEMO sur 5 procs et LMDZ sur 26 procs, MPI seul == * Entête du job {{{ #MSUB -n 32 BATCH_NUM_PROC_TOT=$BRIDGE_MSUB_NPROC }}} * Commande {{{ time ccc_mprun -f ./run_file }}} * avec run_file contenant, oasis en premier obligatoirement: {{{ 1 ./oasis 26 ./lmdz.x 5 ./opa.xx }}} * Résultat : mpirun lance 32 processus : 1 oasis, 26 lmdz et 5 opa == Un executable avec l'IOServer débranché == * Entête : {{{ #MSUB -n 32 # Total number of core to use #MSUB -N 4 # number of nodes }}} * Commande : {{{ cat > run_file << END 123 ./nemo.exe # 123 par exemple 5 ./xios_server.exe # 5 par exemple pour en avoir 128=4x32 en tout END time ccc_mprun -f run_file }}} == Un couplé avec Oasis sur 1 proc, NEMO sur 5 procs et LMDZ sur 13 procs MPI et 2 tâches OpenMP == * Entête du job : {{{ #MSUB -n 19 # !! A verifier si necessaire : reservation de 19 processus MPI #MSUB -N 1 # Curie noeuds larges = 32 coeurs/noeud }}} * Commande : {{{ time mpirun -hostfile hosts -H curie30 -np 1 ./script_oasis.ksh : -H curie30 -np 5 ./script_opa.xx.ksh : -H curie30 -np 13 ./script_lmdz.x.ksh }}} * avec hosts contenant le noms des noeuds (recuperes via la commande mpirun hostname) {{{ curie30 slots=32 max_slots=32 # ici pour curie noeuds larges avec 32 cores par noeud }}} * avec par exemple script_lmdz.x.ksh contenant : {{{ #!/bin/ksh OMP_NUM_THREADS=2 (( MYMPIRANK = OMPI_COMM_WORLD_RANK - 6)) ./lmdz.x > out_lmdz.x.out.${MYMPIRANK} 2>out_lmdz.x.err.${MYMPIRANK} }}} == MPMD MPI/OpenMP recommandé février 2017 == {{{ #MSUB -n 28 # Réservation du nombre total de processus/threads #MSUB -Q test #MSUB -t 1800 #MSUB -q standard export BRIDGE_HETEROGENEOUS_MPMD=1 export OMPI_MCA_ess=pmi # Nécessaire pour bullxmpi ccc_mprun -f app.conf }}} Avec app.conf: {{{ 1-14 env OMP_NUM_THREADS=14 ./a.out 2-4 env OMP_NUM_THREADS=4 ./a.out }}} Dans l'exemple ci-dessus, on lance 1 processus MPI avec 14 threads OpenMP et 2 processus MPI avec 4 threads OpenMP. == Les configurations v6 == Pour les configurations v6 il faut se reporter à la page [http://wiki.ipsl.jussieu.fr/Pole/Groupe/CpLIpsl/CPLIPSL2013/RunningIPSLCM6 suivante]