cudaGraphicsResourceGetMappedPointer返回"未知错误"

kao*_*aoD 4 opengl interop cuda

我正在创建一个这样的OpenGL纹理:

glGenTextures( 1, &boardTex );
glBindTexture( GL_TEXTURE_2D, boardTex );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
Run Code Online (Sandbox Code Playgroud)

我得到了一个句柄,board所以我假设纹理已成功创建.我想与CUDA共享这个纹理,所以我注册并映射资源:

cudaGLSetGLDevice(0);
cudaGraphicsGLRegisterImage( &boardImage, boardTex, GL_TEXTURE_2D, cudaGraphicsMapFlagsNone );
cudaGraphicsMapResources( 1, &boardImage, 0 );
Run Code Online (Sandbox Code Playgroud)

然后我尝试获取映射指针,如下所示:

float4* mappedPointer;
size_t mappedSize;
cudaGraphicsResourceGetMappedPointer( (void**)&mappedPointer, &mappedSize, boardImage );
Run Code Online (Sandbox Code Playgroud)

不幸的是,此调用返回错误并拒绝工作.为了以防万一,我确保纹理没有绑定在OpenGL上下文中.还是行不通.cudaGetErrorString产生"未知错误",所以我很困惑.我很欣赏任何想法.

kao*_*aoD 5

好的,我自己发现了这个:

cudaGraphicsSubResourceGetMappedArray (&array, resource, 0, 0);返回一个cudaArray工作.我还没有考虑如何cudaArray工作(我可能最终使用PBO),但至少它没有崩溃.

编辑:

从CUDA参考指南条目cudaGraphicsResourceGetMappedPointer():

如果资源不是缓冲区,则无法通过指针访问它,并返回cudaErrorUnknown.

从CUDA参考指南条目cudaGraphicsSubResourceGetMappedArray():

如果资源不是纹理,则无法通过数组访问它,并返回cudaErrorUnknown.

换句话说,对映射的缓冲区对象使用GetMappedPointer.将GetMappedArray用于映射的纹理对象.