2013-03-11 14 views
5

私は10個のコアにアクセスできるマシンにアクセスできます。実際に使用したいのですが。私は自分のマシン上で実行するために使用していますが、このようなものになるだろう:Bash:複数のコアで同じプログラムを実行

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" 
done 

は私が上でこれを行うにはしたいと思い10個のファイルがある - のはblah01.fa、それらblah00.faを呼ぶことを.. .blah09.fa。

このアプローチの問題は、myProgramが一度に1つのコアのみを使用し、マルチコアマシンでこれを実行すると、1回に1つのコアを10回使用するので、私のmahcineを最大限の能力で使用しています。

どのようにして10個の.faファイルを同時に実行できるようにスクリプトを変更できますか?私はRun a looped process in bash across multiple coresを見ましたが、私はそれが私が正確に望んだことをするという命令を得ることができませんでした。

+2

'gnu parallel'を試しましたか?何があなたのために働かなかったのですか? –

+1

その答えにgnu並列の提案を使ってみましたか? –

+2

'seq 0 10 | parallel myProgram -opt1 -opt2 ./blah{}.fa ./blah {}。tmp' –

答えて

8

あなたが並行してジョブの全てを開始する

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
done 
wait 

を使用することができ、その後、待つ彼らまですべて完全に移動する前に。あなたがコアよりも多くの仕事をしている場合は、それらをすべて起動し、OSスケジューラーがプロセスをスワップアウトすることを心配させるでしょう。

一つの変更は、時間

count=0 
for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
    ((count ++))   
    if ((count = 10)); then 
     wait 
     count=0 
    fi 
done 

で10個のジョブを開始することであるが、これは古いものが終了して、新しいジョブを開始することはできませんのでparallelを使用してより劣っている、とあなたもどうかを検出することはできませんあなたが10のジョブを開始する前に、より古いジョブは終了しました。 waitを使用すると、1つの特定のプロセス、またはすべてのバックグラウンドプロセスを待機できますが、バックグラウンドプロセスの任意のセットが完了したときに通知することはできません。 GNUで

+2

Bashの次のバージョンでは、 'wait -n' )現在、あなたは[this](https://gist.github.com/ormaaj/3911059)のようなことをすることができますが、次のバージョンで修正されるいくつかのバグのために少し難解です。 – ormaaj

4

を行うことができますパラレル:

parallel myProgram (options) {} {.}.tmp ::: *.fa 

から:

./configure && make && make install 

http://git.savannah.gnu.org/cgit/parallel.git/tree/README

=フルインストールは= GNUパラレルの

フルインストールがするのと同じくらい簡単ですあなたがrootでないなら、あなたのパスに〜/ binを追加して012にインストールすることができます〜/ binと〜/共有:

./configure --prefix=$HOME && make && make install 

または

お使いのシステムは、あなたは、単にあなたのパス内のディレクトリにはsrc /パラレル のsrc/SEMのsrc/niceloadのSRC/SQLをコピーすることができます '作る' 欠けている場合。=最小インストール

=

あなただけのパラレル必要とインストール「make」を持っていない場合は(多分 システムが古いまたはMicrosoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 
mv parallel sem dir-in-your-$PATH/bin/ 

ウォッチ学ぶためのイントロ動画more:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0
# Wait while instance count less than $3, run additional instance and exit 
function runParallel() { 
    cmd=$1 
    args=$2 
    number=$3 
    currNumber="1024" 
    while true ; do 
     currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l` 
     if [ $currNumber -lt $number ] ; then 
      break 
     fi 
     sleep 1 
    done 
    echo "run: $cmd $args" 
    $cmd $args & 
} 

loop=0 
# We will run 12 sleep commands for 10 seconds each 
# and only five of them will work simultaneously 
while [ $loop -ne 12 ] ; do 
    runParallel "sleep" 10 5 
    loop=`expr $loop + 1` 
done 
関連する問題