如何才能最好地改善双三次插值算法的执行时间?

时间:2011-01-28 16:34:37

标签: c++ performance image-processing interpolation bicubic

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

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

哪种方法可以带来最大的性能提升?你能建议另一个吗?感谢。

4 个答案:

答案 0 :(得分:5)

我认为GPU是可行的方法。对于这种类型的硬件来说,这可能是最自然的任务。我首先考察CUDAOpenCL。像简单的DirectX / OpenGL像素/片段着色器这样的旧技术也可以正常工作。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

小心走GPU路线。如果你的卷积内核太快,你将最终成为IO绑定。除非你同时实施,否则你不确定哪个是最快的。

GPU Gems 2有一章Fast Third-Order Texture Filtering,它应该是GPU解决方案的一个很好的起点。

Intel Threading Building Blocks和SSE指令的组合将成为一个不错的CPU解决方案。

答案 3 :(得分:0)

不是双三次的答案,但可能是另一种选择:
如果我理解你,你有32 x 32 xy,1024 x 768图像,并且想要插值image[xy]
只是围绕xy,image[ int( xy )],会太粗糙 但是等等 - 你可以制作一个平滑的双重图像2k x 1.5k,一次,然后取 image2[ int( 2*xy )]:不那么颗粒感,非常快。或者类似地,
在平滑的4k x 3k图像中image4[ int( 4*xy )] 这种效果如何取决于......