[parallel] Paralléliser une boucle for
Bonjour,
je cherche à paralléliser les itérations du script suivant, tout en controlant le nombre de coeur utilisé par chaque itérations :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #!/bin/bash
###################################
## Exploration of parameter space :
###################################
Npoints=100
per_min=30
per_max=30
alpha_min=0
alpha_max=4
ind=1 ### 0 if linear in lambda, and 1 if linear in k.
###### Generation of the lambda values
TEXTE1=$(cat Lambda_vector_gene.m | grep "Lambda_min =")
TEXTE2="Lambda_min = ""$per_min"
sed -i "s/${TEXTE1}/${TEXTE2}/" Lambda_vector_gene.m
TEXTE1=$(cat Lambda_vector_gene.m | grep "Lambda_max =")
TEXTE2="Lambda_max = ""$per_max"
sed -i "s/${TEXTE1}/${TEXTE2}/" Lambda_vector_gene.m
TEXTE1=$(cat Lambda_vector_gene.m | grep "Ind =")
TEXTE2="Ind = ""$ind"
sed -i "s/${TEXTE1}/${TEXTE2}/" Lambda_vector_gene.m
matlab -nodesktop -nosplash -r Lambda_vector_gene
TEXTE1=$(cat Lambda_vector_gene.m | grep "N =")
TEXTE2="N = ""$Npoints"
sed -i "s/${TEXTE1}/${TEXTE2}/" Lambda_vector_gene.m
matlab -nodesktop -nosplash -r Lambda_vector_gene
echo "Lambda alpha Sigma Coeff" > sigma_values.data
fichier="Lambda_vector.txt"
#for ((L=$per_min; L<=$per_max; L+=2))
### Main Loop
for L in $(<$fichier)
do
for ((A=$alpha_min; A<=$alpha_max; A+=2))
do
echo "L = " "$L"
echo "A = " "$A"
dir="stability_L""$L""_A_""$A"
mkdir $dir
cp dun_stability.par run.bash exp_fit.m $dir
cp rescal/src/genesis rescal/src/rescal $dir
cd $dir
### Run Rescal
TEXTE1=$(cat dun_stability.par | grep "Csp_template")
TEXTE2="Csp_template = WAVES_3D(""$L"",""$A"",4,30)"
sed -i "s/${TEXTE1}/${TEXTE2}/" dun_stability.par
./run.bash
### Run Matlab
TEXTE1=$(cat exp_fit.m | grep "Lambda =")
TEXTE2="Lambda = ""$L"
sed -i "s/${TEXTE1}/${TEXTE2}/" exp_fit.m
TEXTE1=$(cat exp_fit.m | grep "alpha =")
TEXTE2="alpha = ""$A"
sed -i "s/${TEXTE1}/${TEXTE2}/" exp_fit.m
matlab -nodesktop -nosplash -r exp_fit
### Preparation for data reading
head -n 1 sig_save.txt >> ../sigma_values.data
cd ../
done
done |
La commande GNU parallel me parait assez approriée pour ça mais je n'ai pas réussit à comprendre comment m'en servir sur cet example. Etant donné que c'est une double boucle for, dont une des itérations lit la variable utile dans un fichier, ça faisait un peu trop de difficultés pour moi d'un coup. Pour l'instant, il me semble que je devrais écrire un script prenant en variable d'imput L et A, et ensuite entrer une commande du style
Code:
parallel -p ./mon script {1} {1..N}
.
Merci de votre aide !