Запустите зацикленный процесс в bash на нескольких ядрах - PullRequest
4 голосов
/ 26 октября 2011

У меня есть сценарий оболочки, который содержит следующий цикл.

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i  
   i= 'expr $i +1'  
done

Этот скрипт выполняется на четырехъядерной машине и, согласно top, использует около 15% каждого ядра при выполнении одной итерации цикла. Я хотел бы распределить его по четырем ядрам, чтобы каждая итерация цикла выполнялась complexstuff четыре раза, по одному на каждое ядро, чтобы ресурсы использовались более эффективно. Мы говорим о вычислениях, которые в настоящее время занимают несколько часов, поэтому эффективность - это больше, чем просто хорошая практика. (Вывод каждой итерации, очевидно, не зависит от предыдущей.)

PS: Хост - это сервер под управлением Cent-OS, если это помогает.

Ответы [ 2 ]

10 голосов
/ 26 октября 2011

С GNU Parallel вы можете сделать:

seq $verylargevariable | parallel -j150% complexstuff RunManager file

150% будут запускать 1,5 процесса на ядро, поэтому если в настоящее время используется 15%, это должно дать вам около 100% на всех 4 ядрах.

Чтобы узнать больше, смотрите вступительные видеоролики: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3 голосов
/ 27 октября 2011

Помимо решения Ole Tange (которое выглядит великолепно), если ваши вычисления имеют примерно одинаковую продолжительность, вы можете попробовать что-то вроде этого:

i=0  
upperlimit=$verylargevariable  
do  
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   complexstuff RunManager file $i &
   i= 'expr $i + 1'
   wait
done

Таким образом, при каждом запуске цикла вы будете создавать 4 подпроцесса bash, которые будут запускать ваши вычисления (и, поскольку система великолепна, она будет отправлять их на разные ядра). Если с четырьмя процессами недостаточно сжечь весь ваш процессор, увеличьте число процессов, созданных в каждом цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...