如何处理GPU的内存限制以在GPU上进行高分辨率图像处理?

12

我正在制作一个相机应用程序,该应用将为用户提供一些滤镜。目前我的代码在NDK上运行良好,但是我想让它更快一些。GPU和opengl Es 2.0似乎是更好的方向。我对GPU唯一的担忧是它们的内存限制。由于现代相机拍摄5-10mp的图像,而GPU的内存限制远低于此。我想知道是否有一种方法可以绕过这个限制。对我来说唯一合理的选择似乎是将图像分成较小的部分,然后在GPU上处理它们,最后将它们组装成最终的图像。我的问题是,如果采用这种方法,性能仍然会很好,还有没有其他选项可以在移动GPU上处理高分辨率图像。

编辑:我需要澄清的是,我想使用GPU进行图像处理,因此我的目标不是将结果渲染到屏幕上。我将其呈现到另一个纹理上并保存到磁盘。


1
这真的取决于你想做什么。GPU 提供的优势在于它们高度并行,但并不是所有问题都可以通过简单地增加核心数来变得更容易。 - thecoshman
我想得到一个通用问题的通用解决方案,但目前我正在尝试编写“拉普拉斯金字塔”的代码,这在CPU上执行时非常昂贵。 - dirhem
嗯,如果你正在做一些像是对图像应用色调的操作,其中你想要将相同的操作应用于所有位,那么将其加载到GPU中是一个显而易见的解决方案。像模糊图像这样的任务就有点棘手了,因为每个像素的新值取决于一系列像素。不过在你的情况下,你必须考虑硬件之间存在很多差异,比如它们支持多少内存、纹理有多大、你可以向它们发送多少数据等等。它们甚至可能无法进行OpenCL风格的处理。 - thecoshman
平铺也可以用于模糊 - 只需提供源数据的重叠区域,并以适当的方式拼接输出。 - Tosha
你需要绕过这个限制吗?也就是说,相机的预览帧是否真的需要全分辨率,或者在捕获全分辨率的最终图像的同时,可以使用较低分辨率的预览帧来完成任务? - Error 454
我不会使用GPU将结果渲染到屏幕上,而是会用它来在另一个纹理上渲染结果。我正在使用拉普拉斯和高斯金字塔混合三个全分辨率图像。由于这是一个相机应用程序(HDR应用程序),用户希望它能够在全分辨率下工作。我想使用GPU,因为它对于这种操作速度更快,NVIDIA声称GPU在拉普拉斯金字塔操作中的速度比CPU快10倍。这里是他们所说的论文链接。 - dirhem
2个回答

2

你的平铺(tiling)想法自任天堂娱乐系统以来就被使用了,该系统采用了1.79 MHz的Ricoh 2A03芯片,因此这是一个好方法。Google使用平铺来管理地图显示,甚至像Crysis这样的游戏也倾向于将大部分纹理的大小限制在1024x1024(1百万像素)左右。是的,10百万像素需要30兆字节的RAM,因此一些设备可能会遇到问题,特别是如果您同时使用源和目标纹理,则需要60兆字节的RAM。

请记住,纹理大小往往使用2的幂次方(2、4、8、16、32、64等)。如果您将其切割并平铺图像,则有时可以获得更好的质量。


2
您不需要将实时滤镜应用于10 MP的图像中,因为我们没有这样的显示器(或者可能有,但不是我们常用的)。 :)
因此,您只需要在正在显示的像素上应用过滤器(1900x1280?)。您提到的平铺技术在某些情况下仍然有用。延迟渲染就是这样一个例子。X-Box 360每天都使用两种技术(平铺和延迟渲染)。如果没有平铺,由于延迟技术对内存的高要求,这是不可能的。

我编辑了问题以澄清我不会使用GPU将图像渲染到屏幕上。我与屏幕及其分辨率完全无关。图像处理将在后台完成,屏幕仅显示进度条。因此,对于我来说,GPU内存限制仍然存在。 - dirhem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接