2016-07-19 2 views
0

호스트에 크기 N의 배열이 있습니다. 내 장치로 전송 한 다음 별칭을 할당하고 사용하려고합니다. 그러나 "배열의 경계를 결정할 수 없습니다"라는 메시지가 표시됩니다 컴파일 오류.openacc - 배열의 별칭이 "배열의 경계를 결정할 수 없습니다"오류가 발생합니다.

예 : 코드 위

#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; 
} 

는 다음과 같은 오류가 발생합니다 : 나는 더 구체적으로 시도하고이 double *br = &ar[0];을 시도하는 경우

PGC-S-0155-Cannot determine bounds for array br (array.c: 15)

에도 같은 일이 발생합니다.

저는 cc20 장치에서 CUDA 7.5와 함께 PGI 16.5 64 비트 버전을 사용하고 있습니다.

유효한 배열을 사용하고 있으므로 앨리어싱이 문제가되지 않아야합니다. 맞습니까? 이거 버그 야?

답변

1

컴파일러가 "br"가 병렬 영역에 대해 로컬이라는 사실을 계속 유지하는 범위 지정 문제입니다. PGI에서 일하기 때문에 문제 보고서 (TPR # 22760)를 추가하여 컴파일러 엔지니어에게 보내 추가 평가를 받았습니다.

+0

그래서 현재의 GCC 또는 다른 순진한 구현에서 작동 할 것이라고 생각하십니까? 나는 단지 묻고있다. – Millad

+0

GNU에 대해 잘 모르겠습니다. 병렬 for 루프 안에 "br"선언을 넣으면 범위 지정이 정확합니다. 선언문을 평행하지 않은 지역에 두는 이유가 있습니까? 나는 이것이 순차적으로 실행된다는 유즈 케이스에 대해서는 명확하지 않다. –

+0

그 이유는'#pragma' 밖에서 선언문을 가져 오면 포인터의 크기를 지정해야하는 경우가 있기 때문입니다. 포인터의 크기는 어떤 경우에는 아직 모릅니다. 난 그냥 병렬 영역에서 자리 표시 자로 사용하고 있습니다. – Millad

관련 문제