2014-11-08 6 views
0

OpenACC에서 매우 간단한 벡터 추가 커널을 만들고 있습니다. 그리고 내가 이것이 (오픈 CL과 accuLL)을 사용하여 컴파일러와 문제가 있는지 궁금 해서요, 문제는 장치에서 호스트로 데이터를 다시 복사하는 것 같습니다. 모든 결과는 정확하지만 결과는 [0]입니다. 예 : 다음 코드를OpenACC 경계 문제

for (i=0; i<VEC_SIZE; i++) { 
    a[i] = i; 
    b[i] = VEC_SIZE-i; 
    result[i]=0; 
    } 
    #pragma acc kernels copyin(a,b) copy(result) 
    for (i=0; i<VEC_SIZE; i++) { 
    result[i] = a[i]+b[i]; 
    } 

    // verify result 
    for (i=0; i<VEC_SIZE; i++) { 
    if ((a[i] + b[i]) != result[i]) { 
     fprintf(stderr, "Incorrect results id %d val: %d \n", i, result[i]); 
    } 
    } 

반환 다음

Incorrect results id 0 val: 0 

모든 결과 만 0, 제로 장치에서 복사되지 않은 인덱스에 대한 reuslt처럼 올바른 보인다 인덱스의 하나를 의미합니다 .

이 코드는 컴파일러/런타임 버그입니까? 아니면 코딩과 관련하여 뭔가를 놓쳤습니까?

+0

코드가 괜찮습니다. 나는 여기에 보여준 것을 중심으로 완전한 코드와 테스트 케이스를 만들고 PGI 14.9 툴을 사용하여 컴파일했다. 예를 들어 [여기] (http://pastebin.com/jXKGWVAC) –

+0

브릴리언트, 그것은 나를 위해 너무 accuLL의 버그와 매우 흡사하게 보입니다. 확인해 주셔서 감사합니다. 원하는 경우 게시하고 답변 할 수 있습니다. – AzaraT

+0

아마 더 나은, 당신이 고침이 무엇인지 발견하면 돌아와서이 질문에 답하십시오. 그것은 미래의 독자들에게 더욱 유용 할 것입니다. 아니면 다른 사람이 와서 당신을 위해 그것을 정렬합니다. 최신 버전의 accull을 사용하고 있습니까? 그것은 0.3 인 것처럼 보이지만 당신은 "0.3.1"을 줄 수도있는 [master branch] (https://bitbucket.org/ruyman/accull/)에서 다운로드 할 수있는 것 같습니다. [accull 지원 메일 링리스트] (https://groups.google.com/forum/#!forum/accull). –

답변

0

그렇습니다. 코드 컴파일러의 버그라고 생각합니다. 코드가 올바르게 보이고 PGI 컴파일러를 사용할 수 있으므로 지금 사용하고 있으며 NVIDIA에 속합니다. 게다가 결과의 초기 값이 장치에 쓸모가 없으므로 코드 "copy (result)"를 "copyout (result)"로 변경하여 메모리 입출력 시간을 줄일 수 있습니다.