19. reduce_shadow指示文

reduce_shadow指示文は,袖の値を同期元の要素の値に加算します.

  • XMP/Cプログラム
#pragma xmp nodes p[2]
#pragma xmp template t[8]
#pragma xmp distribute t[block] onto p
int a[8];
#pragma xmp align a[i] with t[i]
#pragma xmp shadow a[1]
 :
#pragma xmp loop on t[i]
  for(int i=0;i<8;i++)
    a[i] = i+1;

 #pragma xmp reflect (a)
 #pragma xmp reduce_shadow (a)
  • XMP/Fortranプログラム
!$xmp nodes p(2)
!$xmp template t(8)
!$xmp distribute t(block) onto p
  integer a(8)
!$xmp align a(i) with t(i)
!$xmp shadow a(1)

!$xmp loop on t(i)
  do i=1, 8
    a(i) = i
  enddo

!$xmp reflect (a)
!$xmp reduce_shadow (a)

shadow指示文は,各ノードが持つ分散配列aに対して袖を1要素追加します. 次に,reflect指示文は,隣接ノード間で袖の更新を行います. 最後に,reduce_shadow指示文は,袖の値を同期元の要素の値に加算します.

XMP/Cでは,p[0]のa[3]は8の値を持ち,p[1]のa[4]は10の値を持ちます. 同様に,XMP/Fortranでは,p(1)のa(4)は8の値を持ち,p(2)のa(5)は10の値を持ちます.

_images/reduce_shadow.png

周期的な領域の更新を行うために,periodic修飾子をwidth節に追加することもできます.

  • XMP/Cプログラム
#pragma xmp reflect (a) width(/periodic/1)
#pragma xmp reduce_shadow (a) width(/periodic/1)
  • XMP/Fortranプログラム
!$xmp reflect (a) width(/periodic/1)
!$xmp reduce_shadow (a) width(/periodic/1)
_images/reduce_shadow_periodic.png

最初の例に追加して,XMP/Cでは,p[0]のa[0]は2の値を持ち,p[1]のa[7]は16の値を持ちます. 同様に,XMP/Fortranでは,p(1)のa(1)は2の値を持ち,p(2)のa(8)は16の値を持ちます.