并行计算奇偶校验
Calculating parity in parallel
>请考虑以下代码
typedef unsigned uint;
uint parity( uint64_t x )
{
uint32_t v = x ^ (x >> 32);
v ^= v >> 16;
v ^= v >> 8;
v ^= v >> 4;
v ^= v >> 2;
return (uint)(v ^ (v >> 1)) & 1;
}
有没有办法从根本上重新组织此代码,以由于英特尔 x86-64 机器上的指令级并行性而获得重大改进?
GCC 生成了以下代码
parity(unsigned long):
mov rax, rdi
shr rax, 32
xor eax, edi
mov edi, eax
shr edi, 16
xor eax, edi
mov edi, eax
shr edi, 8
xor eax, edi
mov edi, eax
shr edi, 4
xor eax, edi
mov edi, eax
shr edi, 2
xor eax, edi
mov edx, eax
shr eax
xor eax, edx
and eax, 1
ret
在 32 位世界中,我会直接在汇编程序中编写类似 test eax,eax
的东西,后跟 SETPO EAX
。
更新 2017-02-06:@EOF是正确的,测试命令仅根据低字节设置奇偶校验位。
相关文章:
- 如何用尽可能少的数据将数据缓冲区计算为零校验和值
- 计算校验和的逐位运算符
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 如何在 c++ 中计算对象的哈希/校验和/指纹?
- 此代码如何计算数字的奇偶校验?
- C++文件传输的校验和算法
- 如何从 IP 校验和字段中计算十六进制值
- 计算句子的校验和(XOR)(由不同变量/类型的组合形成)
- 目录校验和
- 按奇偶校验对数组进行排序 结果并不可靠
- 这是确定两个数字是否具有相同奇偶校验的正确方法
- 并行计算奇偶校验
- 串行端口奇偶校验检查在升压 asio 中失败
- 将C++串口奇偶校验更改代码从 Linux 移植到 Windows
- 有效地检查整数的奇偶性
- 这个代码如何使用64位乘法和模除法计算字节的奇偶校验
- 在 int 变量中查找 '1 数的奇偶校验
- 是否可以使用boost.asio实现标记和空间奇偶校验?
- 十进制奇偶校验
- CRC/奇偶校验/汉明保护16位并行总线