>> English


ワークマッピング

loop指示文

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

[F] !$xmp loop [ ( loop-index [, loop-index]...  ) ] on {node-ref | template-ref} [reduction-clause] ... 
[C] #pragma xmp loop [ ( loop-index [, loop-index] ... ) ] on {node-ref | template-ref} [reduction-clause] ...

where reduction-clause is:
    reduction ( reduction-kind : reduction-spec [, reduction-spec]... )

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

1重ループ文

#pragma xmp loop on t(i)
for( i = 0; i < 20; i++)
   a[i] = func(i);

2重ループ文

#pragma xmp loop (j, i) on t(j, i)
for( i = 0; i < 20; i++)
   for( j = 0; j < 10; j++)
      a[i][j] = func(i , j);

reduction節

sum = 0;
#pragma xmp loop on t(i) reduction(+:sum)
for( i = 0; i < 20; i++)
   sum += i;

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

nodecalculationsum
p(1)0+1+2+3+410
p(2)5+6+7+8+935
p(3)10+11+12+13+1460
p(4)15+16+17+18+1985

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

task指示文とtasks指示文

task指示文は,その処理をnodes-refまたはtemplate-refで指定したノードが実行する.

tasks指示文は,task指示文によるタスクを複数同時に実行する.

[F] !$xmp task on { nodes-ref | template-ref}
      (structured-block)
      !$xmp end task

[C] #pragma xmp task on { nodes-ref | template-ref }
      (structured-block)

[F] !$xmp tasks
      (task-construct)
      ...
      !$xmp end tasks

[C] #pragma xmp tasks
      {
        (task-construct)
	      ...
      }

下記の例の場合,p(1)はfunc_a()をp(2)はfunc_b()を実行する.

#pragma xmp task on p(1)
   func_a();

#pragma xmp task on p(2)
   func_b();