问题类似于在M x N图像上应用滑动2D窗口最大滤镜。然而,与正常情况相反,滑动窗口不是简单地在1个像素上滑动而是在k个像素的跳跃上滑动。因此,例如,如果k = 2,则滑动窗口将水平应用于(0,0),(2,0),(4,0),...处的像素,并且类似地垂直。
对于单跳案例,CUDA NPP(性能原语)库中已经存在实现。更具体地说,这些函数称为nppiFilterMax*
。但是,我还没能找到更普遍的k-hop滑动版本。作为解决方法,我可以简单地使用NPP函数来执行单跳过滤器最大值,并简单地在相应位置选择结果,尽管这看起来很浪费且效率低下。针对此问题是否存在任何现有实施或白皮书?
答案 0 :(得分:2)
这些图像卷积函数通常是为hop == 1
设计的。当> 1
时,不同偏移量之间共享的数据较少,因此性能可能会下降。
对于hop > 1
,您可能需要编写自己的内核以获得更好的性能。您可以看到此CUDA示例“可分离卷积”以获取更多信息。
http://docs.nvidia.com/cuda/cuda-samples/index.html#cuda-separable-convolution
附带一份讨论细节的白皮书。幸运的是,最大卷积也是可分的。您将获得有关如何在此任务上编写内核的一些想法
http://docs.nvidia.com/cuda/samples/3_Imaging/convolutionSeparable/doc/convolutionSeparable.pdf