[英]There must be a really fast way to calculate this bitwise expression?
设v和w是两个位串。 在当前的应用中,它们由8位组成。 我正在寻找计算以下表达式的最快方法。
x = (v[1] & w[0]) ^ (v[2] & w[1]) ^ (v[2] & w[0]) ^ (v[3] & w[2]) ^ (v[3]) & w[1]) ^ (v[3] & w[0]) ^ ...
关于这个主题的一些想法:我注意到的一件事是这个表达式也可以写成如下。 让
P(w[k]) = w[k] ^ w[k-1] ^ ... ^ w[0]
表示w的最低k + 1
位的奇偶校验。 然后
x = (v[1] & P(w[0])) ^ (v[2] & P(w[1])) ^ (v[3] & P(w[2])) ^ ... ^ (v[7] & P(w[6]))
现在,如果Pw
是一个位串,其中每个位表示低位的奇偶校验,即Pw[i] = P(w[i-1])
那么x
可以写成如下:
x = P(v & Pw)
现在,在http://graphics.stanford.edu/~seander/bithacks.html上我找到了一种快速计算字符串奇偶校验的方法,但为了构建一个基于此的快速算法,我还需要一个快速的计算上述位串Pw
。
或许我完全以错误的方式解决这个问题,有很多奇偶校验计算要做到这一点。 如果这确实是要走的路,我想知道是否有可能(假设程序将在x86上运行)在程序集中使用奇偶校验标志来加速计算。
最后,这将是我正在开发的应用程序中需要很多的计算,因此速度确实是真正的。 我想知道是否可以在寄存器中进行整个计算,如果这可能比在内存中创建查找表更快。
如果v和w真的是8位,那么你可以预先计算所有256 ^ 2组合并将结果存储在65K字节的表中。 这很容易适应缓存。 然后你的计算成为:
precomputed[v<<8+w]
这是一些机器时钟和热缓存行查找。 可能很难被击败。
在x86上,自动计算奇偶校验位以进行低8位算术运算。 基本上所需的操作减少到:
Pw = Lookup_256[w];
v &= Pw; // get the Parity as side effect on x86, or
v = Lookup_256[v] >> 7; // Reuse the table to get parity for bit 7
编辑
通过识别部分乘积(v [i]&w [j])是乘法的内部部分并且与运算符^
的连接使得该整体操作无进位(或多项式),可以实现更高级别的优化和并行实现。
整体操作将是奇偶校验(((v >> 1)Px w)&0xff),其中Px表示多项式乘法,其在例如NEON和具有PCLMULQDQ指令的英特尔架构中受支持。 英特尔指令(不幸的是)以64位字运行,这可能是可能的,但很难将几个独立的向量v,w同时相乘。
也许是这样的事情?
register int v, w, parity=0;
/* ... */
v >>= 1; /* Discard lsb? */
while (v) {
parity ^= v ^ w;
w = (w & 1) ^ (w >> 1);
v >>= 1;
}
parity &= 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.