Reemplazo del contador de bucle de 32 bits por 64 bits causa extrañas caídas de rendimiento con _mm_popcnt_u64 en CPU Intel
¡Hola a todos! Estoy escribiendo una función de alto rendimiento para contar bits (popcount) en un gran array de enteros de 64 bits. Uso el intrinsic `_mm_popcnt_u64` de SSE4.2. El código es simple: un bucle que suma el popcount de cada elemento.
Encontré un comportamiento extraño: si declaro la variable del bucle como `uint32_t`, la función funciona muy rápido. Pero si la cambio a `uint64_t` (simplemente cambiando el tipo de `i`), el rendimiento cae casi a la mitad. Lo probé en varios Intel Core i7 (Sandy Bridge, Haswell, Skylake) y el efecto se reproduce. El compilador es MSVC 2010, aunque en GCC 4.6.3 ocurre algo similar. Las optimizaciones están activadas (/O2 o -O2).
Aquí hay un ejemplo mínimo de código:
```cpp
#include
#include
#include
#include
// Versión rápida con 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