호스트에 크기 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 비트 버전을 사용하고 있습니다.
유효한 배열을 사용하고 있으므로 앨리어싱이 문제가되지 않아야합니다. 맞습니까? 이거 버그 야?
그래서 현재의 GCC 또는 다른 순진한 구현에서 작동 할 것이라고 생각하십니까? 나는 단지 묻고있다. – Millad
GNU에 대해 잘 모르겠습니다. 병렬 for 루프 안에 "br"선언을 넣으면 범위 지정이 정확합니다. 선언문을 평행하지 않은 지역에 두는 이유가 있습니까? 나는 이것이 순차적으로 실행된다는 유즈 케이스에 대해서는 명확하지 않다. –
그 이유는'#pragma' 밖에서 선언문을 가져 오면 포인터의 크기를 지정해야하는 경우가 있기 때문입니다. 포인터의 크기는 어떤 경우에는 아직 모릅니다. 난 그냥 병렬 영역에서 자리 표시 자로 사용하고 있습니다. – Millad