0

私はLSFに非常に慣れていません。ノードごとに 2 つのソケットを持つ 4 つのノードがあります。各ノードには 8 つのコアがあります。ハイブリッド MPI+OpenMP コードを開発しました。各コアに 1 つの MPI タスクを実行するように要求する、次のようなジョブを送信しています。だから私はOpenMPの力を失います。

##BSUB -n 64

各ソケットが各コアではなく 1 つの MPI タスクを実行するようにジョブを送信して、ソケット内のコアを OpenMP に使用できるようにしたいと考えています。コード内のハイブリッド化の機能を最適化するために、ジョブ送信スクリプトを作成するにはどうすればよいですか?

4

1 に答える 1

0

まず第一に、BSUBセンチネルの前には 1 つの#記号を付ける必要があります。そうしないと、通常のコメントとしてスキップされます。

古い LSF バージョンでハイブリッド ジョブを開始する正しい方法は、spanリソース要求と要求ノードを排他的に渡すことです。それぞれ 8 つの MPI プロセスと 8 つの OpenMP スレッドでジョブを開始するには、次を使用する必要があります。

#BSUB -n 8
#BSUB -x
#BSUB -R "span[ptile=2]"

パラメータは次のとおりです。

  • -n 8- MPI プロセス用に 8 スロットを要求する
  • -x- 排他的にノードをリクエスト
  • -R "span[ptile=2]"- ノードごとに 2 つのスロットにわたってジョブをスパンするように LSF に指示します。

ノードを排他的に要求する必要があります。そうしないと、ノードごとに 2 つのスロットしか使用されないため、LSF は他のジョブを同じノードにスケジュールします。

次に、OMP_NUM_THREADS環境変数を4(ソケットあたりのコア数) に設定し、MPI ライブラリにその変数を MPI プロセスに渡すように指示し、ライブラリが各 MPI プロセスを独自の CPU ソケットに制限するようにする必要があります。残念ながら、これは非常に実装固有です。たとえば、次のようになります。

MPI 1.6.x 以前を開く:

export OMP_NUM_THREADS=4
mpiexec -x OMP_NUM_THREADS --bind-to-socket --bysocket ./program.exe

MPI 1.7.x 以降を開きます。

export OMP_NUM_THREADS=4
mpiexec -x OMP_NUM_THREADS --bind-to socket --map-by socket ./program.exe

Intel MPI (IMPI をあまり使用しないため、これについてはよくわかりません):

mpiexec -genv OMP_NUM_THREADS 4 -genv I_MPI_PIN 1 \
        -genv I_MPI_PIN_DOMAIN socket -genv I_MPI_PIN_ORDER scatter \
        ./program.exe
于 2015-06-09T11:37:33.647 に答える