Eu quero paralelizar os for
loops do código a seguir. Como fazer isso?
#!/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
fonte
fonte
Respostas:
Sempre use trabalhadores ao gerar um número parametrizado de processos e limite o número máximo de trabalhadores que podem gerar .
xargs -n | while read
é um meio simples de iterar listas em lotes.seq
cria uma lista de números de 1 a N.xargs -n
divide essa lista em N / trabalhadores + 1 lotes.while read i
lê cada linha de números.work ${i} &
apenas chama awork
função com${i}
lote de números.Para depurar, adicionei o código de depuração comentado. Basta substituir o
echo
com a versão de depuração e o código entre# --
com a versão de depuração e você poderá ver como ele funciona em lotes. Remova o comentárioset -x
para uma saída de depuração mais detalhada que você pode querer redirecionar para um arquivo.Basta executar a versão de depuração com parâmetros diferentes para ver como ela funciona:
Isenção de responsabilidade: este código não sincroniza o
min
valor entre os processos de trabalho. Obter o valor mínimo não é um exercício horrível. Isso provavelmente fará:Ou apenas adicione o mesmo ao próprio script:
fonte
Usando o GNU Parallel:
Isso será executado
/path/to/a.out
em cada CPU. A saída será como:O script perl examina a primeira coluna e encontra o mínimo na terceira coluna que possui a mesma primeira coluna.
Você pode instalar o GNU Parallel simplesmente:
Assista aos vídeos de introdução para saber mais: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
fonte