我的主机上有一个大小为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位版本。
由于我使用的是有效数组,因此别名不应成为问题,对吧?这是一个错误吗?
答案 0 :(得分:1)
这是一个范围问题,编译器没有保留“br”是并行区域的本地。自从我为PGI工作以来,我添加了一份问题报告(TPR#22760)并将其发送给我们的编译工程师进行进一步评估。