Substituir contador de loop de 32 bits por 64 bits causa estranhas variações de desempenho com _mm_popcnt_u64 em CPU Intel
Olá a todos! Estou escrevendo uma função de alto desempenho para contar bits definidos (popcount) em um grande array de inteiros de 64 bits. Uso o intrinsic `_mm_popcnt_u64` do SSE4.2. O código é simples — um loop que soma o popcount para cada elemento.
Descobri um comportamento estranho: se declarar a variável do loop como `uint32_t`, a função funciona muito rápido. Mas se substituí-la por `uint64_t` (apenas mudando o tipo de `i`), o desempenho cai quase pela metade! Testei em vários Intel Core i7 (Sandy Bridge, Haswell, Skylake) — o efeito se repete. O compilador é MSVC 2010, embora no GCC 4.6.3 o cenário seja semelhante. As otimizações estão ativadas (/O2 ou -O2).
Aqui está um exemplo mínimo de código:
```cpp
#include
#include
#include
#include
// Versão rápida com contador de 32 bits
uint64_t popcnt32(const uint64_t* data, size_t size) {
uint64_t result = 0;
for (uint32_t i = 0; i < size; ++i) { // <-- 32-bit
result += _mm_popcnt_u64(data[i
No answers yet.
Faça login para deixar uma resposta