【发布时间】:2011-06-17 08:53:50
【问题描述】:
我正在英特尔上用 C++ 开发一些图像处理软件,它必须一遍又一遍地在小(大约 1kpx)图像上运行双三次插值算法。这需要很多时间,我的目标是加快速度。我现在拥有的是一个基于文献的基本实现,一个稍微改进的(关于速度)版本,它不进行矩阵乘法,而是对插值多项式和最后一个固定的部分使用预先计算的公式矩阵乘法代码的点版本(实际上工作得更慢)。我也有一个具有优化实现的外部库,但对于我的需求来说它仍然太慢。我接下来考虑的是:
- 在浮点和定点版本上使用 MMX/SSE 流处理进行矢量化
- 使用卷积在傅里叶域中进行插值
- 使用 OpenCL 或类似工具将工作转移到 GPU 上
这些方法中的哪一种可以产生最大的性能提升?你能推荐另一个吗?谢谢。
【问题讨论】:
-
我们说的有多慢?慢是因为您多次执行相对较快的操作,还是因为它比您预期的慢很多?
-
我想它比较快,但我需要做很多次。外部库大约需要 27us(使用 SSE),我最好的实现大约需要 50us。
-
如果你使用GPU,你如何处理算法的输出,你是否需要回到主内存,这本身可能是一个瓶颈?
-
你指的这个“外部库”是什么? 1k px 图像也是 100x10 还是 1000x1000?
-
我使用的库是OpenCV。至于图像的大小,我的意思是总共 1000 像素。它们通常是正方形的,大小为 32x32。
标签: c++ performance image-processing interpolation bicubic