【发布时间】:2013-12-28 06:01:41
【问题描述】:
好吧,我有一个简单的应用程序:我可以加载一张图片,使用双三次过滤对其进行缩放,并获得它的平均灰度副本。然后可以将它们保存为 .BMP 图像或稍后作为顶点属性处理。
主要问题是我必须处理的数据量,以及对数据数组进行操作的函数的复杂性。
假设我有一张大小为 256*256 的图片。使用双三次插值将其缩放到 2048*2048,需要 152 秒。问题不在于将数据保存到文件中,因为它需要不到一秒钟的时间。插值函数非常复杂,可以快速遍历数据集。 这个数据集不一定是图片。
所以,我想对大量数据进行快速操作,但是在 CPU 上操作非常慢。 (假设我想处理20 000 * 20 000 图片,“简单”双三次插值可能需要几个小时,而且我还没有测试法线贴图生成)。
我在 Google 上搜索过,我发现了 OpenCL(我现在使用的是 OpenGL,但我认为它非常不同)。据我了解,我可以使用它将计算移至 GPU。我还读过 OpenCV 是一个非常快的图像处理库。
停留在 GPU 上,它可以处理顶点、片段,但对于 20k * 20k 图像,没有这样的分辨率。据我所知,大多数 GPU 支持的最大分辨率为 4k*4k,但也许那是错误的。它如何在比最大分辨率更大的集合上工作(也许我的逻辑是错误的,但如果我将计算的数据(使用片段着色器)保存到纹理以在 CPU 上读回它,它就没有任何分辨率)。
GPGPU 是否类似于变换反馈,它是否比 CPU 处理更快(如果是,那么为什么)? GPU处理对CPU处理有缺点吗?我应该使用 GPU 进行什么样的任务、计算,我的意思是什么时候使用 GPU 比使用 CPU 更快?
编辑:根据我在这篇文章中的最后一个问题,我想到了一个想法:如果我的算法中有很多 if(statement)-s,将其移至 GPU 是否是个好主意?这是一个例子,也许还有更多。我有一张 ATI 卡,我必须为这些过滤编写自己的函数。
【问题讨论】:
-
152s 用于 256² 到 2048² 双三次插值听起来是一个非常低效的实现。只是说。缩放图片也是一个很容易分解为图块的问题。您不必一次处理整个图片,您可以将其拆分为更小的图块。要使双三次插值起作用,原始图片中可能的最小图块将是 4×4 图块。
-
是的,这是另一个问题。我使用它和我的着色器一样。围绕一个点的 16 个“纹理”样本,并在“行”中插值,然后在“列”中。在这个应用程序中,我使用一个函数从 1 dim 获取像素数据。数组,并且插值的工作方式相同。
-
如果你在 nVidia 上运行,也可以考虑使用 CUDA 库。
-
我有一个 ATI,但如果我切换到 GPGPU,我也想用 OpenC_ 制作它。
-
OpenGL 用于访问 GPU 的渲染管道。您正在寻找允许您在 GPU 上运行(几乎)通用程序的 OpenCL。
标签: performance parallel-processing gpu cpu gpgpu