0

クラスターの単一のコアで実行されるスクリプトがあります。各シリアル ジョブは独立しています。私が実行するために使用するクラスターは、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% 遅くなります (どちらの方法も古いクラスターでテストされています)。それを行うより良い方法はありますか?

前もって感謝します。

4

1 に答える 1

0

「16 コピー」方式の実行速度が 40% 遅いと言うときは、古いクラスターから取得したタイミング、つまり 1 つのコアで 16 コピーを実行することについて話していることになります。16 個のコアで 16 個のコピーを実行すると遅くなるということを直接示唆するものではありません。

あなたが提案したスクリプトは問題なく見え、16 コアすべてを利用する必要があります。もちろん、ジョブのランタイムが可変である場合 (つまり、16 のうち 15 が 5 分で終了する可能性がありますが、1 つは数時間実行される可能性があります)、まだ未使用のコアがかなりあります。サイクル。これが影響を与える可能性がある場合は、より洗練されたものにする必要があり、より大きなワークセットが完了するまで、何らかのループとスポーン プロセスが必要になります。または、1 つのスクリプトから必要なすべてのプロセスを起動することもできます (したがって、16 のプロセッサで同時に実行されている 60 または任意のバッチが存在する可能性があります)。OS がそれらをスケジュールするようにします。 16 オン 1 コアで 40% の速度低下のみが発生することは、最大 256 ジョブまで 60% 以上の使用率が得られることを 示唆しています。

何をするにしても、クラスター監視ソフトウェアを使用して、実際に達成された CPU 使用率が期待どおりであることを確認してください。

于 2013-08-23T00:14:49.560 に答える