1

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 でコンパイルしています

注: この質問は編集されており、今ではあまり意味がありませんが、より多くの人にとって役立つ可能性があります。

4

1 に答える 1

2

この問題は、最新の PGI Compiler 12.9.0 で修正されています。コンパイラは次のメッセージを返すようになりました。

Generating copyin(a[0:1024][0:1024])
于 2012-10-18T08:19:06.683 に答える