【问题标题】:Operating on large amounts of data on CPU/GPU [closed]在 CPU/GPU 上处理大量数据 [关闭]
【发布时间】: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


【解决方案1】:

如果您必须自己实现它,需要注意的一件事是填充和正确的边界处理。除此之外,它应该是一个相当简单的实现,其中一个线程组可以完成图像的一个图块。

你说你有一个 AMD 设备,所以你想看看AMD's OpenCL introduction

如果您可以使用库并且您拥有支持 CUDA 的设备,则可以简单地使用 NPPnppiResize 函数。它有两个版本,一个用于一通道和一个用于四通道(如果需要,可以将三通道图像转换为四通道图像)。但是,它仅支持每通道 8 位。你可以在NPP documentation找到它。

声明为:NppStatus nppiResize_8u_C1R (const Npp8u pSrc, NppiSize oSrcSize, int nSrcStep, NppiRect oSrcROI, Npp8u pDst, int nDstStep, NppiSize dstROISize, double xFactor, double yFactor, int eInterpolation)

您可以将eInterpolation 的值设置为NPPI_INTER_CUBIC。其他可能的值在 NppiInterpolationMode 枚举中。

【讨论】:

  • NPP 看起来不错,但我有 ATI 卡,我喜欢使用 ATI 产品。我也忘了写,但我必须自己实现过滤功能。我会看看声明。 +1
  • 糟糕。我一定是看错了那个。无论哪种方式都不能太难。祝你好运!
  • 嗯。将带有图块的过滤代码移动到不同的线程对于如此大的图像来说是个好主意!
  • 您希望一个线程组在一个磁贴上工作,以增加您组内的数据局部性。
  • 确保使用笔和纸来绘制索引方案的轮廓。图片说一千多个字;)
猜你喜欢
  • 2018-09-10
  • 2018-05-26
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多