【发布时间】:2015-07-08 22:30:13
【问题描述】:
我在 OpenGL 和 CUDA 之间共享数据如下:
GLuint buffer;
glGenBuffers(1, &buffer);
// Some image is bound to this texture buffer at some point.
...
cudaGraphicsResource_t cgr;
checkCudaErrors(cudaGraphicsGLRegisterBuffer(&cgr,
buffer, cudaGraphicsRegisterFlagsNone));
checkCudaErrors(cudaGraphicsMapResources(1, &cgr, 0));
uchar4 * device_ptr = 0;
size_t num_bytes;
checkCudaErrors(cudaGraphicsResourceGetMappedPointer(
(void **)&device_ptr, &num_bytes, cgr));
这很好用,并且 device_ptr 不是指向我的 CUDA 内存的指针。现在,在某个时候,我想使用双线性插值重新采样该图像。似乎在 CUDA 中执行此操作的首选方法是将设备数据映射到 CUDA 纹理内存,然后使用 tex2D 调用执行插值。
现在,我的问题是图像数据已经存在于 OpenGL 纹理内存中,我想知道是否有办法避免再次调用 cudaBindTexture2D 并以某种方式使用 CUDA 中的 OpenGL 纹理进行插值?
【问题讨论】:
-
为什么 device_ptr 不是指向 CUDA 内存的指针?在调用
cudaGraphicsResourceGetMappedPointer之后,您应该能够将其视为指向设备内存中数组的指针并启动内核来执行插值。插值完成后,您所要做的就是调用cudaGraphicsUnmapResources(1, &cgr, 0)以使其由 OpenGL 显示。 -
当然可以,但是我可以使用它来使用 tex2D 调用执行纹理插值吗?我需要将它映射到像常规 CUDA 内存这样的纹理来进行插值吗?