2011-05-15 4 views
1

나는 커다란 CUDA 커널에서 세분화 된 메모리 오류를 가지고 있다고 생각합니다. 장치 측 printf는 결정적이어야하는 변수에 대해 다양한 값을 보여줍니다. 내가 사용하고있는 CUDA 개발 툴의 "안정된"버전은 제거 된 디바이스 에뮬레이션 모드이며 cuda-gdb 버전은 템플릿 기능과 함께 작동하지 않습니다. Cuda-memcheck는 실행되지만 아무것도 잡을 수 없습니다.CUDA 용 미세 입자 메모리 검사기?

CPU에서 valgrind 또는 electric fence를 사용하여 이와 같은 메모리 오류를 잡을 수 있습니다. 사용 가능한 모든 것이 printf라면 메모리 오류를 디버깅하는 데있어 깔끔한 트릭이 있습니까?

예를 들어 전체 메모리 공간을 nans로 플러딩하고 printfs를 사용하여 계산에서 처음 팝업되는 위치를 찾는 방법이 있습니까?

답변

1

이런 종류의 일을 위해서 나는 전체 사용 가능한 전역 메모리 공간을 할당 한 다음 직접 메모리를 관리해야합니다. 사용자 정의 memset 함수를 사용하여 전체 할당을 인식 할 수있는 워드 크기의 비트 패턴으로 설정 한 다음 커널에서 사용할 할당 내의 블록을 초기화합니다. 단순한 장치 측 assert를 구현하여 비트 패턴을 트랩하고 thread, block, line이 나타나면 그것을보고하면 cuda-memcheck가 catch하지 않는 범위를 벗어나는 전역 메모리 읽기를 분리 할 수 ​​있어야합니다.

+0

할당량 사이에 일정한 간격을 두지 않으면 기본적으로 전기 울타리 라이브러리를 직접 구현합니다. 한 가지 단점은 사용 가능한 전체 메모리 공간을 실제로 할당하면 gpu 당 하나의 cuda 앱으로 제한된다는 것입니다. –

+0

이제는 호스트에 대한 모든 할당 작업을 수행 중이라고 가정 할 때 libefence를 구현하는 것이 거의 가능합니다. LD_PRELOAD 해킹을 사용하여 cudaMalloc과 cudaFree를 트랩해야합니다. 누락 된 유일한 문제는 패딩 된 영역을 읽을 수 없거나 쓸 수없는 것으로 표시하여 범위를 벗어날 때마다 자동으로 세그 폴트 할 수있는 기능입니다. –

+0

@Drew Wagner : 원하는 경우 전체 메모리를 덜 할당 할 수 있습니다. CUDA-memcheck 또는 런타임은 VRAM 또는 다른 응용 프로그램 공간을 차지할 수있는 것을 잡을 수 있습니다. 방금 얻은 모든 바이트가 필요한 큰 선형 대수학 문제에서 작업하는 경향이 있으므로 방금 할당했습니다. – talonmies