在CPU / GPU上运行大量数据

时间:2013-12-10 16:02:27

标签: performance parallel-processing gpu cpu gpgpu

好吧,我有一个简单的应用程序:我可以加载图片,使用双三次过滤进行缩放,并获得它的平均灰度副本。它们可以保存为.BMP图像,或者稍后作为顶点属性处理。

主要问题是我必须处理的数据量,以及在数据阵列上运行的函数的复杂性。

假设我有一张尺寸为256 * 256的照片。要使用双三次插值将其缩放到2048 * 2048,需要152秒。问题不在于将数据保存到文件中,因为它只需不到一秒钟。插值函数非常复杂,可快速运行数据集。 这个数据集不一定是图片。

所以,我想快速操作大量数据,但在CPU上执行非常慢。 (说我想处理20 000 * 20 000图片,'简单'双三次插值可能需要几个小时,而我还没有测试过正常的地图生成。)

我用谷歌搜索了,我发现了OpenCL(我现在正在使用OpenGL,但我认为它非常不同)。据我了解,我可以将计算结果移动到GPU 。我也读过OpenCV是一个非常快速的图像处理库。

保持GPU,它可以处理顶点,片段,但对于20k * 20k图像,没有这样的分辨率。据我所知,大多数GPU支持4k*4k的最大分辨率,但也许这是错误的。它如何在比最大分辨率更大的集合上工作(可能我的逻辑是错误的,但如果我将计算的数据(带片段着色器)保存到纹理以在CPU上读回它,它就不能有任何分辨率。)< / p>

GPGPU是否与转换反馈类似,是否比CPU处理更快(如果是这样,为什么)? GPU处理有GPU处理缺点吗?什么样的任务,计算我应该使用GPU,我的意思是什么时候使用GPU比使用GPU更快?

编辑:根据我在本文中的最后一个问题,我想到了一个想法:如果我的算法中有很多if(statement) - s,那么将它移到GPU?这是一个例子,也许还有更多。我有一张ATI卡,我必须为这些过滤器编写自己的功能。

1 个答案:

答案 0 :(得分: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枚举。