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
No answers yet.
Inicia sesión para dejar una respuesta