5

多くのシリアルプログラムを「並行して」実行する必要がある場合(問題は単純ですが時間がかかるため、同じプログラムに対して多くの異なるデータセットを読み込む必要があるため)、1つのノードのみを使用すれば解決策は簡単です。私がしているのは、各コマンドの後に、たとえばジョブスクリプトで、アンパサンドを使用してシリアルジョブを送信し続けることだけです。

./program1 &
./program2 &
./program3 &
./program4

これにより、各シリアルプログラムが異なるプロセッサで自然に実行されます。これは、ログインサーバーまたはスタンドアロンワークステーションでうまく機能します。もちろん、1つのノードのみを要求するバッチジョブでも機能します。

しかし、110の異なるデータセットを読み取るために同じプログラムの110の異なるインスタンスを実行する必要がある場合はどうなりますか?110 ./program#コマンドを送信するスクリプトを使用して複数のノード(たとえば14)に送信すると、バッチシステムは各ジョブを異なるノードの異なるプロセッサで実行しますか、それともすべて同じで実行しようとしますか? 8コアノード?

単純なMPIコードを使用してさまざまなデータを読み取ろうとしましたが、さまざまなエラーが発生し、110個のプロセスのうち約100個が成功し、他のプロセスがクラッシュしました。ジョブ配列も検討しましたが、システムがそれをサポートしているかどうかはわかりません。

シリアルプログラムを個々のデータセットで広範囲にテストしました。ランタイムエラーはなく、各ノードで使用可能なメモリを超えることはありません。

4

2 に答える 2

5

いいえ、PBSは自動的にノード間でジョブを分散しません。しかし、これは一般的なことであり、いくつかの選択肢があります。

  • 最も簡単で、いくつかの点で最も有利なのは、タスクを1ノードサイズのチャンクにまとめ、それらのバンドルを個別のジョブとして送信することです。これにより、仕事をより早く開始できます。通常、1ノードのジョブは(たとえば)14ノードのジョブよりも速くスケジュールされます。これは、スケジュールに1ノードサイズの穴が14よりも多いためです。これは、すべてのジョブにほぼ同じ時間がかかる場合に特に効果的です。分割を行うのは非常に簡単だからです。

  • すべてを1つのジョブで実行したい場合(たとえば、簿記を簡素化するため)、pbsdshコマンドにアクセスできる場合とできない場合があります。ここでそれについての良い議論があります。これにより、ジョブ内のすべてのプロセッサで単一のスクリプトを実行できます。次に、$ PBS_VNODENUMにクエリを実行して、どのnnodes * ppnジョブであるかを調べ、適切なタスクを実行するスクリプトを記述します。

  • pbsdshでない場合、Gnu parallelは、これらのタスクを大幅に簡素化できるもう1つのツールです。よく知っている場合はxargsに似ていますが、複数のノードを含め、コマンドを並行して実行します。したがって、(たとえば)14ノードのジョブを送信し、最初のノードにgnu並列スクリプトを実行させることになります。良い点は、ジョブがすべて同じ長さでなくても、これでスケジューリングが行われることです。これらの種類のものにgnuparallelを使用するために、システム上のユーザーに提供するアドバイスはここにあります。gnu parallelがシステムにインストールされておらず、何らかの理由でsysadminがインストールされていない場合は、ホームディレクトリに設定できます。複雑なビルドではありません。

于 2011-03-28T00:43:01.843 に答える
2

ジョブ配列を検討する必要があります。

簡単に言うと、#PBS -t 0-109シェルスクリプトに挿入すると(範囲0-109は任意の整数範囲にすることができますが、110個のデータセットがあると述べました)、トルクは次のようになります。

  • スクリプトの110個のインスタンスを実行し、それぞれに指定したリソースを割り当てます(スクリプト内で#PBSタグを使用するか、送信時に引数として)。
  • PBS_ARRAYID各ジョブの環境変数に0から109までの一意の整数を割り当てます。

コード内の環境変数にアクセスできると仮定すると、各ジョブにデータセット番号で実行するように指示できますPBS_ARRAYID

于 2012-04-07T19:53:08.850 に答える