Closed mnakao closed 8 years ago
報告者: 村井
#pragma xmp loop on t(i)
for (i = 0; i < 100; i++)
a[i] = (b[i-1] + b[i] + b[i+1]) / 3;
という形で b[-1] を参照するのは認めるのだから、
#pragma task on p(1)
{
a[-1] = ...
}
という形も認めるべきか?
報告者:坂上@核融合研
問題を明確にするため,整理します.
1)周期的境界条件 dimension a(100), b(100)として,
do i = 2, 99
a(i) = ( b(i-1) + 2 * b(i) + b(i+1 ) / 4
end do
とあれば,ユーザは陽に
a(1) = ( b(100) + 2 * b(1) + b(2) ) /4
a(100) = ( b(99) + 2 * b(100) + b(1) ) / 4
と追加でコードを書かなければなりません.その後,
do i = 1, 100
b(i) = a(i)
end do
として,次のステップに備えます.議論の末,XMPでは,bに周期的なshadowを設定した場合,
!$XMP reflect(b)
do i = 1, 100
a(i) = ( b(i-1) + 2 * b(i) + b(i+1 ) / 4
end do
で,
a(1) = ( b(0) + 2 * b(1) + b(2) ) /4
の計算がされ,b(0) = b(100)は,reflectにより代入されているので,参照の問題はありません.
このとき,シリアルコードとの互換性は,なくなりますが,それは許容することになりました.
do i = 1, 100
b(i) = a(i)
end do
は同じです.
2)非周期的境界条件(固定端というのは誤解を与えるため) dimension a(100), b(100)として,
b(1) = ...
b(100) = ...
do i = 2, 99
a(i) = ( b(i-1) + 2 * b(i) + b(i+1 ) / 4
end do
do i = 2, 99
b(i) = a(i)
end do
または,
do i = 2, 99
a(i) = ( b(i-1) + 2 * b(i) + b(i+1 ) / 4
end do
a(1) = ...
a(100) = ...
do i = 1, 100
b(i) = a(i)
end do
と書きますが,問題は,b(1)または,a(1)の代入を誰がやるかだけです.それは,task onで書けるので,それ以上のことは必要ないと思うのですが...
例え,シリアルコードとの互換性を破棄しても,いい記述方法は,ないと思います.
村井さんのa[-1]は,私の場合にはa(0)に相当すると思いますが,それをアクセスする必要はありません.つまり,非周期的境界条件のための代入文は,shadow領域ではなく,実体領域に対して行うということです. また,shadow領域に値を設定するのは,reflect文だけであるという原則がくずれますが,それは,いいのですか? #そんな原則,あったっけという話はあるのかもしれませんが...
村井さんのa[-1]は,私の場合にはa(0)に相当すると思いますが,それをアクセスする必要はありません.つまり,非周期的境界条件のための代入文は,shadow領域ではなく,実体領域に対して行うということです.
これが常に真であれば問題はありません。
MPIであれば、そもそもデータ実体とシャドウ実体の区別がないので、この議論は起こりません。
一方で、MPIでない新しい並列プログラミングモデルであるXMPにおいて、非周期的境界条件のための代入文をシャドウ実体に適用するという実装はあり得ませんか?
報告者: 村井
非周期境界へのデータへの設定は差分法のアルゴリズムの一部なので、なぜシャドウ領域に置く必要があるかが分かりません。
たぶんその通りですが、本当に絶対にそうか、という問いです。
例えば、himenoBMT の MPI 版と等価な MPI コードに変換される XMPプログラムを書くには、そのような機能が必要になります。まあ、himenoBMT は実アプリケーションでなくベンチマークなので、特殊な例なのかもしれませんが・・・
報告者: 村井
負荷分散を均等にするという観点ですか?
そうではないです。
reflect構文に拠らずシャドウ実体を更新する手段は本当に絶対に不要か、と言い換えてもいいかもしれません。そのような手段が必要になる一つの例として非周期的境界条件を挙げましたが、必ずしもそれに限りません。
報告者:坂上@核融合研
reflect構文に拠らずシャドウ実体を更新する手段は本当に絶対に不要か、と言い換えてもいいかもしれません。
私は,原理的に不要だと思います.
a(0)に代入したいとして,それが,a(100)のshadow領域として定義できるなら,そもそもの宣言をa(0:100)とすればいいだけだからです.
勿論,配列aのサイズは,絶対に100にしたくて,101にしたくないという場合は,あるかもしれませんが・・・
報告者: 村井
非周期的境界条件の場合に限らず、「シャドウ実体を直接に更新する手段」の必要性に関して検討した結果、HPF/JA仕様のext_homeに相当する機能があればよいという結論に達した。ただし、優先度は低め。
報告者:岩下
2013/4/23の規格部会で、保留とするのが妥当と判断されたので、状態を保留に変えます。
XMP のグローバルビューでは、周期境界条件は、
で記述できるが、固定端の境界条件を記述できない。まだしも、XMP/Fortran では、
と書くこともできなくはないが、C では不可能。
もちろん、ローカルビューを使えば可能だが、グローバルビューでも固定端の境界条件を記述するための手段が必要ではないか。