Avatar ·

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