openacc - 数组的别名导致"无法确定数组的边界"错误

时间:2016-07-19 23:28:03

标签: alias openacc pgi pgi-accelerator

我的主机上有一个大小为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位版本。

由于我使用的是有效数组,因此别名不应成为问题,对吧?这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

这是一个范围问题,编译器没有保留“br”是并行区域的本地。自从我为PGI工作以来,我添加了一份问题报告(TPR#22760)并将其发送给我们的编译工程师进行进一步评估。