XcalableACC
表示
この記事のほとんどまたは全てが唯一の出典にのみ基づいています。 (2014年11月) |
XcalableACC、XACC は演算加速器を搭載した大規模な並列計算機上での高性能計算向けにXcalableMPを拡張して作られたプログラミング言語である[1]。
XACCは指示文ベースの並列言語であるXcalableMPとOpenACCを組合せた言語である。 XACCでは、プログラマはXcalableMPの指示文とOpenACCの指示文をシームレスに利用することができる。 例えば、XcalableMPで定義した分散配列をOpenACCの指示文中で用いることが可能である。
データ通信については、プロセス間の通信にはXcalableMPの指示文を用い、ホストメモリとアクセラレータ間の通信にはOpenACCの指示文を用いる。 さらに、アクセラレータ間の通信には拡張されたXcalableMPの指示文を用いる。
XcalableMPおよびOpenACCはC言語およびFortranに対応しているため、XACCも同様にC言語およびFortranに対応している。
例
[編集]double u[XSIZE][YSIZE], uu[XSIZE][YSIZE];
#pragma xmp template t(0:YSIZE−1, 0:XSIZE−1)
#pragma xmp nodes p(x, y)
#pragma xmp distribute t(block, block) onto p
#pragma xmp align [j][i] with t(i,j) :: u, uu
#pragma xmp shadow uu[1:1][1:1]
...
#pragma acc data copy(u) copyin(uu) // 定義した分散配列をアクセラレータに転送
{
for(k=0; k<MAX_ITER; k++){
#pragma xmp loop (y,x) on t(y,x) // XcalableMPが分散したループ文を、
#pragma acc parallel loop collapse(2) // さらにOpenACC指示文がアクセラレータ内で分割処理する
for(x=1; x<XSIZE-1; x++)
for(y=1; y<YSIZE-1; y++)
uu[x][y] = u[x][y];
#pragma xmp reflect (uu) acc // shadow指示文で定義した袖領域をアクセラレータ間で同期する
#pragma xmp loop (y,x) on t(y,x)
#pragma acc parallel loop collapse(2)
for(x=1; x<XSIZE-1; x++)
for(y=1; y<YSIZE-1; y++)
u[x][y] = (uu[x-1][y]+uu[x+1][y]+
uu[x][y-1]+uu[x][y+1])/4.0;
} // end k
} // end data