我正在使用kivy的组合进行一些交互式科学可视化,利用pycuda利用NVIDIA的GPU。
我目前正在考虑使用GL Interop功能,以便在我的CUDA代码修改了一个数组后,我可以立即绘制该数组,而无需经历从GPU设备到主机cpu的缓慢过程,以及然后将数据发送回GPU以显示为OpenGL纹理。
在我尝试这样做时,我一直在阅读pycuda互操作示例,例如Sobel filter和更简单的Tea Pot example。在这两个示例中,都使用了像素缓冲对象(PBO)。
据我了解,Kivy目前不支持或使用PBO,因此为了简单起见,我宁愿避免使用PBO,只是让我的CUDA功能直接在OpenGL纹理数据上运行。这可能吗?这是个坏主意吗?
我目前尝试注册可供CUDA访问的纹理的片段如下所示:
self.cuda_access = pycuda.gl.RegisteredImage(texture_id, GL_TEXTURE_2D)
self.mapping_obj = self.cuda_access.map()
self.data, self.sz = self.mapping_obj.device_ptr_and_size()
...但是在最后一行,我收到以下错误
pycuda._driver.LogicError: cuGraphicsResourceGetMappedPointer failed: resource not mapped as pointer
......我不知道该如何说服。
非常感谢提前。