これがopenaccに関する私の質問です。API (v1 および v2) を読みましたが、同じ配列の異なるサブパートを持つネストされたデータ環境の動作がわかりません。
コード例:
#pragma acc data pcopyin(a[0:20])
{
#pragma acc data pcopyin(a[100:20])
{
#pragma acc parallel loop
for(i=0; i<20; i++)
a[i] = i;
a[i+100] = i;
}
}
私の理解では、これは機能するはずです(または少なくとも2つのaccデータ部分):
- 最初のプラグマは、a[0,20] がアクセラレータ上にあるかどうかをチェックします
- NO -> データはデバイスに割り当てられ、転送されます
- 2 番目のプラグマは、a[100,120] がアクセラレータ上にあるかどうかをチェックします
- ポインタ a はアクセラレータ上にありますが、a[100,120] からのデータではありません
- データはデバイスに割り当てられ、転送されます
この種のことを CAPS コンパイラ (テスト マシンで現在のみ利用可能な v3.3.0) で試しましたが、2 番目の pragma acc data がエラーを返しました (2 番目のサブ配列の形状が正しくありません)。したがって、私のテストで何が起こるか (おそらく) は、ポインター "a" がアクセラレーターで見つかりましたが、それに関連付けられた形状 ([0:20]) は、2 番目のプラグマ ([100:20]) と同じではありません。 )。
これは API で計画されている通常の動作ですか、それとも私の例は機能するはずですか?
さらに、これが機能する場合、同じ配列のサブパーツ間に何らかの一貫性がありますか (どういうわけか、それらはホストのように配置され、a[i] += a[100+ を配置できます) i]私のカーネルで)?