2017-09-06 12 views
1

OpenACC를 사용하고 Tesla GPU에서 사용하기 위해 PGI 컴파일러로 컴파일 한 C++ 코드를 작성했습니다."잘못된 주소 공간"오류 디버그

경고없이 컴파일이 성공합니다.

call to cuStreamSynchronize returned error 717: Invalid address space 
call to cuMemFreeHost returned error 717: Invalid address space 

인터넷이 문제가 자동으로 양탄자 아래에 휩쓸되도록 enabling unified memory을 제안하는 것보다 다른, 이것에 대해 많이 알고하지 않는 것 :

나는 두 가지 오류를 프로그램을 실행 얻을. 나는 그런 종류의 해결책이 아니다.

어떻게 디버깅해야합니까?

CPU에서만 실행되는 C++ 코드를 사용하면 gdb를 실행하고 역 추적을 수행하고 "아 하!"라고 말합니다.

하지만 지금은 코드 사이에 GPU와 데이터가 흐르고 있습니다. 나는 어떤 도구를 사용할 지조차 모른다.

대체적으로 문제가 없어 질 때까지 줄을 주석 처리하는 것이 좋습니다.하지만 너무 차선책으로 보입니다.

답변

1

"cuda-gdb"를 사용하여 장치 코드를 디버깅하거나 "cuda-memcheck"를 사용하여 메모리 오류를 확인할 수 있습니다.

여기에서도 도움이 될지 모르겠지만. 이 오류는 장치 코드가 잘못된 메모리 공간의 주소를 사용하여 명령을 실행 중임을 나타냅니다. 예를 들어 전역 메모리 포인터를 예상하는 명령어와 공유 메모리 포인터를 사용합니다.

이전에이 오류를 보지 못했거나 이전 버그 보고서를 볼 수 없었으므로 그 원인에 대해서만 이론화 할 수 있습니다. 하나의 가능성은 외부 갱단 루프에서 벡터 루틴으로 전달되는 공유 메모리 변수 ("private"절 또는 "cache"지시문의 스칼라 또는 배열)가있는 경우입니다. 이 경우 벡터 루틴은 전역 메모리에있는 것처럼 변수에 액세스 할 수 있습니다.

원인에 관계없이 대부분 컴파일러 오류입니다. 가능한 경우 게시하거나 PGI 고객 서비스 ([email protected])로 재생 예제를 보내 주시면 조사를 위해 컴파일러 엔지니어에게 보내 드리겠습니다.

나는 또한 원인을 더 잘 이해하면 해결 방법을 찾을 수 있습니다. 그 동안에는 "-ta = tesla : nollvm, keepgpu"로 컴파일을 시도 할 수 있습니다. "nollvm"은 컴파일러가 기본 LLVM 장치 코드 생성기와 반대로 OpenACC 커널의 중간 CUDA C 버전을 생성하게합니다. "keepgpu"는 조사 할 수있는 중간 ".gpu"파일을 보관합니다.

+0

감사합니다. Mat! 이 문제를 테스트하기까지는 며칠이 걸리지 만 제안 된 주소로 문제가되는 코드 (재현 가능한 예일만큼 짧음)가 포함 된 이메일을 보냈습니다. – Richard

+0

문제는 로컬 변수가 원자 단위로 사용된다는 것입니다. Atomics는 공유 메모리 또는 전역 메모리에서만 사용할 수 있습니다. 이 문제를 해결하고 코드 성능을 개선하기위한 제안 된 변경 사항이있는 업데이트 된 소스 파일을 보내 드렸습니다. –

0

디버깅을 돕는 유용한 환경 변수가 있습니다. 모든 조합을 사용 설정할 수 있습니다.

export PGI_ACC_TIME=1 #Profile time usage 
export PGI_ACC_NOTIFY=1 #Set to values 0-3 where 3 is the most detailed 
export PGI_ACC_DEBUG=1 #Extra debugging info