XcalableMP / Specification

Specification of XcalableMP
0 stars 0 forks source link

XMP2.0実行モデル #17

Open mnakao opened 8 years ago

mnakao commented 8 years ago

報告者:村井

タスクレットとスレッドという概念が導入される XMP2.0 へ向け、実行モデルを修正しました。

従来は「ノード」が実行主体であったのに対し、

という定義に基づいたモデルとしています(基本的に OpenMP の真似です)。

一方、生成されたタスクレットのスケジュールについてはまだ議論されていませんが、(OpenMPのような)あまり複雑なルールにはしたくないので、taskletwait (またはその効果を持つ他の指示文)の箇所で実行されるという程度でいいかと考えています。

spec_tasklet.txt

mnakao commented 8 years ago

報告者:村井

タスクレットに関する要検討事項:OpenMP のタスクと比較したとき、

mnakao commented 8 years ago

報告者:村井

タスクレットの同期について:

xmp barrier は暗黙の taskletwait または taskletbarrier を含むのか?

mnakao commented 8 years ago

報告者:村井

要検討事項:

mnakao commented 8 years ago

第24回XMP規格部会(2016/5/30)で用いた資料を添付する。

tasklet仕様.pptx

h-murai commented 8 years ago

提案モデルに基づくコード例

#pragma xmp node P(4,4)

#pragma xmp template T(0:nt-1,0:nt-1)
#pragma xmp distribute T(block,block) onto P

double A[nt][nt][ts*ts];
#pragma xmp align A[j][i][*] with T(j,i)

xmp_event_t e0[nt][nt];
xmp_event_t e1[nt][nt];
xmp_event_t e2[nt][nt];
xmp_event_t e3[nt][nt];
#pragma xmp align e0[j][i] with T(j,i)
#pragma xmp align e1[j][i] with T(j,i)
#pragma xmp align e2[j][i] with T(j,i)
#pragma xmp align e3[j][i] with T(j,i)

void func(){

  xmp_disable_event(e0[:][:]);
  xmp_disable_event(e1[:][:]);
  xmp_disable_event(e2[:][:]);
  xmp_disable_event(e3[:][:]);

  xmp_enable_event(e2[0][:]);
  xmp_enable_event(e3[0][0]);

#pragma xmp taskletloop (k) on T(k,k) wait(e3[k][k]) post(e0[k][k]) grainsize(1)
  for (int k = 0; k < nt; k++){
    xmp_potrf(A[k][k], ts, ts);
  }

#pragma xmp taskletloop (k,i) on T(k,i) wait(e0[k][k], e2[k][i]) post(e1[k][i]) grainsize(1,1) private(T)
  for (int k = 0; k < nt; k++){
    for (int i = k + 1; i < nt; i++){
      double T[ts*ts];
#pragma xmp gmove in
      T[:] = A[k][k][:];
      xmp_trsm(T, A[k][i], ts, ts);
    }
  }

  for (int k = 0; k < nt; k++){
#pragma xmp taskletloop (j,i) on T(j,i) wait(e1[k][i], e1[k][j]) inpost(e2[j][i]) grainsize(1,1) private(T1, T2)
    for (int i = k + 1; i < nt; i++){
      for (int j = k + 1; j < i; j++){
    double T1[ts*ts], T2[ts*ts];
#pragma xmp gmove in
    T1[:] = A[k][i][:];
#pragma xmp gmove in
    T2[:] = A[k][j][:];
    xmp_gemm(T1, T2, A[j][i], ts, ts);
      }
    }
  }

  for (int k = 0; k < nt; k++){
#pragma xmp taskletloop (i) on T(i,i) wait(e1[k][i]) post(e3[i][i]) grainsize(1) private(T)
    for (int i = k + 1; i < nt; i++){
      double T[ts*ts];
#pragma xmp gmove in
      T[:] = A[k][i][:];
      xmp_syrk(T, A[i][i], ts, ts);
    }
  }

#pragma xmp taskletwait

}
h-murai commented 7 years ago

2016年9月29日の規格部会において、以下の方針を決定。