17

たとえば、MPIを使用して並列プログラムを実行します。実行コマンド

mpirun -n 8 -npernode 2 <prg>

合計8つのプロセスを起動します。つまり、ノードごとに2つのプロセス、合計で4つのノードです。(OpenMPI 1.5)。ノードが1つのCPU(デュアルコア)で構成され、ノード間のネットワーク相互接続がInfiniBandである場合。

これで、ランク番号(またはプロセス番号)を次のように決定できます。

int myrank;
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

これにより、0から7までの数値が返されます。

しかし、ノード番号(この場合は0から3の間の番号)とノード内のプロセス番号(0から1の間の番号)をどのように決定できますか?

4

4 に答える 4

18

私はあなたがこの方法でMPI-3でそれを達成できると信じています:

MPI_Comm shmcomm;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
                    MPI_INFO_NULL, &shmcomm);
int shmrank;
MPI_Comm_rank(shmcomm, &shmrank);
于 2016-10-19T05:15:49.177 に答える
11

これはMPIの実装に依存し、この特定の問題の標準はありません。

Open MPIには、役立つ環境変数がいくつかあります。OMPI_COMM_WORLD_LOCAL_RANKは、ノード内のローカルランクを提供します。これはあなたが探しているプロセス番号です。したがって、getenvを呼び出すと問題が解決しますが、これは他のMPI実装に移植できません

OpenMPIの変数の(短い)リストについては、これを参照してください。

対応する「ノード番号」がわかりません。

于 2012-01-29T10:24:51.483 に答える
3

この正確な問題については、Markus Wittmannのブログ、MPIノード-ローカルランクの決定で説明されています。

そこでは、3つの戦略が提案されています。

  1. 素朴でポータブルなソリューションは、MPI_Get_processor_nameまたはgethostnameを使用してノードの一意の識別子を作成し、そのノードでMPI_Alltoallを実行します。[...]
  2. [方法2]は、MPI_Comm_splitに依存しています。これは、コミュニケーターをサブグループ(サブコミュニケーター)に分割する簡単な方法を提供します。[...]
  3. 可能な場合は、共有メモリを利用できます。[...]

一部の動作するコード(おそらくLGPLライセンス?)については、WittmannはAPSMライブラリからMpiNodeRank.cppにリンクしています。

于 2015-08-03T16:40:58.537 に答える
0

または、

int MPI_Get_processor_name( char *name, int *resultlen )

ノード名を取得し、それを色として使用する

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

これはそれほど単純ではありませんがMPI_Comm_split_type、コミュニケータを希望どおりに分割するためのもう少し自由度があります。

于 2018-05-25T09:12:37.010 に答える