ソースを参照

OAR_array : 2ième exemple matlab

Ph. Marion 6 年 前
コミット
3dc6c56041

usage_avance/OAR_array/Makefile → OAR_array/Makefile


+ 31 - 1
usage_avance/OAR_array/README.md

@@ -28,7 +28,37 @@ Le nombre d'intervalles est passé en argument (regroupé dans le fichier pi_inp
 - make    (compile le programme pi.exe)
 - oarsub -S ./pi_array.oar
 
+### exemple 2 (matlab): gradientconj.m
 
+Le programme résout un système linéaire par la méthode itérative du gradient conjugué.
+Le script matlab a été tranformé en fonction: gradientconj(n,tolerance,maxiter)
 
 
-### exemple 2 (matlab): 
+- oarsub -S ./gc_array.oar
+
+note: contrairement à l'exemple 1 (ci-dessus) et à l'exemple des
+tutoriaux [gradient conjugué](https://www-calculco.univ-littoral.fr/utilisation/tutoriaux/matlab#h3-2-2-batch-simple-2)
+le script bash OAR ne peut accepter la syntaxe de commande:
+
+ `matlab -nodisplay -nodesktop -nojvm -r 'testgradientconj("$@");exit'" ` 
+
+L'astuce ici est de passer par autre script de lancement intermédiaire: gc_matlab.sh
+
+#### description des fichiers
+
+- gc_array.oar : le script OAR à lancer (oarsub -S ./gc_array.oar)
+- gc_matlab.sh : réordonne les paramètres et lance la commande matlab proprement dite
+- gc_input.txt : paramètres des différents jobs ( n, tol, maxiter )
+   - 1000 1e-5 1000
+   - 2000 1e-7 1500
+   - 6000 1e-6 6000
+- gc_postraitement.sh (optionnel): génère un fichier tableau (csv)
+  gc_bilan.csv à partir des fichiers générés par chaque job
+
+     
+#### note:  usage de jetons
+
+- comme sur un poste personnel, plusieurs sessions matlab ne «consomme» qu'un seul jeton
+- si le fichier gc_input.txt est suffisamment long ( > nombre max de
+  cœurs du nœud utilisé ) d'autres nœuds seront utilisés , ainsi que
+  d'autres jetons (mais 1 seul jeton/nœud)

+ 38 - 0
OAR_array/gc_array.oar

@@ -0,0 +1,38 @@
+#!/bin/bash
+################################################################################
+#
+################################################################################
+
+
+#-----------------------------------------------------------
+# Les directives OAR
+#-----------------------------------------------------------
+# donner un nom au job
+
+#OAR -n matlab_gc_array
+
+# les ressources
+#OAR -l /core=1,walltime=00:20
+
+# le fichier de paramètres (1 ligne par instance)
+#OAR --array-param-file gc_input.txt
+
+# la file de soumission
+#OAR -t besteffort
+#OAR -t idempotent
+
+
+#OAR -O cg.%jobid%.stdout
+#OAR -E cg.%jobid%.stderror
+
+# optionnel (mais intéressant -cf gc_postraitement.sh -):
+# -> récupérer l'ID du job/batch lancé
+echo "array_id:$OAR_ARRAY_ID"
+
+# nom du programme
+PROG="gc_matlab.sh"
+
+./$PROG "$@"
+
+exit
+

+ 3 - 0
OAR_array/gc_input.txt

@@ -0,0 +1,3 @@
+1000 1e-5 1000
+1500 1e-7 1000
+2000 1e-6 2000

+ 29 - 0
OAR_array/gc_matlab.sh

@@ -0,0 +1,29 @@
+#!/bin/bash
+
+
+# pour utiliser la fonctionnalité 'array' de OAR:
+# OAR --array-param-file param.txt, où param.txt
+# a une syntaxe prédéfinie qui ne peut lancer
+# notre fonction matlab :
+
+# gradientconj('$n,$tol,$maxiter)'
+
+# Il faut donc passer par un script secondaire (ce script)
+# qui récupère les 3 arguments
+#   - n = taille matrice 
+#   - tol = tolerance 
+#   - maxiter : nb iteration maximum 
+
+source /nfs/opt/env/env.sh > /dev/null 2>&1 
+module load matlab
+
+
+if [[ $# -ne 3 ]] ; then
+    echo '3  arguments obligatoires'
+    exit 0
+fi
+echo "params: $1, $2, $3"
+
+#straights_bench('$LDA,$TOL,$MATRICE,$SOLUTION)'
+
+matlab -nodesktop -nodisplay -nosplash -nojvm -r "gradientconj($1,$2,$3);exit"

+ 21 - 0
OAR_array/gc_postraitement.sh

@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# script portraitement pour regrouper l'ensemble des résultats
+# des jobs gradient conjugué dans un tableau au format csv
+
+# optionnel: récuperation du numéro du job(tableau) lancé
+# intérêt: permet rapidement de revisiter les paramètres de lancement,
+# dates, temps d'exécution, sur quel nœud de calcul, le job a été
+# executé grâce à la commande:
+#     oarstat -fj array_id
+array_id=`grep  array_id cg.*stdout | head -1 | cut -d: -f3`
+
+echo '"LDA", "tolerance", "maxiter", "iteration", "elapsed"' >> gc_bilan-$array_id.csv
+for fic in `ls -1 cg.*.stdout`
+do
+    grep csv $fic | cut -d: -f2 >> gc_bilan-$array_id.csv
+done
+
+# suppression des fichiers de chaque run
+rm -f cg.*stdout cg.*stderror
+

+ 59 - 0
OAR_array/gradientconj.m

@@ -0,0 +1,59 @@
+function [x] = testgradientconj(n,tol,maxiter)
+
+% exemple pour illustrer un exemple de passage de paramètres
+% d'un script matlab lancer en mode batch sur calculco (tutoriaux)
+
+% résolution du système Ax =b par la méthode du gradient conjugué
+
+% En entrée les arguments  sont:
+%   -n : taille du système
+%   -tol: la tolérance  
+%   -maxiter: nombre max d'itérations 
+
+% En sortie : x la solution ... qui est connue (!): ones(n,1) 
+
+Atmp=rand(n,n);
+A = Atmp + Atmp';
+sol=ones(n,1);
+b=A*sol;
+x0 = rand(n,1);
+iter =1;
+% top départ;
+tic;
+% Calcul du 1er résidu
+r = A*x0-b;
+% direction du gradient d = -r
+d = -r;
+% Calcul du pas 
+a = norm(r)^2/dot(A*d,d);
+% 1ere itération x1
+x_ = x0 + d*a;
+% gradient en x1
+r_ = A*x_- b;
+p = norm(r_)^2/dot(r_-r,d);
+% direction 
+d_ = -r_+ d*p;
+x = x_;
+r = r_;
+d = d_;
+while ((norm(r) > tol) && (iter < maxiter))
+    a = norm(r)^2/dot(A*d,d);
+    x_ = x + d*a;
+    r_ = A*x_-b;
+    p = norm(r_)^2/dot(d,r_-r);
+    % direction suivante
+    d_ = -r_+ d*p; 
+    x = x_;
+    r = r_;
+    d = d_;
+    iter=iter+1;
+end
+eltime=toc;
+%nombre d'iterations
+ fprintf('Le nombre d''iterations realisee est : %d \n', iter);
+ fprintf('elapsed time : %f \n', eltime);
+ fprintf('csv: %d , %s, %d, %d, %f \n',n,tol,maxiter,iter,eltime);
+ fprintf('Les 10 premiers elements de la solution sont : \n')
+  x(1:10)
+ 
+end

usage_avance/OAR_array/pi.c → OAR_array/pi.c


usage_avance/OAR_array/pi_array.oar → OAR_array/pi_array.oar


usage_avance/OAR_array/pi_input.txt → OAR_array/pi_input.txt