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를 확인해보세요.

프로그래밍 공부순서 | 코딩공부, 지금 시작하세요 | 평생소장 컴공강의
10년 뒤에도 살아남는 프로그래머가 되려면 기본기부터 제대로 배워야 합니다. POCU 아카데미에서 시작하세요!