我使用以下代码来清理 CUDA 对一对 pbo 的使用,准备以不同的大小重新创建它们:
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 的调用会失败并且程序终止。当用户尽可能快地连续调整窗口大小时,发生这种情况的可能性似乎更高。因为它不会一直发生,所以可能是某种竞争条件,但我已经没有办法尝试调试它了。
最佳答案
您可以在内核运行时释放缓冲区。尝试粘贴
cudaThreadSynchronize();
就在该代码块之前。
关于opengl - cudaGraphicsUnregisterResource 中出现崩溃错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333893/