#!/bin/bash # fichier script shell # une ligne commençant par #PBS est une commande PBS # une ligne commençant par # est un commentaire # le shell utilisé par PBS pour interpréter # le fichier est bash #PBS -S /bin/bash # nom du job (facultatif) # 15 caractères maximun #PBS -N JobMPItmp # par défaut, les flux "output" et "error" sont envoyés # dans des fichiers situés dans le répertoire de # travail (PBS_O_WORKDIR) et dont les noms sont : # job_name.osequence_number <- output # job_name.esequence_number <- error # où job_name est le nom du job et sequence_number et # le numéro du job qui est assigné lors de la soumission # On peut changer les noms par défaut en utilisant les # commandes suivantes : # #PBS -o stdout_file # #PBS -e stderr_file # Pour éviter d'avoir trop de fichiers, on peut # regrouper les flux "output et "error" dans un seul # fichier : #PBS -j oe # PBS peut envoyer des informations sur l'état du job # par email : # un simple caractère "n" (pas de mail) # #PBS -m n # un ou plusieurs caractères : # "a" envoi email si le job est avorté, # "b" envoi email lorsque le job débute # "e" envoir email lorsque le job se termine # #PBS -m abe # #PBS -m ae # l'adresse email est spécifié par la commande # #PBS -M cros@iup.univ-evry.fr # ressources demandées : # 2 noeuds : nodes=2 # 2 processeur par noeud : ppn=2 #PBS -l nodes=2:ppn=2 # création des fichiers de configuration pour mpi # détermination du nombre de noeuds et processeurs # NE PAS MODIFIER CES LIGNES nodes=`cat $PBS_NODEFILE` nnodes=`wc $PBS_NODEFILE | awk '{print $1}'` echo $nodes echo $nnodes confile=~/ip.$PBS_JOBID.conf touch $confile j="init" for i in $nodes do if [ $j != $i ] then echo "$i.alineos.net:2" >> $confile fi j=$i done # FIN d'INTERDICTION DE MODIFICATION # le job va utiliser 2 noeuds, les fichiers de données # doivent être copiés sur ces noeuds ainsi que # l'exécutable dans un répertoire temporaire. # Création d'un répertoire temporaire (nommé "dossier" # par exemple) auquel on adosse l'ID ($PBS_JOBID) du job afin # de rendre unique ce répertoire. Ce répertoire est créé # sur le noeud de calcul en deux étapes : # 1- la variable WD va pointer sur le répertoire où # va s'effectuer le calcul sur le noeud export WD=/scratch/dossier$PBS_JOBID # bouclage sur les noeuds j="init" for i in $nodes do # les noeuds étant bi-processeur, # test afin de ne pas créer ou copier deux fois les # fichiers sur le même noeud if [ $j != $i ] ; then # création du répertore temporaire sur chque noeud rsh ${i} "mkdir ${WD}" # copie des fichiers de données dans le répertoire de # calcul # rmq : rcp -r permet de copier un répertoire rcp $PBS_O_WORKDIR/test.dat $i:$WD # copie de l'exécutable dans le répertoire de calcul rcp $PBS_O_WORKDIR/test_mpi $i:$WD fi j=$i done # déplacement dans le répertoire temporaire cd $WD # lancement du calcul, la commande "time" indique les temps # système, et utilisateur echo "début du calcul à`date`" time /usr/local/mpich-intel/bin/mpirun -np $nnodes -machinefile $confile $WD/test_mpi echo "fin du calcul à `date`" # la même chose mais avec redirection des impressions # dans un fichier echo "début du calcul à `date`" /usr/local/mpich-intel/bin/mpirun -np $nnodes -machinefile $confile $WD/test_mpi &> $WD/test.out2 echo "fin du calcul à `date`" # récupération des données cd $PBS_O_WORKDIR # bouclage sur les noeuds j="init" for i in $nodes do # les noeuds étant bi-processeur, # test afin de ne pas éffacer ou copier deux fois les # fichiers sur le même noeud if [ $j != $i ] ; then # liste le contenu du répertoire temporaire sur le noeud i rsh $i "ls $WD" # récupération du résultat et des redirections # dans un répertoire sur le frontal rcp $i:$WD/test.out* $PBS_O_WORKDIR/ fi j=$i done # effacement du répertoire temporaire sur # chaque noeud de calcul j="init" for i in $nodes do if [ $j != $i ] ; then rsh $i "rm -r $WD" fi j=$i done # effacement du fichier de configuration /bin/rm -f $confile