>> English


データマッピング

nodes指示文

ノード集合を宣言する.

C
例1:#pragma xmp nodes p[4]
例2:#pragma xmp nodes p[*]
例3:#pragma xmp nodes p[2][2]
例4:#pragma xmp nodes p[*][3][2]
Fortran
例1:!$xmp nodes p(4)
例2:!$xmp nodes p(*)
例3:!$xmp nodes p(2,2)
例4:!$xmp nodes p(2,3,*)
  • 例1は4ノードで実行することを示す
  • 例2は任意のノード数で実行する
  • 例3や例4のように多次元のノード集合も宣言可能.各次元の数の積は,利用する計算ノード数と同じでなくてはいけない
  • 例4は実行時に12ノードを指定する場合,"∗"は2と同じ意味を持つ."∗"は最後の次元にしか利用できない

template指示文

仮想的なインデックスであるテンプレートを定義する.

C
例1:#pragma xmp template t[10]
例2:#pragma xmp template t[20][10]
Fortran
例1:!$xmp template t(10)
例2:!$xmp template t(10, 20)
  • 例2のように2次元(またはそれ以上)のテンプレートも宣言可能

distribute指示文

テンプレートの分散方法を指定する.

C
例1:#pragma xmp distribute t[block] onto p
例2:#pragma xmp distribute t[cyclic][block] onto p
例3:#pragma xmp distribute t[*][block] onto p
Fortran
例1:!$xmp distribute t(block) onto p
例2:!$distribute t(block, cyclic) onto p
例3:!$xmp distribute t(block, *) onto p
  • 分散は,"∗","block","block(n)","cyclic","cyclic(n)","gblock(m)"が利用可能
  • "∗"の場合は,その次元を重複させることを意味する

block分割

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
#pragma xmp distribute t[block] onto p
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
!$xmp distribute t(block) onto p
nodeindexes of template
p[0] 0, 1, 2, 3, 4
p[1] 5, 6, 7, 8, 9
p[2] 10, 11, 12, 13, 14
p[3] 15, 16, 17, 18, 19
nodeindexes of template
p(1) 1, 2, 3, 4, 5
p(2) 6, 7, 8, 9, 10
p(3) 11, 12, 13, 14, 15
p(4) 16, 17, 18, 19, 20

cyclic分割

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
#pragma xmp distribute t[cyclic] onto p
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
!$xmp distribute t(cyclic) onto p
nodeindexes of template
p[0] 0, 4, 8, 12, 16
p[1] 1, 5, 9, 13, 17
p[2] 2, 6, 10, 14, 18
p[3] 3, 7, 11, 15, 19
nodeindexes of template
p(1) 1, 5, 9, 13, 17
p(2) 2, 6, 10, 14, 18
p(3) 3, 7, 11, 15, 19
p(4) 4, 8, 12, 16, 20

block-cyclic分割

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
#pragma xmp distribute t[cyclic(2)] onto p
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
!$xmp distribute t(cyclic(2)) onto p
nodeindexes of template
p[0] 0, 1, 8, 9, 16, 17
p[1] 2, 3, 10, 11, 18, 19
p[2] 4, 5, 12, 13
p[3] 6, 7, 14, 15
nodeindexes of template
p(1) 1, 2, 9, 10, 17, 18
p(2) 3, 4, 11, 12, 19, 20
p(3) 5, 6, 13, 14
p(4) 7, 8, 15, 16

gblock分割

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
int m[4] = {3, 5, 8, 4};
#pragma xmp distribute t[gblock(m)] onto p
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
integer :: m(4) = (/3, 5, 8, 4/)
!$xmp distribute t(gblock(m)) onto p
nodeindexes of template
p[0] 0, 1, 2
p[1] 3, 4, 5, 6, 7
p[2] 8, 9, 10, 11, 12, 13, 14, 15
p[3] 16, 17, 18, 19
nodeindexes of template
p(1) 1, 2, 3
p(2) 4, 5, 6, 7, 8
p(3) 9, 10, 11, 12, 13, 14, 15, 16
p(4) 17, 18, 19, 20

align指示文

分散させたい配列とテンプレートを対応させる.

1次元配列と1次元テンプレート

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
#pragma xmp distribute t[block] onto p
int a[20];
#pragma xmp align a[i] with t[i]
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
!$xmp distribute t(block) onto p
integer :: a(20)
!$xmp align a(i) with t(i)

各ノードは下記の配列aのインデックスを処理します.

nodeindexes
p[0] 0, 1, 2, 3, 4
p[1] 5, 6, 7, 8, 9
p[2] 10, 11, 12, 13, 14
p[3] 15, 16, 17, 18, 19
nodeindexes
p(1) 1, 2, 3, 4, 5
p(2) 6, 7, 8, 9, 10
p(3) 11, 12, 13, 14, 15
p(4) 16, 17, 18, 19, 20

2次元配列と2次元テンプレート

C
#pragma xmp nodes p[2][2]
#pragma xmp template t[10][10]
#pragma xmp distribute t[block][block] onto p
int a[10][10];
#pragma xmp align a[i][j] with t[i][j]
Fortran
!$xmp nodes p(2,2)
!$xmp template t(10,10)
!$xmp distribute t(block,block) onto p
integer :: a(10,10)
!$xmp align a(j,i) with t(j,i)

各ノードは下記の配列a[][]のインデックスを処理します.

node1st indexes of a[][]2nd indexes of a[][]
p[0][0] 0, 1, 2, 3, 4 0, 1, 2, 3, 4
p[0][1] 0, 1, 2, 3, 4 5, 6, 7, 8, 9
p[1][0] 5, 6, 7, 8, 9 0, 1, 2, 3, 4
p[1][1] 5, 6, 7, 8, 9 5, 6, 7, 8, 9
node1st indexes of a()2nd indexes of a()
p(1,1) 1, 2, 3, 4, 5 1, 2, 3, 4, 5
p(2,1) 6, 7, 8, 9, 10 1, 2, 3, 4, 5
p(1,2) 1, 2, 3, 4, 5 6, 7, 8, 9, 10
p(2,2) 6, 7, 8, 9, 10 6, 7, 8, 9, 10
C
#pragma xmp nodes p[2][2]
#pragma xmp template t[10][10]
#pragma xmp distribute t[block][cyclic] onto p
int a[10][10];
#pragma xmp align a[i][j] with t[i][j]
Fortran
!$xmp nodes p(2,2)
!$xmp template t(10,10)
!$xmp distribute t(cyclic,block) onto p
integer :: a(10,10)
!$xmp align a(j,i) with t(j,i)

各ノードは下記の配列a[][]のインデックスを処理します.

node1st indexes of a[][]2nd indexes of a[][]
p[0][0] 0, 1, 2, 3, 4 0, 2, 4, 6, 8
p[0][1] 0, 1, 2, 3, 4 1, 3, 5, 7, 9
p[1][0] 5, 6, 7, 8, 9 0, 2, 4, 6, 8
p[1][1] 5, 6, 7, 8, 9 1, 3, 5, 7, 9
node1st indexes of a()2nd indexes of a()
p(1,1) 1, 3, 5, 7, 9 1, 2, 3, 4, 5
p(2,1) 2, 4, 6, 8, 10 1, 2, 3, 4, 5
p(1,2) 1, 2, 3, 4, 5 6, 7, 8, 9, 10
p(2,2) 2, 4, 6, 8, 10 6, 7, 8, 9, 10

2次元配列と1次元テンプレート

C
#pragma xmp nodes p[4]
#pragma xmp template t[20]
#pragma xmp distribute t[block] onto p
int a[10][20];
#pragma xmp align a[*][i] with t[i]
Fortran
!$xmp nodes p(4)
!$xmp template t(20)
!$xmp distribute t(block) onto p
integer :: a(20,10)
!$xmp align a(i,*) with t(i)
  • C:アスタリスクが用いられている配列a[][]の1次元目は分割されず,2次元目のインデックスのみが分割される.
  • Fortran:アスタリスクが用いられている配列a(,)の2次元目は分割されず,1次元目のインデックスのみが分割される.

1次元配列と2次元テンプレート

C
#pragma xmp nodes p[2][2]
#pragma xmp template t[10][10]
#pragma xmp distribute t[block][block] onto p
int a[10];
#pragma xmp align a[i] with t[*][i]
Fortran
!$xmp nodes p(2,2)
!$xmp template t(10,10)
!$xmp distribute t(block,block) onto p
integer :: a(10)
!$xmp align a(i) with t(i,*)
  • C:p[0][0]とp[1][0]はa[0]からa[4]の要素を持ち,p[0][1]とp[1][1]はa[5]からa[9]の要素を持ちます.
  • Fortran:p(1,1)とp(1,2)はa(1)からa(5)の要素を持ち,p(2,1)とp(2,2)はa(6)からa(10)の要素を持ちます.