>> English


データマッピング

nodes指示文

[F] !$xmp nodes nodes-decl [, nodes-decl ]...
[C] #pragma xmp nodes nodes-decl [, nodes-decl ]...

where nodes-decl is one of:
    node-name (node-spec [, node-spec] ...)
    node-name (node-spec [, node-spec] ...) = node-ref

nodes-spec must be one of:
    int-expr
    *

ノード集合を宣言する.

例1:#pragma xmp nodes p(4)
例2:#pragma xmp nodes p(*)
例3:#pragma xmp nodes p(2, 2)
例4:#pragma xmp nodes p(2, 3, *)
例5:#pragma xmp nodes p(10)
          #pragma xmp nodes q(4)=p(5:8)
  • node-nameは任意の名前(ただし,テンプレート名や変数名と重なってはいけない)
  • nodes-specは計算ノードの数を定義.正の整数または"∗"."∗"の場合は,プログラム実行時に指定したノード数に合うように処理される
  • 例3や例4のように多次元のノード集合も宣言可能.各次元の数の積は,利用する計算ノード数と同じでなくてはいけない
  • 例4では,実行時に12ノードを指定する場合,"∗"は2と同じ意味を持つ."∗"は最後の次元にしか利用できない
  • 例5では,p(5)からp(8)までの4ノードを用いてサブノード集合p6を作成している

template指示文

[F] !$xmp template template-decl [, template-decl ]...
[C] #pragma xmp template template-decl [, template-spec]...

where template-decl is:
    template-name ( template-spec [, template-spec ]... )

and template-spec must be one of:
    [int-expr :] int-expr
    :

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

例1:#pragma xmp template t(0:9)
例2:#pragma xmp template t(0:9, 0:19)
  • template-nameは任意の名前(ただし,ノード集合名や変数名と重なってはいけない)
  • template-specはインデックスの範囲をコロンを用いて定義.例1の場合,0から9までのインデックスが定義される
  • 例2のように2次元(またはそれ以上)のテンプレートも宣言可能

distribute指示文

[F] !$xmp distribute template-name (dist-format [, dist-format]... ) onto nodes-name
[C] #pragma xmp distribute template-name (dist-format [, dist-format]... ) onto nodes-name

where dist-format must be one of:
    *
    block [ ( int-expr ) ]
    cyclic [ ( int-expr ) ]
    gblock ( { * | int-array } )

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

例1:#pragma xmp distribute t(block) onto p
例2:#pragma xmp distribute t(block, cyclic) onto p
例3:#pragma xmp distribute t(block, *) onto p

  • dist-formatは,"∗","block","block(n)","cyclic","cyclic(n)","gblock(m)"が利用可能
  • "∗"の場合は,その次元を重複させることを意味する

block分割

#pragma xmp nodes p(4)
#pragma xmp template t(0:19)
#pragma xmp distribute t(block) onto p

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

cyclic分割

#pragma xmp nodes p(4)
#pragma xmp template t(0:19)
#pragma xmp distribute t(cyclic) onto p

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

cyclic(n)分割

#pragma xmp nodes p(4)
#pragma xmp template t(0:19)
int n = 2;
#pragma xmp distribute t(cyclic(n)) onto p

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

gblock分割

#pragma xmp nodes p(4)
#pragma xmp template t(0:19)
int m[4] = {3, 5, 8, 4};
#pragma xmp distribute t(gblock(m)) onto p

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

align指示文

[F] !$xmp align array-name ( align-source [, align-source]... ) with template-name ( align-subscript [, align-subscript]... )
[C] #pragma xmp align array-name [align-source] [[align-source]]... with template-name ( align-subscript [, align-subscript]... )

where align-source must be one of:
    scalar-int-variable
    *
    :

and align-subscript must be one of:
    scalar-int-variable [ { + | - } int-expr ]
    *
    :

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

  • "∗"は分割しないことを意味する
  • ":"は,その配列やテンプレートが持っているインデックスの範囲を指す
例1:#pragma xmp align a[i] with t(i)         // 1次元配列と1次元テンプレートの場合
例2:#pragma xmp align a[:] with t(:)         // 例1と同じ意味
例3:#pragma xmp align a[i][j] with t(j, i)   // 2次元配列と2次元テンプレートの場合
例4:#pragma xmp align a[*][i] with t(i)      // 2次元配列と1次元テンプレートの場合
例5:#pragma xmp align a[i] with t(i, *)      // 1次元配列と2次元テンプレートの場合
例6:#pragma xmp align a[i] with t(i+1)       // 配列とテンプレートのインデックスを変えたい場合

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

#pragma xmp template t(0:19)
#pragma xmp nodes p(4)
#pragma xmp distribute t(block) onto p
int a[20];
#pragma xmp align a[i] with t(i)

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

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

#pragma xmp nodes p(2, 2)
#pragma xmp template t(0:9, 0:9)
#pragma xmp distribute t(block, cyclic) onto p
int a[10][10];
#pragma xmp align a[i][j] with t(j, i)

注意:テンプレートのインデックスの並び順はFortran言語をベースにしているため,C言語の場合ではiとjの順は配列とテンプレートで逆になります.

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

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

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

#pragma xmp nodes p(4)
#pragma xmp template t(0:19)
#pragma xmp distribute t(block) onto p
int a[10][20];
#pragma xmp align a[*][i] with t(i)

アスタリスクが用いられている配列a[][]の1次元目は分割されず,2次元目のインデックスのみが各ノードで分割処理されます.

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

#pragma xmp nodes p(2,2)
#pragma xmp template t(0:19, 0:19)
#pragma xmp distribute t(block, block) onto p
int a[10];
#pragma xmp align a[i] with t(i, *)

p(1,1)とp(1,2)はa[0]からa[4]の要素を共に持ち,p(2,1)とp(2,2)はa[5]からa[9]の要素を共に持ちます.

配列とテンプレートのインデックスを変えたい場合

#pragma xmp nodes p(4)
#pragma xmp template t(1:20)
#pragma xmp distribute t(block) onto p
int a[20];
#pragma xmp align a[i] with t(i+1)

p(1)は1から5までのインデックスを持ちますが,そのテンプレートは配列a[]の0から4までのインデックスと対応します.