Chcę zrównoleglić for
pętle poniższego kodu. Jak to zrobić?
#!/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
źródło
źródło
Odpowiedzi:
Zawsze używaj pracowników podczas odradzania sparametryzowanej liczby procesów i ogranicz maksymalną liczbę pracowników, którzy mogą się odrodzić .
xargs -n | while read
to prosty sposób na iterację list w partiach.seq
tworzy listę liczb od 1 do N.xargs -n
dzieli tę listę na N / pracowników + 1 partie.while read i
czyta każdą linię liczb.work ${i} &
wywołujework
funkcję z${i}
partią liczb.Do debugowania dodałem skomentowany kod debugowania. Po prostu zamień na
echo
wersję do debugowania i kod między# --
na wersję do debugowania, a zobaczysz, jak działa na partiach. Odkomentowanieset -x
dla bardziej szczegółowego wyniku debugowania, który możesz przekierować do pliku.Wystarczy uruchomić wersję debugowania z różnymi parametrami, aby zobaczyć, jak działa:
Oświadczenie: Ten kod nie synchronizuje
min
wartości między procesami roboczymi. Uzyskanie minimalnej wartości nie jest strasznym ćwiczeniem. Prawdopodobnie zrobi to:Lub po prostu dodaj to samo do samego skryptu:
źródło
Korzystanie z GNU Parallel:
To będzie działać
/path/to/a.out
na każdym procesorze. Dane wyjściowe będą wyglądać następująco:Skrypt perla sprawdza pierwszą kolumnę i znajduje minimum w trzeciej kolumnie, która ma tę samą pierwszą kolumnę.
Możesz zainstalować GNU Parallel po prostu przez:
Obejrzyj filmy wprowadzające, aby dowiedzieć się więcej: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
źródło