在SIMD中矢量化直方图的方法?

时间:2012-10-20 06:38:37

标签: image-processing arm histogram simd neon

我正在尝试在Neon中实现直方图。是否有可能进行矢量化?

3 个答案:

答案 0 :(得分:6)

不幸的是,直方图几乎不可能进行矢量化。

然而,你可以稍微优化标量代码 - 一个常见的技巧是使用两个直方图然后在最后组合它们。这允许您重叠加载/增量/存储,从而掩盖一些串行依赖关系和相关的延迟。伪代码:

init histogram 1 to all 0s
init histogram 2 to all 0s
loop
  get input value 1
  get input value 2
  load count for value 1 from histogram 1
  load count for value 2 from histogram 2
  increment count for histogram 1
  increment count for histogram 2
  store count for value 1 to histogram 1
  store count for value 2 to histogram 2
until done
combine histogram 1 and histogram 2

答案 1 :(得分:2)

@ Paul-R,这个链接上有一些论文讨论了如何对直方图函数进行矢量化:

SIMD Vectorization of Histogram Functions

答案 2 :(得分:1)

一些处理直方图的图像处理算法(例如均衡,直方图匹配)可以使用已知的百分位数 - 对于近似值,可以有效地将搜索并行化到消耗的初始范围(0,25,50,75,100%) 4个累加器。

输入流中的每个项目必须与所有插槽并行比较,从而增加频率。在一定数量的轮次之后(例如,n * 255轮确保uint8_t数据类型没有溢出,然后将其累加到uint16_t),基于线性插值重新计算每个槽中的最小/最大限制。当然,根据估计新数据改变了百分位数的估计值,重新运行序列是可能的。

算法将是评估顺序的变体,可以通过随机抽样和多次传递来缓解。