2011-01-18 4 views
1

OpenGL 빈번하게 사용되는 버퍼가 고아가되는 것이 일반적입니다. 드라이버는 동일한 크기의 버퍼가 요청 된 것을 드라이버가 알면 이상적인 경우 더 이상 필요하지 않으면 이전 버퍼를 반환합니다. 이전 버퍼가 여전히 사용되고 재사용 할 수 없을 때만 버퍼가 새 메모리를 할당합니다.OpenCL 버퍼가 고아가되어야합니까?

OpenCL (최신 개발자 드라이버를 사용하는 NVIDIA 하드웨어) 나는이 기술에 대해 확신하지 않습니다. 나는 C++ wrapper refcounting에 의해 처리되는 256kB 버퍼를 가지고 있는데, 나는 자주 재 할당한다. 대부분의 경우이 잘 작동하지만 일부 경우 OpenCL CL_OUT_OF_MEMORY 오류가 발생하는 새 버퍼를 할당하는 동안.

내 접근 방식을 바꿔야한다고 생각합니까 (예 : 일정한 수의 버퍼 사용)? 아니면이 문제에 대한 다른 가능한 원인을 조사해야합니까?

안부, 플로리안

답변

1

오픈 CL 메모리 할당 및 할당 해제를위한 C 시멘틱스를 사용한다. 따라서 자동으로 버퍼를 재사용하지 않습니다. 은 명시 적으로 버퍼를 해제하고 나중에 새 버퍼를 할당하기 위해을가집니다. 또는 버퍼를 수동으로 다시 사용하는 것이 좋습니다. 할당은 꽤 비싼 작업이 될 수 있습니다.

+0

잘 모르겠습니다. OpenCL은 C의 의미를 사용하지만 OpenGL의 속성과 기술을 일부 상속받습니다. cpp 래퍼 라이브러리 (cl.hpp) 할당 및 재 할당을 사용하면 다음과 같이 보입니다 : // init cl :: Buffer b = cl :: Buffer (attribs); // reinit b = cl :: Buffer (다른 속성) ... 이제 래퍼가 재 할당 작업을 수행하고 있지만 OpenCL 구현에는 자체 메모리 관리 기능이 있어야합니다. 그리고 같은 크기의 버퍼를 재사용 할 수 있습니다. – fho

+0

그런 버퍼를 "reinit"하면 메모리 누수가 발생합니다. 그것은 다시 시작하지 않지만 다른 버퍼를 만들고 이전 버퍼에 대한 참조를 잃어 버립니다. 참조를 잃었다 고해서 그것이 해제되거나 재사용된다는 것을 의미하지는 않습니다! 이러지 마. – dietr

+0

미안하지만 C++ OpenCL wrapper는 C++ 객체가 파괴 될 때 OpenCL 리소스를 해제하는 참조 카운트 된 시스템을 구현합니다. – fho