Quiero paralelizar los for
bucles del siguiente código. ¿Como hacer esto?
#!/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
fuente
fuente
Respuestas:
Siempre use trabajadores cuando genere un número de procesos parametrizado y limite el número máximo de trabajadores que pueden generar .
xargs -n | while read
es un medio simple de iterar listas en lotes.seq
crea una lista de números del 1 al N.xargs -n
divide esa lista en N / trabajadores + 1 lotes.while read i
lee cada línea de números.work ${i} &
solo llama a lawork
función con un${i}
lote de números.Para depurar, agregué un código de depuración comentado. Simplemente reemplace la
echo
con la versión de depuración y el código intermedio# --
con su versión de depuración y podrá ver cómo funciona en lotes. Elimine el comentarioset -x
de una salida de depuración más detallada que quizás desee redirigir a un archivo.Simplemente ejecute la versión de depuración con diferentes parámetros para ver cómo funciona:
Descargo de responsabilidad: este código no sincroniza el
min
valor entre los procesos de trabajo. Obtener el valor mínimo no es un ejercicio horrible. Esto probablemente hará:O simplemente agregue lo mismo al script en sí:
fuente
Usando GNU Paralelo:
Esto se ejecutará
/path/to/a.out
en cada CPU. La salida será como:El script perl mira la primera columna y encuentra el mínimo en la tercera columna que tiene la misma primera columna.
Puede instalar GNU Parallel simplemente por:
Mire los videos de introducción para obtener más información: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
fuente