Avatar ·

Substituir contador de loop de 32 bits por 64 bits causa estranhas quedas de desempenho com _mm_popcnt_u64 em CPU Intel

Olá a todos! Estou escrevendo um programa em C++ para contar bits definidos em um grande array de dados. Estou usando a intrinsic _mm_popcnt_u64 do conjunto SSE4.2. O código é simples: percorro o array de uint64_t e acumulo o resultado. Tudo funciona perfeitamente, mas notei algo estranho: se eu mudar o tipo do contador do loop de 32 bits (unsigned int) para 64 bits (size_t), o desempenho cai de 2 a 3 vezes! Os dados são os mesmos, o tamanho do array é o mesmo, o compilador é o mesmo (MSVC 2019, flags /O2 /arch:AVX2). Aqui está o código simplificado: #include #include #include #include int main() { const size_t N = 1'000'000; std::vector data(N, 0xFFFFFFFFFFFFFFFF); // todos os bits = 1 // Versão 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