Parcourir la source

checkpoints: ajout exemples OpenMP

Philippe Marion il y a 6 ans
Parent
commit
e4d72f369c

+ 5 - 1
checkpoint/README-checkpoint.md

@@ -7,10 +7,14 @@ title: Checkpoint
 
 ## Contenu
 
+### scripts OAR  de la documentation en ligne
+
 - exemples de scripts _OAR_ de lancement des batchs de la fiche [«tutorial checkpoint»](https://www-calculco.univ-littoral.fr/readthedocs/calculs/checkpoint/) sur la plateforme [Calculco](https://www-calculco.univ-littoral.fr)
-- les programmes compteurs ( C, python, matlab) associé à ce tutorial
+- les programmes compteurs (C, python, matlab) associé à ce tutorial
 
 Note: mise en œuvre de  DMTCP (Distributed MultiThreaded Checkpointing) http://dmtcp.sourceforge.net/
 
 
+### autres exemples et tests
 
+- **OpenMP**: checkpoint-dmtcp-openmp4.oar, checkpoint-dmtcp-openmp5.oar avec le programme timing-matmul2000.f90

+ 85 - 0
checkpoint/checkpoint-dmtcp-openmp4.oar

@@ -0,0 +1,85 @@
+#!/bin/bash
+
+#-------------------  CHECKPOINT DMTCP OpenMP ex4 --------------------------- 
+#
+#  Programme test de dmtcp dans le cas Multithreads (OpenMP)
+#    - 20 multiplications matricielles (2000x2000)
+#    - avec 8 threads le temps est un peu plus de 4 minutes
+#    - le programme est lancer avec l'option -i 180s
+#  de dmtcp (un checkpoint au bout de 3mn)
+#   - comme dans l'exemple checkpoint-dmtcp1.oar, le walltime du script
+#  OAR est "trop court" : il ne finit pas son execution
+#   - => il faut relancer le script une deuxième fois (manuellement)
+#  le (ce) script qui recharger le script dmtcp_restart_script.sh
+
+# commande: oarsub -S ./checkpoint-dmtcp-openmp4.oar
+
+# infos: http://dmtcp.sourceforge.net/
+
+# IMPORTANT : la reprise de job se fait ici sur le même noeud,
+#  merci de consulter la charge sur cluster (noeud libre) sur
+#  https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
+#  et EDITER la ligne: OAR -p network_address = 'orval06'
+#  (un peu plus bas)
+
+#-------------- paramètres OAR---------------------------
+
+# walltime de 6mn ( donc trop court pour le prog/timer de 10mn)
+#OAR -l core=8,walltime=00:3:30 
+#OAR -n dmtcp_ex4
+
+# Les fichiers de sortie sans parametres $OAR_JOBID
+# (=> les jobs successifs ecrivent dans les memes fichiers)
+
+#OAR -O OAR-ckpt-dmtcp4.out
+#OAR -E OAR-ckpt-dmtcp4.err
+
+#OAR -q default
+
+
+# les tests sont mis au point sur orval06.
+# Note: une reprise de checkpoint sur une autre machine nécessite
+# l'édition du script dmtcp_restart_script.sh 
+#  A EDITER en fonction de la charge: https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
+#OAR -p network_address = 'orval06' 
+
+# optionnel
+##OAR -t besteffort
+
+# chargement du modeul dmtcp
+source /nfs/opt/env/env.sh > /dev/null 2>&1
+module load dmtcp  > /dev/null 2>&1
+
+#---------- la tâche à exécuter   ------------------------ 
+# compilation (  ) 
+gfortran -fopenmp -O3 timing-matmul2000.f90 -o matmul2000
+#----------- pré-traitement -----------------------------
+# DWTFYW !
+ 
+
+echo "Debut du jobs ou restart ?"
+
+# si c'est une reprise
+if [ -f dmtcp_restart_script.sh ]; then
+    echo "  -> reprise du job "
+    # piste (changement de nœuds): sed -i '/ancien_noeud/nouveau_noeud/' dmtcp_restart_script.sh
+    # (-> testé -OK- a la mano, à scripter!)
+    ./dmtcp_restart_script.sh 
+else
+    # 1er démarrage avec ordre de checkpoint toutes les 2mn 50 (walltime 3mn) 
+    # Rq: sur un vrai exemple, prendre plus de marge!
+    echo "  -> Debut du jobs"
+    dmtcp_launch -i 180 ./matmul2000
+     # pas d'eperluette! (&) sinon le script OAR checkpoint supprimes cf plus bas
+fi
+
+#---------------------------------------------------------
+# fin du programme:  postraitement 
+#---------------------------------------------------------
+# DWTFYW!
+echo "---post treatement---"
+# suppression des ckpt (ménage)
+echo "fin effective du programme, suppression des checkpoints"
+rm ckpt_*.dmtcp dmtcp_restart_script*
+
+exit $?

+ 133 - 0
checkpoint/checkpoint-dmtcp-openmp5.oar

@@ -0,0 +1,133 @@
+#!/bin/bash
+
+#-------------------  CHECKPOINT OpenMP DMTCP ex5 --------------------------- 
+#
+#  - Idem que l'exemple n°4 (20 multiplications matricielles 2000x2000)
+#    (cf checkpoint-dmtcp-openmp4.oar)
+#  - A la manière de l'ex2 (cf. checkpoint-dmtcp2.oar), la gestion  des
+#  signaux entre le script OAR et le programme fortrna OpenMP est gérée:
+#  le programme est executé jusqu'à son terme apreès une interruption et
+#  une relance automatique grace à l'option "idempotent" d'OAR
+
+
+#  dmtcp. les echanges de signaux entre ce script OAR et le programme
+#  sont completement ignores, de sorte que l'option "idempotent" d'OAR
+#  est inutile: il n'y a pas de redemarrage automatique. L'utilisateur
+#  doit relancer lui-même relancer ce script. Il peut toutefois etre
+#  utile:
+#    - ex1: programme de 200 h, un checkpoint toutes les 24h (au cas ou...)
+#    - ex2: limiter les ressources demandees en prenant le risque d'un
+#      walltime " trop court": il suffira de relancer a partir d'un
+#      checkpoint. 
+
+# commande: oarsub -S ./checkpoint-dmtcp-openmp5.oar
+
+
+# IMPORTANT : la reprise de job se fait ici sur le même noeud,
+#  merci de consulter la charge sur cluster (noeud libre) sur
+#  https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
+#  et EDITER la ligne: OAR -p network_address = 'orval06'
+#  (un peu plus bas) 
+
+#-------------- paramètres OAR---------------------------
+
+# walltime de 3mn30 ( donc trop court  4mn xxs sur orval06)
+#OAR -l core=8,walltime=00:3:30 
+#OAR -n dmtcp-openmp5
+
+# Les fichiers de sortie sans parametres $OAR_JOBID
+# (=> les jobs successifs ecrivent dans les memes fichiers)
+
+#OAR -O OAR-ckpt-dmtcp5.out
+#OAR -E OAR-ckpt-dmtcp5.err
+
+#OAR -q default
+
+# les tests sont mis au point sur orval06
+# A EDITER apres consultation de :
+#  https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
+# OAR -p network_address = 'orval06' 
+
+# optionnel
+##OAR -t besteffort
+
+#OAR -t idempotent
+
+# checkpoint OAR 60 s avant le walltime (donc ~2mn30)
+# Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn))
+
+#OAR --checkpoint 60
+
+
+# chargement du modeul dmtcp
+source /nfs/opt/env/env.sh  > /dev/null 2>&1
+module load dmtcp > /dev/null 2>&1
+
+#---------- la tâche à exécuter   ------------------------ 
+# compilation (  ) 
+gfortran -fopenmp -O3 timing-matmul2000.f90 -o matmul2000
+#----------- pré-traitement -----------------------------
+# DWTFYW !
+ 
+
+echo "Debut du jobs ou restart ?"
+
+# si c'est une reprise
+if [ -f dmtcp_restart_script.sh ]; then
+    echo "  -> reprise du job "
+    # piste (changement de nœuds): sed -i '/ancien_noeud/nouveau_noeud/' dmtcp_restart_script.sh
+    # (-> testé -OK- a la mano, à scripter!)
+    ./dmtcp_restart_script.sh &
+    PROGPID=$!
+else
+    echo "  -> Debut du jobs"
+    dmtcp_launch  ./matmul2000 &
+    PROGPID=$!    
+fi
+
+#---------------------------------------------------------
+# gestion du checkpoint  OAR  
+#---------------------------------------------------------
+
+# fonction de traitement du signal OAR
+sighandler() {
+    echo "reception checkpoint OAR (signal12)"
+    # demande de checkpoint (-c) au coordinateur dmtcp
+    dmtcp_command -c
+    sleep 5
+    [ -n "$PROGPID" ] && kill -9 $PROGPID
+    SCRIPT_CHECKPOINTED="YES"
+    }
+
+# signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
+# à 12 par le paramètre --signal 12 (cf. param OAR au début)
+CHKPNT_SIGNAL=12
+
+# valeur de sortie pour l'option "--idempotent"
+# (restart automatique) )
+EXIT_UNFINISHED=99
+
+# indique au script OAR de capter le signal 12 
+trap sighandler  $CHKPNT_SIGNAL
+
+# wait indispensable pour maintien des communucations
+# (signaux) entre ce script et le PROG
+while kill -0 "$PROGPID" 2>/dev/null; do
+    wait $PROGPID
+done
+
+# important : le code 99 doit être retourné pour que l'option
+# idempotent ( relance auto.) soit effective
+[ -n "$SCRIPT_CHECKPOINTED" ] && exit 99
+
+
+#---------------------------------------------------------
+# fin du programme:  postraitement 
+#---------------------------------------------------------
+# DWTFYW!
+echo "---post treatement---"
+# suppression des ckpt (ménage)
+echo "fin effective du programme, suppression des checkpoints"
+rm ckpt_*.dmtcp dmtcp_restart_script*
+
+exit $?

+ 56 - 0
checkpoint/timing-matmul2000.f90

@@ -0,0 +1,56 @@
+!gfortran -fopenmp -O3 timings.f90
+
+program timing2000
+
+    use omp_lib
+
+    implicit none
+    integer, parameter :: ntests = 20
+    integer :: n, nthreads
+    real(kind=8), allocatable, dimension(:,:) :: a,b,c
+    real(kind=8) :: t1, t2, elapsed_time
+    integer(kind=8) :: tclock1, tclock2, clock_rate
+    integer :: i,j,k,itest
+
+    ! Specifier le nombre de Threads a utiliser:
+    !!$ print *, "Combien de threads avec OpenMP? "
+    !!$ read *, nthreads
+    !!nthreads=8
+    !!$ call omp_set_num_threads(nthreads)
+    !omp_get_num_threads()
+    n=2000
+    !print *, "multiplication de matrices (n,n), entrer n: "
+    !read *, n
+
+    allocate(a(n,n), b(n,n), c(n,n))
+
+    ! pour la demo, a = b = ones(n)
+    a = 1.d0
+    b = 1.d0
+
+    call system_clock(tclock1)  ! top depart du timer general
+
+    call cpu_time(t1)   ! top depart du timer cpu
+    do itest=1,ntests
+        !$omp parallel do private(i,k)
+        do j = 1,n
+            do i = 1,n
+                c(i,j) = 0.d0
+                do k=1,n
+                    c(i,j) = c(i,j) + a(i,k)*b(k,j)
+                    enddo
+                enddo
+            enddo
+        enddo
+
+    call cpu_time(t2)   ! top final du timer cpu 
+    print 10, ntests, n, n, t2-t1
+ 10 format( i4, " multiplications de matrices (", i4, "x", i4, " ) : temps CPU = ",f12.8, " secondes")
+
+    
+    call system_clock(tclock2, clock_rate)
+    elapsed_time = float(tclock2 - tclock1) / float(clock_rate)
+    print 11, elapsed_time
+ 11 format("Elapsed time = ",f12.8, " seconds")
+
+end program timing2000