2012년 5월 26일 토요일

OpenCL에서 OUT_OF_RESOURCE 또는 CL_MEM_OBJECT_ALLOCATION_FAILURE 에러가 날 때

현재 개발중인 애플리케이션에서 OpenCL을 써서 속도를 높이고 있는데...

clEnqueueNDRangeKernel() 함수를 호출할때 갑자기 CL_MEM_OBJECT_ALLOCATION_FAILURE 에러가 나지 않나 나중엔 OUT_OF_RESOURCE 에러도 나고... 그래서 니가 삽질/해결한 방법을 잠시 노트로 남김.

1. 우선 실제 allocation을 하는 메모리가 얼마나 되는지 확인
실제 사용하고 있는 cl_mem 버퍼는 다 더해봐야 3MB 이하. OpenCL 최소 global 메모리 지원이 128MB 이니. 아무 문제가 없음.

2. Notification 함수
이리저리 뒤지다보니 에러가 날 때 notification 하는 함수를 안붙여놨음. 이 함수를 구현해서 컨텍스트를 생성할때 함수포인터를 전달. 그러니 clEnqueueWriteBuffer() 를 호출할때도 CL_MEM_OBJECT_ALLOCATION_FAILURE 발생하는걸 확인. 그래도 여전히 문제 해결엔 도움이 안됨.

3. CPU OpenCL 디바이스로 실행
인텔 CPU에서 아무 문제없이 실행됨... NVidia GPU에서 돌릴때만 문제가 생김... 순간 드라이버 문제가 아닌가 싶어 최신 드라이버 설치.. 아무 문제 없음

4. 메모리 stomp 확인
코드를 잘 살펴보니 allocation한 local memory의 범위를 넘어서 쓰기/읽기를 하고 있었음... 이걸 제거하니 아무 문제 없이 실행.. 드디어 고쳤다.. 만세..!




오늘의 교훈: OpenCL에서 CL_MEM_OBJECT_ALLOCATION_FAILURE 따위의 에러가 나온다면 메모리 stomp를 확인해보세요.

댓글 없음:

댓글 쓰기