Betrachten Sie den folgenden CodeBerechnung Parität 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;
}
Gibt es eine Möglichkeit radikal diesen Code neu zu organisieren eine ernsthafte Verbesserung aufgrund Instruction-Level Parallelität auf etwa ein Intel x86-64 Maschine zu bekommen?
GCC erzeugt den folgenden Code
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
Was ist '(uint) v'? –
Wenn Sie SSE4.2 haben: 'return _mm_popcnt_u64 (x) & 1;' – Mysticial
Ich habe über Popcnt vergessen - vielen Dank. –