0

ホストにサイズ 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 ビット バージョンを使用しています。

有効な配列を使用しているので、エイリアシングは問題になりませんよね? これはバグですか?

4

1 に答える 1

1

「br」が並列領域に対してローカルであることをコンパイラが保持していないのは、スコープの問題です。私は PGI で働いているので、問題レポート (TPR#22760) を追加し、さらなる評価のためにコンパイラ エンジニアに送信しました。

于 2016-07-20T18:02:41.413 に答える