4. nodes指示文

nodes指示文はノードの名前と形状を宣言します.形状は多次元が可能です.

4.1. 1次元ノード集合

  • XMP/Cプログラム
#pragma xmp nodes p[4]
  • XMP/Fortranプログラム
!$xmp nodes p(4)

4ノードからなる1次元ノード集合pを宣言しています, XMP/Cでは,p[0],p[1],p[2],p[3]が宣言されます. 同様に,XMP/Fortranでは,p(1),p(2),p(3),p(4)が宣言されます.

4.2. 多次元ノード集合

  • XMP/Cプログラム
#pragma xmp nodes p[2][3]
  • XMP/Fortranプログラム
!$xmp nodes p(3,2)

6ノードからなる2次元ノード集合pを宣言しています. XMP/Cでは,p[0][0],p[0][1],p[0][2],p[1][0],p[1][1],p[1][2]が宣言されます. 同様に,XMP/Fortranでは,p(1,1),p(2,1),p(3,1),p(1,2),p(2,2),p(3,2)が宣言されます.

注釈

C言語とFotranでは,配列の次元の順が逆になります.

4.3. 動的ノード集合

  • XMP/Cプログラム
#pragma xmp nodes p[*]
  • XMP/Fortranプログラム
!$xmp nodes p(*)

数字の代わりにアスタリスクを指定した1次元ノード集合pを宣言しています. アスタリスクを用いると,ノード数はプログラムの実行開始時に決まります. 具体的には,上の例において3ノードで実行した場合は,アスタリスクに「3」を指定した場合と同じ意味になります.

もちろん,アスタリスクを用いた多次元ノード集合の宣言も可能です.

  • XMP/Cプログラム
#pragma xmp nodes p[*][3]
  • XMP/Fortranプログラム
!$xmp nodes p(3,*)

上の例において12ノードで実行した場合は,アスタリスクに「4」を指定した場合と同じ意味になります.

注釈

多次元ノード集合では,アスタリスクは最後の次元にしか利用できません.

ヒント

アスタリスクよりも数字を用いた方が,コンパイラの最適化が効く場合があります.

4.4. 部分ノード集合

宣言済みのノード集合から部分ノード集合を作成することができます. 部分ノード集合を作成することで,通信の範囲などを狭めることができ,高速なアプリケーションの作成が行えます.

  • XMP/Cプログラム
#pragma xmp nodes p[16]
#pragma xmp nodes q[8]=p[0:8]
#pragma xmp nodes r[4][2]=p[8:8]
  • XMP/Fortranプログラム
!$xmp nodes p(16)
!$xmp nodes q(8)=p(1:8)
!$xmp nodes r(2,4)=p(9:16)

1行目で16ノードのノード集合pを宣言しています. 2行目でノード集合pの前半の8ノードを使って,部分ノード集合qを作成しています. 3行目でノード集合pの後半の8ノードを使って,2次元部分ノード集合rを作成しています.

2次元ノード集合から1次元ノード集合も作成できます.

  • XMP/Cプログラム
#pragma xmp nodes p[4][2]
#pragma xmp nodes row[4]=p[:][*]
#pragma xmp nodes col[2]=p[*][:]
  • XMP/Fortranプログラム
!$xmp nodes p(2,4)
!$xmp nodes row(4)=p(*,:)
!$xmp nodes col(2)=p(:,*)

1行目で4x2の2次元ノード集合pを宣言しています. 2行目でノード集合pから行方向を抜き出したノード集合rowを生成しています. 同様に,3行目でノード集合pから列方向を抜き出したノード集合colを生成しています.

上の例で利用されているコロンはtripletであり,その次元のすべての要素という意味です. アスタリスクは,その指示文を実行しているノードそのものという意味です. 例えば,XMP/Cの場合,p[0][0]とp[0][1]で実行される3行目はcol[2]=p[0][0:2]という意味なのに対し,p[1][0]とp[1][1]ではcol[2]=p[1][0:2]という意味です. 同様に,XMP/Fortranの場合,p(1,1)とp(2,1)で実行される3行目はcol(2)=p(1:2,1)という意味なのに対し,p(1,2)とp(2,2)ではcol(2)=p(1:2,2)という意味です.

_images/row_col.png

XMP/Cにおいて,row[0]という名前を持っているノードは,p[0][0]とp[0][1]です. また,col[0]という名前を持っているノードは,p[0][0]・p[1][0]・p[2][0]・p[3][0]です. 同様に,XMP/Fortranにおいて,row(1)という名前を持っているノードは,p(1,1)とp(2,1)です. また,col(1)という名前を持っているノードは,p(1,1)・p(1,2)・p(1,3)・p(1,4)です.

注釈

ノード集合を参照するとき(部分ノード集合を作成するときやon節で現れるとき)のアスタリスクの意味は, ノード集合を宣言するときや正規表現のアスタリスクの意味と異なります.