我正在开发一些英特尔的C ++图像处理软件,它必须一次又一次地在小(约1kpx)图像上运行双三次插值算法。这需要花费很多时间,我的目标是加快速度。我现在所拥有的是一个基于文献的基本实现,一个稍微改进的(关于速度)版本,它不进行矩阵乘法,而是使用预先计算的插值多项式部分的公式,最后一个,固定的矩阵乘法码的点版本(实际上工作得慢)。我还有一个带有优化实现的外部库,但它对我的需求来说仍然太慢了。我接下来要考虑的是:
哪种方法可以带来最大的性能提升?你能建议另一个吗?感谢。
答案 0 :(得分:5)
我认为GPU是可行的方法。对于这种类型的硬件来说,这可能是最自然的任务。我首先考察CUDA或OpenCL。像简单的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 )]
这种效果如何取决于......