6.10. ランク問い合わせ関数¶
6.10.1. MPI_COMM_WORLD に指定した論理次元数と論理形状問い合わせ機能¶
ジョブ実行時に指定した論理次元数と論理形状とプロセス数によりMPI_COMM_WORLD
が生成されます。関数は、指定した論理次元数、論理形状を得ることができます。
MPI関数 |
説明 |
---|---|
FJMPI_TOPOLOGY_GET_DIMENSION |
|
FJMPI_TOPOLOGY_GET_SHAPE |
|
6.10.1.1. FJMPI_TOPOLOGY_GET_DIMENSION¶
<書式>
C言語書式
#include <mpi-ext.h> int FJMPI_Topology_get_dimension(int *size)
Fortran (USE mpi_f08_ext)書式
USE mpi_f08_ext FJMPI_Topology_get_dimension(size, ierror) INTEGER, INTENT(OUT) :: size INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran (USE mpi_ext)書式
USE MPI_EXT FJMPI_TOPOLOGY_GET_DIMENSION(SIZE, IERROR) INTEGER SIZE, IERROR
- <説明>
MPI_INIT
ルーチンを実行したときに内部的に生成されるMPI_COMM_WORLD
に属するMPIプロセスが配置されたプロセス形状の次元数を返します。型
変数
説明
IN/OUT
int *
size
MPI_COMM_WORLD
のもつプロセス形状の次元数OUT
<復帰値>
状態
復帰値
説明
正常時
FJMPI_SUCCESS
-
異常時
FJMPI_ERR_TOPOLOGY_INVALID_COMM
動的生成されたMPIプロセスから本ルーチンが呼び出された場合
異常時
FJMPI_ERR_TOPOLOGY_NODE_SHARED_JOB
ジョブ種別がノード共有ジョブの場合(ノード共有ジョブの詳細については、ジョブ運用ソフトウェアのマニュアルをお読みください)
<備考>
以下のどちらかの場合、動作は不定となり保証されません。
MPI_INIT
ルーチンの実行前に本ルーチンが呼び出された
MPI_FINALIZE
ルーチンの実行後に本ルーチンが呼び出された
6.10.1.2. FJMPI_TOPOLOGY_GET_SHAPE¶
<書式>
C言語書式
#include <mpi-ext.h> int FJMPI_Topology_get_shape(int *x, int *y, int *z)
Fortran (USE mpi_f08_ext)書式
USE mpi_f08_ext FJMPI_Topology_get_shape(x, y, z, ierror) INTEGER, INTENT(OUT) :: x, y, z INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran (USE mpi_ext)書式
USE MPI_EXT FJMPI_TOPOLOGY_GET_SHAPE(X, Y, Z, IERROR) INTEGER X, Y, Z, IERROR
- <説明>
MPI_INIT
ルーチンを実行したときに内部的に生成されるMPI_COMM_WORLD
に与えられるMPI並列プロセスの形状XYZを返します。型
変数
説明
IN/OUT
int *
x
MPI_COMM_WORLD
に与えられるプロセス形状のX軸のサイズOUT
int *
y
MPI_COMM_WORLD
に与えられるプロセス形状のY軸のサイズOUT
int *
z
MPI_COMM_WORLD
に与えられるプロセス形状のZ軸のサイズOUT
<復帰値>
状態
復帰値
説明
正常時
FJMPI_SUCCESS
-
異常時
FJMPI_ERR_TOPOLOGY_INVALID_COMM
動的生成されたMPIプロセスから本ルーチンが呼び出された場合
異常時
FJMPI_ERR_TOPOLOGY_NODE_SHARED_JOB
ジョブ種別がノード共有ジョブの場合(ノード共有ジョブの詳細については、ジョブ運用ソフトウェアのマニュアルをお読みください)
<備考>
プロセス形状が1次元の場合、Y軸およびZ軸の値は0になります。2次元の場合、Z軸の値は0になります。
以下のどちらかの場合、動作は不定となり保証されません。
MPI_INIT
ルーチンの実行前に本ルーチンが呼び出された
MPI_FINALIZE
ルーチンの実行後に本ルーチンが呼び出された
6.10.2. ランク番号によるMPIプログラムの論理座標問い合わせ機能¶
各ランクごとに論理座標が割り当てられます。関数は、ランク番号から割り当てられている論理座標を得ることができます。
MPI関数 |
説明 |
---|---|
FJMPI_TOPOLOGY_GET_COORDS |
ランクから座標を取得する |
6.10.2.1. FJMPI_TOPOLOGY_GET_COORDS¶
<書式>
C言語書式
#include <mpi-ext.h> int FJMPI_Topology_get_coords(MPI_Comm comm, int rank, int view, int maxdims, int coords[])
Fortran (USE mpi_f08_ext)書式
USE mpi_f08_ext FJMPI_Topology_get_coords(comm, rank, view, maxdims, coords, ierror) TYPE(MPI_Comm), INTENT(IN) :: comm INTEGER, INTENT(IN) :: rank, view, maxdims INTEGER, INTENT(OUT) :: coords(maxdims) INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran (USE mpi_ext)書式
USE MPI_EXT FJMPI_TOPOLOGY_GET_COORDS(COMM, RANK, VIEW, MAXDIMS, COORDS, IERROR) INTEGER COMM, RANK, VIEW, MAXDIMS, COORDS(*), IERROR
- <説明>
指定されたコミュニケータとそのコミュニケータにおけるプロセスのランクに対応する論理座標またはTofu座標を取得します。
- 論理座標を取得する場合
view = FJMPI_LOGICAL
、maxdims = 1~3
を指定します。指定したcomm
、rank
に対応するノードの論理X座標、論理Y座標、論理Z座標の値がそれぞれ coords[0]、coords[1]、coords[2] に格納されます。
- Tofu座標(実際に割り当てられた座標)を取得する場合
view = FJMPI_TOFU_SYS
、maxdims = 6
を指定します。指定したcomm
、rank
に対応するノードのTofu座標のX座標、Y座標、Z座標、A座標、B座標、C座標の値がそれぞれ coords[0]、coords[1]、coords[2]、coords[3]、coords[4]、coords[5] に格納されます。
- Tofu座標(引数
comm
のランク0を基準とした相対座標、comm
がグループ間コミュニケータの場合リモートグループのランク0を基準とした相対座標)を取得する場合 view = FJMPI_TOFU_REL
、maxdims = 6
を指定します。指定したcomm
、rank
に対応するノードのTofu座標(引数comm
のランク0を基準とした相対座標)のX座標、Y座標、Z座標、A座標、B座標、C座標の値がそれぞれcoords[0]、coords[1]、coords[2]、coords[3]、coords[4]、coords[5]に格納されます。
- Tofu座標(引数
型
変数
説明
IN/OUT
MPI_Comm
comm
コミュニケータを指定
IN
int
rank
コミュニケータ内のランクを指定引数comm
にグループ間コミュニケータを指定した場合、リモートグループのランクを指定IN
int
view
論理座標かTofu座標かを表すマクロを指定FJMPI_LOGICAL
: 論理座標FJMPI_TOFU_SYS
: Tofu座標(実際に割り当てられた座標)FJMPI_TOFU_REL
: Tofu座標(引数comm
のランク0を基準とした相対座標、comm
がグループ間コミュニケータの場合リモートグループのランク0を基準とした相対座標)IN
int
maxdims
取得する座標の次元数を指定view
がFJMPI_LOGICAL
の場合: 1~3を指定view
がFJMPI_LOGICAL
以外の場合: 1~6を指定IN
int[]
coords
コミュニケータとランクに対応する座標の配列
OUT
<復帰値>
状態
復帰値
説明
正常時
FJMPI_SUCCESS
-
異常時
FJMPI_ERR_TOPOLOGY_NODE_SHARED_JOB
ジョブ種別がノード共有ジョブの場合(ノード共有ジョブの詳細については、ジョブ運用ソフトウェアのマニュアルをお読みください)
<備考>
引数
coords
に指定する配列の要素数は、引数maxdims
以上でなければなりません。引数
rank
に指定するランクは、引数comm
に指定するコミュニケータ内のプロセスが持つランクの範囲内でなければなりません。引数
view
にFJMPI_LOGICAL
を指定した場合、引数maxdims
の値とジョブ形状が異なっていても構いません。その場合は、2つのうち小さい方の値と同じ次元数分の座標が取得されます。以下のどちらかの場合、動作は不定となり保証されません。
MPI_INIT
ルーチンの実行前に本ルーチンが呼び出されたMPI_FINALIZE
ルーチンの実行後に本ルーチンが呼び出された
6.10.3. 論理座標によるMPIプログラムのランク番号問い合わせ機能¶
関数は、論理座標から対応するランク番号を得ることができます。
MPI関数 |
説明 |
---|---|
FJMPI_TOPOLOGY_GET_RANKS |
座標からランクを取得する |
6.10.3.1. FJMPI_TOPOLOGY_GET_RANKS¶
<書式>
C言語書式
#include <mpi-ext.h> int FJMPI_Topology_get_ranks(MPI_Comm comm, int view, int coords[], int maxppn, int *outppn, int ranks[])
Fortran (USE mpi_f08_ext)書式
USE mpi_f08_ext FJMPI_Topology_get_ranks(comm, view, coords, maxppn, outppn, ranks, ierror) TYPE(MPI_Comm), INTENT(IN) :: comm INTEGER, INTENT(IN) :: view, coords(*), maxppn INTEGER, INTENT(OUT) :: outppn, ranks(maxppn) INTEGER, OPTIONAL, INTENT(OUT) :: ierror
Fortran (USE mpi_ext)書式
USE MPI_EXT FJMPI_TOPOLOGY_GET_RANKS(COMM, VIEW, COORDS, MAXPPN, OUTPPN, RANKS, IERROR) INTEGER COMM, VIEW, COORDS(*), MAXPPN, OUTPPN, RANKS(*), IERROR
- <説明>
指定された論理座標またはTofu座標に存在するプロセスのうち、指定されたコミュニケータに割り当てられているプロセスのランクを取得します。最大で、引数
maxppn
に指定した個数分のプロセスのランクを取得します。実際に取得したランクの個数は、引数outppn
に格納されます。本ルーチンの利用例を以下に示します。
- 論理座標を対象とし、対象の座標に1プロセス存在する場合
view = FJMPI_LOGICAL
、maxppn = 1
以上の値を指定します。また、論理X座標、論理Y座標、論理Z座標の値をそれぞれcoords[0]、coords[1]、coords[2]に指定します。指定したcomm
、coords
に存在するプロセスのランクがranks[0]
に格納されます。outppn
には、1が格納されます。
- Tofu座標を対象とし、対象の座標に4プロセス存在する場合
view = FJMPI_TOFU_SYS
またはFJMPI_TOFU_REL
、maxppn = 4
以上の値を指定します。また、Tofu座標のX座標、Y座標、Z座標、A座標、B座標、C座標の値をそれぞれcoords[0]、coords[1]、coords[2]、coords[3]、coords[4]、coords[5]に指定します。指定したcomm、coords
に存在するプロセスのランクがranks[0]、ranks[1]、ranks[2]、ranks[3]に格納されます。outppn
には、4が格納されます。
型
変数
説明
IN/OUT
MPI_Comm
comm
コミュニケータを指定
IN
int
view
論理座標かTofu座標かを表すマクロを指定FJMPI_LOGICAL
: 論理座標FJMPI_TOFU_SYS
:Tofu座標(実際に割り当てられた座標)FJMPI_TOFU_REL
:Tofu座標(引数comm
のランク0を基準とした相対座標、comm
がグループ間コミュニケータの場合リモートグループのランク0を基準とした相対座標)IN
int[]
coords
取得するランクのプロセスが割り当てられている座標の値を指定
IN
int
maxppn
ランクを取得する最大のプロセス数を指定
IN
int *
outppn
ランクを取得したプロセス数
OUT
int[]
ranks
取得したランクを格納した配列グループ間コミュニケータを指定した場合は、リモートグループのランクを格納OUT
<復帰値>
状態
復帰値
説明
正常時
FJMPI_SUCCESS
-
異常時
FJMPI_ERR_TOPOLOGY_NO_PROCESS
指定した座標に並列プロセスが配置されていない場合
異常時
FJMPI_ERR_TOPOLOGY_NODE_SHARED_JOB
ジョブ種別がノード共有ジョブの場合
ノード共有ジョブの詳細については、ジョブ運用ソフトウェアのマニュアルを参照してください。
<備考>
引数
coords
は、引数view
にFJMPI_LOGICAL
を指定した場合、ジョブと同じ次元数の要素分、値を設定する必要があります。引数view
にFJMPI_TOFU_SYS
またはFJMPI_TOFU_REL
を指定した場合は、6要素分、値を設定する必要があります。正しく設定されていない場合の動作は不定となり保証されません。引数
coords
に指定した座標に存在する、実際のプロセス数を取得するためには、引数maxppn
の値を大きくした状態で本ルーチンを実行し、引数outppn
の値を参照します。実際に存在するプロセスの数によっては、引数
maxppn
に指定した値よりも引数outppn
に格納される値の方が小さくなります。この場合は、outppn
の値と同じ要素数分だけ、引数ranks
に指定した配列内の値が更新されます。以下のどちらかの場合、動作は不定となり保証されません。
MPI_INIT
ルーチンの実行前に本ルーチンが呼び出された
MPI_FINALIZE
ルーチンの実行後に本ルーチンが呼び出された
6.10.4. 関数使用例¶
関数の使用例として、ランクから論理座標とTofu座標を調べる例を示します。
【サンプルプログラム(C)】
#include <stdio.h>
#include <mpi.h>
#include <mpi-ext.h> // ヘッダファイルをインクルード
#define LDIM 3
#define TDIM 6
int main(int argc, char *argv[])
{
int size, myrank, i, j, x, y, z;
int mydimension;
int coords[LDIM], tcoords[TDIM];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
FJMPI_Topology_get_dimension(&mydimension);
FJMPI_Topology_get_shape(&x, &y, &z);
if (myrank == 0) {
printf("My Dimension= %d\n",mydimension);
printf("My Shape: X= %d", x);
if (y != 0) printf(", Y= %d", y);
if (z != 0) printf(", Z= %d", z);
printf("\n\n");
for ( i=0; i < size ; i++){
FJMPI_Topology_get_coords(MPI_COMM_WORLD, i, FJMPI_LOGICAL, mydimension, coords);
FJMPI_Topology_get_coords(MPI_COMM_WORLD, i, FJMPI_TOFU_SYS, TDIM, tcoords);
switch(mydimension) {
case 1:
printf("rank to x : rank= %d, (X)=( %d ) ",i, coords[0]);
break;
case 2:
printf("rank to xy : rank= %d, (X,Y)=( %d, %d ) ",i, coords[0], coords[1]);
break;
case 3:
printf("rank to xyz : rank= %d, (X,Y,Z)=( %d, %d, %d ) ",
i, coords[0], coords[1], coords[2]);
break;
default:
break;
}
printf("(x,y,z,a,b,c)=(");
for ( j=0; j < TDIM-1; j++) {
printf("%d,", tcoords[j]);
}
printf("%d)\n",tcoords[TDIM-1]);
}
}
MPI_Finalize();
return 0;
}
6.10.4.1. 実行例(1次元)¶
サンプルプログラムを1次元形状で実行する際のジョブスクリプトおよび実行結果の例を示します。
【ジョブスクリプト】
#!/bin/bash -x # #PJM -L "node=12" # 1次元の形状を指定 #PJM -L "elapse=01:00:00" #PJM -g groupname #PJM -x PJM_LLIO_GFSCACHE=/vol000N #PJM -s # mpiexec ./a.out
【出力結果】
My Dimension= 1 My Shape: X= 12 rank to x : rank= 0, (X)=( 0 ) (x,y,z,a,b,c)=(18,19,19,0,1,1) rank to x : rank= 1, (X)=( 1 ) (x,y,z,a,b,c)=(18,19,19,0,2,1) rank to x : rank= 2, (X)=( 2 ) (x,y,z,a,b,c)=(18,19,19,1,1,1) rank to x : rank= 3, (X)=( 3 ) (x,y,z,a,b,c)=(18,19,19,1,2,1) rank to x : rank= 4, (X)=( 4 ) (x,y,z,a,b,c)=(19,19,19,0,1,0) rank to x : rank= 5, (X)=( 5 ) (x,y,z,a,b,c)=(19,19,19,0,2,1) rank to x : rank= 6, (X)=( 6 ) (x,y,z,a,b,c)=(19,19,19,1,0,0) rank to x : rank= 7, (X)=( 7 ) (x,y,z,a,b,c)=(19,19,19,1,1,0) rank to x : rank= 8, (X)=( 8 ) (x,y,z,a,b,c)=(19,19,19,1,2,1) rank to x : rank= 9, (X)=( 9 ) (x,y,z,a,b,c)=(20,19,19,0,0,0) rank to x : rank= 10, (X)=( 10 ) (x,y,z,a,b,c)=(20,19,19,0,1,0) rank to x : rank= 11, (X)=( 11 ) (x,y,z,a,b,c)=(20,19,19,1,1,0)
6.10.4.2. 実行例(2次元)¶
サンプルプログラムを2次元形状で実行する際のジョブスクリプトおよび実行結果の例を示します。
【ジョブスクリプト】
#!/bin/bash -x # #PJM -L "node=4x3" # 2次元の形状を指定 #PJM -L "elapse=01:00:00" #PJM -g groupname #PJM -x PJM_LLIO_GFSCACHE=/vol000N #PJM -s # mpiexec ./a.out
【出力結果】
My Dimension= 2 My Shape: X= 4, Y= 3 rank to xy : rank= 0, (X,Y)=( 0, 0 ) (x,y,z,a,b,c)=(14,21,19,0,0,0) rank to xy : rank= 1, (X,Y)=( 1, 0 ) (x,y,z,a,b,c)=(14,21,19,0,1,1) rank to xy : rank= 2, (X,Y)=( 2, 0 ) (x,y,z,a,b,c)=(14,21,19,1,0,0) rank to xy : rank= 3, (X,Y)=( 3, 0 ) (x,y,z,a,b,c)=(14,21,19,1,1,1) rank to xy : rank= 4, (X,Y)=( 0, 1 ) (x,y,z,a,b,c)=(14,21,19,0,0,1) rank to xy : rank= 5, (X,Y)=( 1, 1 ) (x,y,z,a,b,c)=(14,21,19,0,2,0) rank to xy : rank= 6, (X,Y)=( 2, 1 ) (x,y,z,a,b,c)=(14,21,19,1,0,1) rank to xy : rank= 7, (X,Y)=( 3, 1 ) (x,y,z,a,b,c)=(14,21,19,1,2,0) rank to xy : rank= 8, (X,Y)=( 0, 2 ) (x,y,z,a,b,c)=(14,21,19,0,1,0) rank to xy : rank= 9, (X,Y)=( 1, 2 ) (x,y,z,a,b,c)=(14,21,19,0,2,1) rank to xy : rank= 10, (X,Y)=( 2, 2 ) (x,y,z,a,b,c)=(14,21,19,1,1,0) rank to xy : rank= 11, (X,Y)=( 3, 2 ) (x,y,z,a,b,c)=(14,21,19,1,2,1)
6.10.4.3. 実行例(3次元)¶
サンプルプログラムを3次元形状で実行する際のジョブスクリプトおよび実行結果の例を示します。
【ジョブスクリプト】
#!/bin/bash -x # #PJM -L "node=2x3x2" # 3次元の形状を指定 #PJM -L "elapse=01:00:00" #PJM -g groupname #PJM -x PJM_LLIO_GFSCACHE=/vol000N #PJM -s # mpiexec ./a.out
【出力結果】
My Dimension= 3 My Shape: X= 2, Y= 3, Z= 2 rank to xyz : rank= 0, (X,Y,Z)=( 0, 0, 0 ) (x,y,z,a,b,c)=(16,17,18,0,0,0) rank to xyz : rank= 1, (X,Y,Z)=( 1, 0, 0 ) (x,y,z,a,b,c)=(16,17,18,1,1,0) rank to xyz : rank= 2, (X,Y,Z)=( 0, 1, 0 ) (x,y,z,a,b,c)=(16,17,18,0,1,0) rank to xyz : rank= 3, (X,Y,Z)=( 1, 1, 0 ) (x,y,z,a,b,c)=(17,17,18,0,0,0) rank to xyz : rank= 4, (X,Y,Z)=( 0, 2, 0 ) (x,y,z,a,b,c)=(16,17,18,1,0,0) rank to xyz : rank= 5, (X,Y,Z)=( 1, 2, 0 ) (x,y,z,a,b,c)=(17,17,18,1,0,0) rank to xyz : rank= 6, (X,Y,Z)=( 0, 0, 1 ) (x,y,z,a,b,c)=(16,17,18,0,0,1) rank to xyz : rank= 7, (X,Y,Z)=( 1, 0, 1 ) (x,y,z,a,b,c)=(16,17,18,1,2,0) rank to xyz : rank= 8, (X,Y,Z)=( 0, 1, 1 ) (x,y,z,a,b,c)=(16,17,18,0,2,0) rank to xyz : rank= 9, (X,Y,Z)=( 1, 1, 1 ) (x,y,z,a,b,c)=(17,17,18,0,1,0) rank to xyz : rank= 10, (X,Y,Z)=( 0, 2, 1 ) (x,y,z,a,b,c)=(16,17,18,1,0,1) rank to xyz : rank= 11, (X,Y,Z)=( 1, 2, 1 ) (x,y,z,a,b,c)=(17,17,18,1,1,0)