2

我正在英特尔上用 C++ 开发一些图像处理软件,它必须一遍又一遍地在小(大约 1kpx)图像上运行双三次插值算法。这需要很多时间,我的目标是加快速度。我现在拥有的是一个基于文献的基本实现,一个稍微改进的(关于速度)版本,它不进行矩阵乘法,而是对插值多项式和最后一个固定的部分使用预先计算的公式矩阵乘法代码的点版本(实际上工作得更慢)。我也有一个具有优化实现的外部库,但是对于我的需求来说它仍然太慢了。我接下来考虑的是:

  • 在浮点和定点版本上使用 MMX/SSE 流处理进行矢量化
  • 使用卷积在傅里叶域中进行插值
  • 使用 OpenCL 或类似工具将工作转移到 GPU 上

这些方法中的哪一种可以产生最大的性能提升?你能推荐另一个吗?谢谢。

4

4 回答 4

5

我认为GPU是要走的路。对于这类硬件来说,这可能是最自然的任务。我将从研究CUDAOpenCL开始。像简单的 DirectX/OpenGL 像素/片段着色器这样的旧技术也应该可以正常工作。

我找到了一些链接,也许他们可以帮助你:

于 2011-01-28T16:37:59.070 回答
3

走 GPU 路线时要小心。如果你的卷积核太快,你最终会受到 IO 限制。除非您同时实现两者,否则您将无法确定哪个是最快的。

GPU Gems 2 有一章是关于快速三阶纹理过滤的,这应该是您的 GPU 解决方案的一个很好的起点。

英特尔线程构建模块和 SSE 指令的组合将是一个不错的 CPU 解决方案。

于 2011-01-28T17:00:45.657 回答
3

英特尔 IPP 库,它在内部使用 SIMD 以加快处理速度。英特尔 IPP 还使用 OpenMP,如果配置,您可以获得相对简单的多处理的好处。

这些库确实支持双三次插值并且是付费软件(您购买了开发许可证,但重新分发是免费的)。

于 2011-01-28T16:56:19.543 回答
0

不是双三次的答案,但也许是另一种选择:
如果我理解你,你有 32 x 32 xy, 1024 x 768 图像,并且想要 interpolated image[xy]
只是四舍五入 xy, image[ int( xy )], 会太粗糙。
但是等等——你可以制作一个 2k x 1.5k 的平滑双图像,一次,然后拍摄
image2[ int( 2*xy )]:更少的颗粒感,非常快。或者类似地,
image4[ int( 4*xy )]在平滑的 4k x 3k 图像中。
效果如何取决于...

于 2011-02-04T16:55:50.453 回答