ホストにサイズ N の配列があります。それを自分のデバイスに転送してから、エイリアスを割り当てて使用しようとします。しかし、「配列の境界を判別できません」というコンパイル エラーが発生します。
例:
#include <openacc.h>
#include <stdio.h>
#include <stdlib.h>
#define N 1000
int main() {
double *ar = (double*) malloc(sizeof(double) * N);
int i;
for(i=0;i<N;i++)
ar[i] = (i+1) * 1.0;
#pragma acc data copy(ar[0:N])
#pragma acc parallel
{
ar[90] = 29;
double *br = ar;
br[6] = 91;
}
ar[129] = 0.154;
for(i=0;i<N;i++)
if(ar[i] != (i+1) * 1.0)
printf("ERROR: %d - %.3f\n", i, ar[i]);
free(ar);
return 0;
}
上記のコードでは、次のエラーが発生します。
PGC-S-0155-Cannot determine bounds for array br (array.c: 15)
もっと具体的にこれを試してみてもdouble *br = &ar[0];
、同じことが起こります。
cc20 デバイスで CUDA 7.5 で PGI 16.5 64 ビット バージョンを使用しています。
有効な配列を使用しているので、エイリアシングは問題になりませんよね? これはバグですか?