Je veux paralléliser les for
boucles du code suivant. Comment faire ça?
#!/bin/bash
N=$1
n=$2
for (( i=1; i<=$N; i++ )); do
min=100000000000000 //set min to some garbage value
for (( j=1; j<=$n; j++ )); do
val=$(/path/to/a.out)
val2=`echo $val | bc`
if (( $val2 < $min )); then
min=$val2;
fi
done
arr=("${arr[@]}" "$min")
done
bash
shell-script
parallelism
RIchard Williams
la source
la source
Réponses:
Utilisez toujours des travailleurs lorsque vous générez un nombre paramétré de processus et limitez le nombre maximal de travailleurs pouvant apparaître .
xargs -n | while read
est un moyen simple d'itérer des listes par lots.seq
crée une liste de nombres de 1 à N.xargs -n
divise cette liste en N / travailleurs + 1 lots.while read i
lit chaque ligne de nombres.work ${i} &
appelle simplement lawork
fonction avec un${i}
lot de nombres.Pour déboguer, j'ai ajouté du code de débogage commenté. Remplacez simplement le
echo
par la version de débogage et le code entre# --
par sa version de débogage et vous pouvez voir comment cela fonctionne sur des lots. Décommentezset -x
pour une sortie de débogage plus détaillée que vous voudrez peut-être rediriger vers un fichier.Exécutez simplement la version de débogage avec différents paramètres pour voir comment elle fonctionne:
Avertissement: ce code ne synchronise pas la
min
valeur entre les processus de travail. L'obtention de la valeur minimale n'est pas un exercice horrible. Cela fera probablement:Ou ajoutez simplement la même chose au script lui-même:
la source
Utilisation de GNU Parallel:
Cela fonctionnera
/path/to/a.out
sur chaque CPU. La sortie sera comme:Le script perl regarde la première colonne et trouve le minimum dans la 3ème colonne qui a la même première colonne.
Vous pouvez installer GNU Parallel simplement en:
Regardez les vidéos d'introduction pour en savoir plus: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
la source