Я хочу распараллелить for
циклы следующего кода. Как это сделать?
#!/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
Ричард Уильямс
источник
источник
Ответы:
Всегда используйте рабочих при порождении параметризованного числа процессов и ограничивайте максимальное количество рабочих, которые могут появиться .
xargs -n | while read
это простой способ перебора списков в пакетном режиме.seq
создает список чисел от 1 до N.xargs -n
разбивает этот список на н / работников + 1 пакет.while read i
читает каждую строку чисел.work ${i} &
просто вызываетwork
функцию с${i}
партией чисел.Для отладки я добавил закомментированный код отладки. Просто замените его
echo
на отладочную версию, а код -# --
на отладочную версию, и вы увидите, как он работает в пакетном режиме. Раскомментируйтеset -x
более подробный отладочный вывод, который вы можете перенаправить в файл.Просто запустите отладочную версию с другими параметрами, чтобы посмотреть, как она работает:
Отказ от ответственности: этот код не синхронизирует
min
значение между рабочими процессами. Получение минимального значения не является ужасным упражнением. Это, вероятно, сделает:Или просто добавьте то же самое в сам скрипт:
источник
Используя GNU Parallel:
Это будет работать
/path/to/a.out
на каждом процессоре. Вывод будет выглядеть так:Скрипт perl просматривает первый столбец и находит минимум в 3-м столбце с таким же первым столбцом.
Вы можете установить GNU Parallel просто:
Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
источник