小编Arc*_*are的帖子

cuda,OpenGL互操作性:cudaGraphicsGLRegisterBuffer上的cudaErrorMemoryAllocation错误

我使用时有随机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 …
Run Code Online (Sandbox Code Playgroud)

c++ opengl cuda

7
推荐指数
1
解决办法
1194
查看次数

标签 统计

c++ ×1

cuda ×1

opengl ×1