我使用以下代码清理CUDA对一对pbos的使用,以准备以不同的大小重新创建它们:
glFinish();
CUDA_SAFE_CALL(cudaGraphicsUnregisterResource(m_cuda_pbo_resource));
CUDA_SAFE_CALL(cudaGraphicsUnregisterResource(m_cuda_pbo_depth_resource));
glDeleteBuffersARB(1, &m_pbo);
glDeleteBuffersARB(1, &m_pbo_depth);
在我的窗口调整大小操作期间,在以新的大小重绘窗口时,在绘制操作中调用此代码。有时,取消注册m_cuda_pbo_resource的调用失败,程序终止。当用户尽可能快地持续调整窗口大小时,这似乎更有可能发生。因为它不会一直发生,所以它可能是某种竞争条件,但我已经没有尝试调试它的方法。
答案 0 :(得分:1)
您可以在内核运行时释放缓冲区。尝试坚持
cudaThreadSynchronize();
就在那段代码之前。
答案 1 :(得分:0)
您确定没有尝试删除缓冲区两次吗?
它是如何失败的?错误代码 ?您的应用程序是否有多个线程?
当用户调整窗口大小时,您的应用程序是否处理调整PBO大小的情况?
def on_resize( w, h):
- lock_redraw
- clean the PBO
- reallocate the PBO of the new size
- unlock redraw