9. template_fix指示文

template_fix指示文は,サイズ未定義のテンプレートに対してそのサイズと分散の形状を定義します. 分散配列のサイズも動的に決定する場合に用います.

  • XMP/Cプログラム
#pragma xmp nodes p[4]
#pragma xmp template t[:]
#pragma xmp distribute t[block] onto p
double *a;
#pragma xmp align a[i] with t[i]

int n = 100;
#pragma xmp template_fix t[n]
a = xmp_malloc(xmp_desc_of(a), n);
  • XMP/Fortranプログラム
!$xmp nodes p(4)
!$xmp template t(:)
!$xmp distribute t(block) onto p
real, allocatable :: a(:)
integer :: n
!$xmp align a(i) with t(i)

n = 100
!$xmp template_fix t(n)
allocate(a(n))

まず,template指示文は,サイズが未定義のテンプレートをコロンを用いて宣言します. 次に,align指示文は,XMP/Cの場合はポインタを配列と仮定して整列し,XMP/Fortranの場合はallocatable配列を整列します. template_fix指示文は,テンプレートのサイズを定義します. 最後に,XMP/Cの場合はxmp_malloc(),XMP/Fortranの場合はallocate文を使って,分散配列のサイズを決定します.

注釈

template_fix指示文によるサイズ未定義のテンプレートに対する定義は1回だけ行うことができます.

distribute指示文において「gblock(*)」を指定した場合は,template_fix指示文において,下記のようにgblockにおける分散の形状も決定することができます.

  • XMP/Cプログラム
#pragma xmp nodes p[4]
#pragma xmp template t[:]
#pragma xmp distribute t[gblock(*)] onto p
double *a;
#pragma xmp align a[i] with t[i]

int n = 100;
int m[] = {40,30,20,10};

#pragma xmp template_fix[gblock(m)] t[n]
a = xmp_malloc(xmp_desc_of(a), n);
  • XMP/Fortranプログラム
!$xmp nodes p(4)
!$xmp template t(:)
!$xmp distribute t(gblock) onto p
real, allocatable :: a(:)
integer :: n, m(4)
!$xmp align a(i) with t(i)

n = 100
m(:) = (/40,30,20,10/)
!$xmp template_fix(gblock(m)) t(n)
allocate(a(n))