2011-06-09 195 views
2

我正在处理一组(大2k x 2k)图像
我需要对每个像素进行一系列操作,这些操作需要一些连续的图像。CUDA 2D或3D阵列

对使用​​单个2D大纹理+计算偏移量还是使用3D数组有什么意见?

在CUDA API中,3D阵列似乎有点不在主流中,分配传递函数与2D功能有很大不同。

似乎有没有要上更高级别的任何好的文档“如何以及为什么” CUDA的而不是具体的调用

还有就是best practices guide,但它并没有解决这个

+0

你是在读图像多次?否则使用纹理似乎有点多.. – 2011-06-09 17:40:17

+0

@帕万我扔视频序列卡,并做一些图像处理,然后渲染处理的视频。使用opengl PBO似乎是最简单的方法 – 2011-06-09 17:43:51

+0

我个人避免使用纹理,主要是因为他们的文档不好。绑定和解除绑定纹理也需要很长时间。虽然我不能评论使用cuda纹理和opengl PBO。 – 2011-06-09 17:52:57

回答

6

我会建议你阅读“Cuda by Example”一书。它贯穿所有这些没有记录的事情,它会解释“如何和为什么”。

我想你应该使用什么,如果你渲染的CUDA内核的结果是使用OpenGL互操作。这样,您的代码就可以在GPU上处理图像,并将处理后的数据保留在那里,从而使渲染速度更快。这本书中有一个很好的例子。

如果每个CUDA线程只需要从第一帧读取一个像素,并从下一帧读取一个像素,则不需要使用纹理。如果每个线程正在读取一堆连续的像素,则纹理仅对您有益。所以你最好使用3D阵列。

+0

我读过它,但3D阵列是一个新功能,不在本书中讨论。使用纹理使openGL互操作变得更容易,大多数图像处理例程无论如何都访问相邻像素。 – 2011-06-09 22:00:10

+0

当然,使用纹理没有问题。如果你打算使用少量的帧,那么你可以定义多个1D或2D纹理纹理。你提到你正在做帧到帧的事情,所以你只需要2个纹理,比如纹理A和B.你将帧1和帧2加载到A和B中,然后你的内核处理A和B.然后你简单地替换第1帧与第3帧,然后你的内核将处理纹理B和A(按照该顺序),这相当于处理第2帧和第3帧。 – r2jitu 2011-06-10 01:03:18

+0

@ r2jitsu - 这就是我所做的。 cuda对纹理阵列的支持很差,而且3D令人困惑,所以我只是将纹理的高度提高了N倍,并对待处理的帧进行了处理。 – 2011-06-10 02:08:52