我使用时有随机cuda内存分配错误cudaGraphicsGLRegisterBuffer().我有一个相当大的OpenGL PBO对象,它与它和CUDA共享.PBO对象创建如下:
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
glBufferData(target, rows * cols * 4, NULL, GL_DYNAMIC_COPY);
glUnmapBuffer(_target);
glBindBuffer(_target, 0);
Run Code Online (Sandbox Code Playgroud)
对象非常大.宽度和高度都是5000.但是,它在我的GPU上分配很好.现在,我在OpenGL和CUDA之间分享如下内容.我有一个简单的类来管理它如下:
class CudaPBOGraphicsResource
{
public:
CudaPBOGraphicsResource(GLuint pbo_id);
~CudaPBOGraphicsResource();
inline cudaGraphicsResource_t resource() const { return _cgr; }
private:
cudaGraphicsResource_t _cgr;
};
CudaPBOGraphicsResource::CudaPBOGraphicsResource(GLuint pbo_id)
{
checkCudaErrors(cudaGraphicsGLRegisterBuffer(&_cgr, pbo_id,
cudaGraphicsRegisterFlagsNone));
checkCudaErrors(cudaGraphicsMapResources(1, &_cgr, 0));
}
CudaPBOGraphicsResource::~CudaPBOGraphicsResource()
{
if (_cgr) {
checkCudaErrors(cudaGraphicsUnmapResources(1, &_cgr, 0));
}
}
Run Code Online (Sandbox Code Playgroud)
现在我按如下方式进行OpenGL和CUDA互操作:
{
CudaPBOGraphicsResource input_cpgr(pbo_id);
uchar4 * input_ptr = 0;
size_t num_bytes;
checkCudaErrors(cudaGraphicsResourceGetMappedPointer((void
**)&input_ptr, &num_bytes,
input_cpgr.resource()));
call_my_kernel(input_ptr);
}
Run Code Online (Sandbox Code Playgroud)
这会为我的输入运行一段时间,但过了一段时间它会崩溃:
CUDA error code=2(cudaErrorMemoryAllocation)
"cudaGraphicsGLRegisterBuffer(&_cgr, pbo_id,
cudaGraphicsRegisterFlagsNone)"
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我不确定为什么会有内存分配,因为我认为这是共享的.我cudaDeviceSynchronize()在内核调用后添加但错误仍然存在.我的call_my_kernel()功能现在几乎什么都不做,所以没有其他CUDA调用可以引发这个错误!
我在Linux上使用Cuda 7和K4000 Quadro卡.
编辑
我将驱动程序更新到最新的346.72版本,但错误仍然存在.它也不依赖于内核调用.只是打电话cudaGraphicsGLRegisterBuffer()似乎泄漏了GPU上的内存.程序运行时运行nvidia-smi会显示内存稳定上升.我仍然不知道为什么会发生任何复制......
好的,我找到了我的难题的答案,我希望它能帮助其他人一起使用CUDA-OGL.
问题是我在打电话:
checkCudaErrors(cudaGraphicsGLRegisterBuffer(&_cgr, pbo_id,
cudaGraphicsRegisterFlagsNone));
Run Code Online (Sandbox Code Playgroud)
每次.这实际上只需要调用一次然后我只需要在_cgr对象上调用map/unmap.
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |