私は、巨大なサンプルスペースをワーカースレッドに均等に分割し、並列でジョブを実行するMPIプログラムを使用しています。次のスクリプトを使用してジョブを送信しています。
#!/bin/bash
#PBS -l nodes=NNODES
mpirun -np NPROC ./run >log
クラスタのWebページから、ノードごとに10個のコアがあることがわかりました。100個のワーカースレッド(NPROC)が必要な場合は、10個のノード(NNODES)を要求するだけでよいと素朴に想定しています。ただし、NNODESを増やすと、実行中のプログラムのウォールタイムが減少し続けることがわかりました。
これは、ノードごとに複数のワーカースレッドではなく1を割り当てると、リソースの競合が少なくなるためだと思います。これが本当なら、NNODES == 100(NPROC)のときも壁時間は横ばいになると思いました。これは、ノードごとに1つのワーカースレッドがあり、ノードが増えても壁時間がさらに短縮されないためです。要求されたワーカースレッドより。
ただし、100(NPROC)を超えてNNODESをさらに増やすと、壁時間が再びほぼ直線的に減少するため、私は再び間違っています。ソースコードが実際に上記のスクリプトからNPROCを読み取り、サンプルをそれらに分割しているため、これは本当に混乱しました。ワーカースレッドよりも多くのノードを要求すると処理が速くなる理由がわかりません。