我在图像数据上使用了5交叉中值滤波器的变体 在一个小的嵌入式系统上,即
x
x x x
x
算法非常简单,读取5个值,得到最高2 并对这些进行一些计算并回写结果。
5个输入值均在0-20范围内。计算值也在0-20范围内!
我试图找出是否可以使用查找表来加速 事情,但我没有生成一个我可以使用的密钥。
举个例子,考虑输入是否在0-5范围内, 生成唯一键的一种方法是获取二进制 表示和只是连接数字,即
101 101 101 101 101
key = x[0] | x[1] << 3 | x[2] << 6 | x[3] << 9 | x[4] << 12
但LUT很大,约有23,000件物品。
由于[5,0,0,0,5]
与[5,0,5,0,0]
一样简化
可以使用2个LUT,
LUT1 = [0, 1, 6, 31, 156, 781]
每个项目的数量超过5的最大总和 以前的元素
然后密钥可以计算为(使用python语法)
key = sum([LUT1[x[0]], LUT1[x[1]], LUT1[x[2]],
LUT1[x[3]], LUT1[x[4]a]])
但同样,这种方法不能扩展到0-20的范围 每个元素。
使用如上所述的分拣网络 Fastest sort of fixed length 6 int array 没有改善表现;我只对2感兴趣 最高价值。
那么,是否可以从五个正面创建一个唯一的密钥 0-20范围内的整数,可用作a的索引 LUT?
答案 0 :(得分:1)
免责声明:这不是一般解决方案。
我有类似的问题,并以这种方式解决:
1)在5个值中的每个值(至少21位,因此需要32位变量)的位掩码中设置一个位。
2)如果该位已设置(=重复值),则索引变量(初始化为-1)将设置为该值,如果它小于该值。
3)N 属于&#34;不是一般&#34;解决方案,因为它的性能取决于非常快速的位扫描指令的可用性(例如x86有一个):找到最高位集。它的指数是该货币对的第一个值。
4)如果它等于&#34;重复值&#34;变量,那么第二个值也是这个。
5)否则,该货币对的第二个价值是第二个最高位的指数。
6)现在你有一对0到20之间的值,我认为21x21的查找表足够小。
粗鲁的代码:
int dup = -1;
uint_32 m = 0;
uint_32 vm;
int i;
for (i = 0; i < 5; ++i) {
vm = 1 << val[i];
if ((m & vm) && (dup < val[i])) {
dup = val[i];
}
else {
m |= vm;
}
}
// Now the part that needs a very fast "get higest bit" function
top[0] = get_higest_bit(m);
if (top[0] == dup) {
top[1] = top[0];
}
else {
m &= ~(1 << top[0]);
top[1] = get_higest_bit(m);
}
编辑:此外,面向比特的运算符(&lt;&lt; etc ...)必须足够快。 X86 / x64符合此要求。不保证在不同的cpu。但至少表达&#34; 1&lt;&lt; X&#34;可以通过多种方式进行优化。