Avatar ·

Reemplazar un contador de bucle de 32 bits por uno de 64 bits causa extrañas caídas de rendimiento con _mm_popcnt_u64 en CPU Intel

¡Hola a todos! Estoy escribiendo un programa en C++ para contar bits individuales en un gran array de datos. Utilizo la intrinsic _mm_popcnt_u64 del conjunto SSE4.2. El código es simple: recorro el array de uint64_t y acumulo el resultado. Todo funciona perfectamente, pero noté algo extraño: si cambio el tipo del contador del bucle de 32 bits (unsigned int) a 64 bits (size_t), el rendimiento cae 2-3 veces. ¡Y eso que los datos son los mismos, el tamaño del array es el mismo, el compilador es el mismo (MSVC 2019, flags /O2 /arch:AVX2)! Aquí está el código simplificado: #include #include #include #include int main() { const size_t N = 1'000'000; std::vector data(N, 0xFFFFFFFFFFFFFFFF); // todos los bits = 1 // Versión 1: contador de 32 bits unsigned int sum32 = 0; auto t1 = std::chrono::high_resolution_clock::now(); for (unsigned int i = 0; i < data.size(); ++i) { sum32 += _mm_popcnt_u64(data[i]); } auto t2 = std::chrono::high_resolution_clock::n