>> English


ワークマッピング

loop指示文

ループの負荷分散を指示する.並列化したいLoop文の直前に指示文を挿入する.

  • loopとonの間には分割したいindexの変数名を指定する.1重ループ文の場合は省略可能
  • onはtemplate名もしくはnodes集合名を指定
  • reduction節の演算子には下記が利用可能
  • [F] +, *, -, .and., .or., .eqv., .neqv., max, min, iand, ior, ieor, firstmax, firstmin, lastmax, lastmin
    [C] +, *, -, &, |, ^, &&, ||, max, min, firstmax, firstmin, lastmax, lastmin

1重ループ文

C
#pragma xmp loop on t[i]
for( i = 0; i < 20; i++){
   a[i] = func(i);
}
Fortran
!$xmp loop on t(i)
do i=1, 20
   a(i) = func(i)
end do

2重ループ文

C
#pragma xmp loop (i,j) on t[i][j]
for( i = 0; i < 20; i++){
   for( j = 0; j < 10; j++){
      a[i][j] = func(i , j);
    }
}
Fortran
!$xmp loop (i,j) on t(i,j)
do j=1, 10
   do i=1, 20
     a(i, j) = func(i, j)
   end do
end do

reduction節

C
#pragma xmp loop on t[i] reduction(+:sum)
for( i = 0; i < 20; i++){
   sum += i;
}
Fortran
!$xmp loop on t(i) reduction(+:sum)
do i=1, 20
  sum = sum + i
end do

各ノードでは下記のように計算が行われる(4ノードの場合).

C
nodecalculationsum
p[0]0+1+2+3+410
p[1]5+6+7+8+935
p[2]10+11+12+13+1460
p[3]15+16+17+18+1985
Fortran
nodecalculationsum
p(1)1+2+3+4+515
p(2)6+7+8+9+1040
p(3)11+12+13+14+1565
p(4)16+17+18+19+2090

ループ文終了後にreduction節により,各ノードが持つsumの値の総和が計算される.この場合,Cは190,Fortranは210が各ノードのsumに代入される.