GPU にコピーしようとしている 2D マトリックス SIZE x SIZE があります。
この方法で行列を割り当てます。
#define SIZE 1024
float (*a)(SIZE) = (float(*)[SIZE]) malloc(SIZE * SIZE * sizeof(float));
そして、私はACC地域にこれを持っています:
void mmul_acc(restrict float a[][SIZE],
restrict float b[][SIZE],
restrict float c[][SIZE]) {
#pragma acc data copyin(a[0:SIZE][0:SIZE], b[0:SIZE][0:SIZE]) \
copyout c[0:SIZE][0:SIZE])
{
... code here...
}
-Minfo=acc を使用して PGI コンパイラでコンパイルすると、コンパイラは次のように通知します。
Generating copyin(a[0:1024][0:])
[0:1024][0:] とはどういう意味ですか? なぜ[0:1024][0:1024]ではないのですか???
行列を宣言する代わりに、サイズ SIZE*SIZE の配列を宣言すると、
#pragma acc copyin(a[0:SIZE*SIZE])
次のコンパイラ メッセージを生成します。
Generating copyin(a[0:16777216])
コードは実際には同じように機能し、同じパフォーマンス、同じ結果になります。
どうやらどちらの方法でも、コンパイラは同じコードを生成するはずですが、メッセージは簡単ではありません。
Linux64 マシンで PGI アクセラレータ 12.8 を使用しています。-Minfo=acc でコンパイルしています
注: この質問は編集されており、今ではあまり意味がありませんが、より多くの人にとって役立つ可能性があります。