并行计算奇偶校验

Calculating parity in parallel

本文关键字:偶校验 奇偶 并行计算      更新时间:2023-10-16

>请考虑以下代码

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是正确的,测试命令仅根据低字节设置奇偶校验位。