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

김포프 2012-07-08

현재 개발중인 애플리케이션에서 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를 확인해보세요.