OpenGL 빈번하게 사용되는 버퍼가 고아가되는 것이 일반적입니다. 드라이버는 동일한 크기의 버퍼가 요청 된 것을 드라이버가 알면 이상적인 경우 더 이상 필요하지 않으면 이전 버퍼를 반환합니다. 이전 버퍼가 여전히 사용되고 재사용 할 수 없을 때만 버퍼가 새 메모리를 할당합니다.OpenCL 버퍼가 고아가되어야합니까?
OpenCL (최신 개발자 드라이버를 사용하는 NVIDIA 하드웨어) 나는이 기술에 대해 확신하지 않습니다. 나는 C++ wrapper refcounting에 의해 처리되는 256kB 버퍼를 가지고 있는데, 나는 자주 재 할당한다. 대부분의 경우이 잘 작동하지만 일부 경우 OpenCL CL_OUT_OF_MEMORY 오류가 발생하는 새 버퍼를 할당하는 동안.
내 접근 방식을 바꿔야한다고 생각합니까 (예 : 일정한 수의 버퍼 사용)? 아니면이 문제에 대한 다른 가능한 원인을 조사해야합니까?
안부, 플로리안
잘 모르겠습니다. OpenCL은 C의 의미를 사용하지만 OpenGL의 속성과 기술을 일부 상속받습니다. cpp 래퍼 라이브러리 (cl.hpp) 할당 및 재 할당을 사용하면 다음과 같이 보입니다 : // init cl :: Buffer b = cl :: Buffer (attribs); // reinit b = cl :: Buffer (다른 속성) ... 이제 래퍼가 재 할당 작업을 수행하고 있지만 OpenCL 구현에는 자체 메모리 관리 기능이 있어야합니다. 그리고 같은 크기의 버퍼를 재사용 할 수 있습니다. – fho
그런 버퍼를 "reinit"하면 메모리 누수가 발생합니다. 그것은 다시 시작하지 않지만 다른 버퍼를 만들고 이전 버퍼에 대한 참조를 잃어 버립니다. 참조를 잃었다 고해서 그것이 해제되거나 재사용된다는 것을 의미하지는 않습니다! 이러지 마. – dietr
미안하지만 C++ OpenCL wrapper는 C++ 객체가 파괴 될 때 OpenCL 리소스를 해제하는 참조 카운트 된 시스템을 구현합니다. – fho