我正在尝试在Neon中实现直方图。是否有可能进行矢量化?
答案 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,这个链接上有一些论文讨论了如何对直方图函数进行矢量化:
答案 2 :(得分:1)
一些处理直方图的图像处理算法(例如均衡,直方图匹配)可以使用已知的百分位数 - 对于近似值,可以有效地将搜索并行化到消耗的初始范围(0,25,50,75,100%) 4个累加器。
输入流中的每个项目必须与所有插槽并行比较,从而增加频率。在一定数量的轮次之后(例如,n * 255轮确保uint8_t数据类型没有溢出,然后将其累加到uint16_t),基于线性插值重新计算每个槽中的最小/最大限制。当然,根据估计新数据改变了百分位数的估计值,重新运行序列是可能的。
算法将是评估顺序的变体,可以通过随机抽样和多次传递来缓解。