クラスターの単一のコアで実行されるスクリプトがあります。各シリアル ジョブは独立しています。私が実行するために使用するクラスターは、qsub を実行するたびに 1 つのコアを割り当てるため、ppn=1 と見なされ、他のすべての人が他のコアを使用できます。qsub をループして、実行したいシリアル ジョブの数を送信するだけです。
ただし、私たちが使用する別のクラスターでは、ユーザーごとに 1 つのノードが自動的に割り当てられます (ノードがコアではなく最小単位になるように設定されています)。各ノードには 16 個のコアがあります。次にスクリプトを送信すると、16 個のコアすべてが割り当てられますが、実行されるジョブは 1 つだけです。したがって、スクリプトを実行して 16 個のコアすべてを使用するにはどうすればよいのでしょうか。
私が考えた 1 つのアイデアは、次のように現在のスクリプトをループする別のスクリプトを使用して同時ジョブを実行することでした。
for i in {1..16} do ./[my script] & done wait
次に、nodes=1,ppn=16 でこれを qsub します。これにより、16 のプロセスが生成されると思いますが、実際に 16 のコアすべてを使用しているのか、16 のプロセスすべてを実行しようとしている 1 つのコアを使用しているのかはわかりません。どちらが正しい?これを行うと、私の古い方法よりも約 40% 遅くなります (どちらの方法も古いクラスターでテストされています)。それを行うより良い方法はありますか?
前もって感謝します。