6.10. ランク問い合わせ関数

MPIプログラムの実行時は、ジョブスクリプトで指定した形状に合わせて、1から3次元のトーラス座標が設定されます。本章ではトーラス座標のことを「論理座標」と呼ぶこととします。
各ランクには論理座標が割り当てられます。
ランクと論理座標の対応を問い合わせる関数を用意しています。各関数の書式についてはマニュアル「MPI使用手引書」の「ランク問い合わせインターフェース」を参照してください。
なお、本関数は動的プロセス生成の中では使用できません。

6.10.1. MPI_COMM_WORLD に指定した論理次元数と論理形状問い合わせ機能

ジョブ実行時に指定した論理次元数と論理形状とプロセス数によりMPI_COMM_WORLDが生成されます。関数は、指定した論理次元数、論理形状を得ることができます。

MPI関数

説明

FJMPI_TOPOLOGY_GET_DIMENSION

MPI_COMM_WORLDに与えられる次元数を取得する

FJMPI_TOPOLOGY_GET_SHAPE

MPI_COMM_WORLDに与えられるプロセス形状を取得する

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_LOGICALmaxdims = 1~3を指定します。指定したcommrankに対応するノードの論理X座標、論理Y座標、論理Z座標の値がそれぞれ coords[0]、coords[1]、coords[2] に格納されます。

  • Tofu座標(実際に割り当てられた座標)を取得する場合

    view = FJMPI_TOFU_SYSmaxdims = 6を指定します。指定したcommrankに対応するノードの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_RELmaxdims = 6を指定します。指定したcommrankに対応するノードのTofu座標(引数commのランク0を基準とした相対座標)のX座標、Y座標、Z座標、A座標、B座標、C座標の値がそれぞれcoords[0]、coords[1]、coords[2]、coords[3]、coords[4]、coords[5]に格納されます。

変数

説明

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

取得する座標の次元数を指定
viewFJMPI_LOGICALの場合: 1~3を指定
viewFJMPI_LOGICAL以外の場合: 1~6を指定

IN

int[]

coords

コミュニケータとランクに対応する座標の配列

OUT

<復帰値>

状態

復帰値

説明

正常時

FJMPI_SUCCESS

-

異常時

FJMPI_ERR_TOPOLOGY_NODE_SHARED_JOB

ジョブ種別がノード共有ジョブの場合(ノード共有ジョブの詳細については、ジョブ運用ソフトウェアのマニュアルをお読みください)

<備考>

  • 引数coordsに指定する配列の要素数は、引数maxdims以上でなければなりません。

  • 引数rankに指定するランクは、引数commに指定するコミュニケータ内のプロセスが持つランクの範囲内でなければなりません。

  • 引数viewFJMPI_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_LOGICALmaxppn = 1以上の値を指定します。また、論理X座標、論理Y座標、論理Z座標の値をそれぞれcoords[0]、coords[1]、coords[2]に指定します。指定したcommcoordsに存在するプロセスのランクがranks[0]に格納されます。outppnには、1が格納されます。

  • Tofu座標を対象とし、対象の座標に4プロセス存在する場合

    view = FJMPI_TOFU_SYSまたはFJMPI_TOFU_RELmaxppn = 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は、引数viewFJMPI_LOGICALを指定した場合、ジョブと同じ次元数の要素分、値を設定する必要があります。引数viewFJMPI_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)