簡體   English   中英

cuda,OpenGL互操作性:cudaGraphicsGLRegisterBuffer上的cudaErrorMemoryAllocation錯誤

[英]cuda, OpenGL interoperability: cudaErrorMemoryAllocation error on cudaGraphicsGLRegisterBuffer

我在使用cudaGraphicsGLRegisterBuffer()時遇到隨機cuda內存分配錯誤。 我有一個相當大的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);

對象非常大。 寬度和高度都是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));
    }
}

現在我按如下方式進行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);
}

這會為我的輸入運行一段時間,但過了一段時間它會崩潰:

CUDA error code=2(cudaErrorMemoryAllocation) 
                 "cudaGraphicsGLRegisterBuffer(&_cgr, pbo_id, 
                  cudaGraphicsRegisterFlagsNone)" 
Segmentation fault

我不確定為什么會有內存分配,因為我認為這是共享的。 我在內核調用后添加了cudaDeviceSynchronize() ,但錯誤仍然存​​在。 我的call_my_kernel()函數現在幾乎什么都不做,因此沒有其他CUDA調用可以引發此錯誤!

我在Linux上使用Cuda 7和K4000 Quadro卡。

編輯我將驅動程序更新到最新的346.72版本,但錯誤仍然存​​在。 它也不依賴於內核調用。 只是調用cudaGraphicsGLRegisterBuffer()似乎泄漏了GPU上的內存。 程序運行時運行nvidia-smi會顯示內存穩定上升。 我仍然不知道為什么會發生任何復制......

好的,我找到了我的難題的答案,我希望它能幫助其他人一起使用CUDA-OGL。

問題是我在打電話:

checkCudaErrors(cudaGraphicsGLRegisterBuffer(&_cgr, pbo_id,
                cudaGraphicsRegisterFlagsNone));

每次。 這實際上只需要調用一次然后我只需要在_cgr對象上調用map / unmap。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM