Remplacement d'un compteur de boucle 32 bits par un 64 bits provoque d'étranges baisses de performance avec _mm_popcnt_u64 sur CPU Intel
Bonjour à tous ! J'écris un programme en C++ pour compter les bits unitaires dans un grand tableau de données. J'utilise l'intrinsèque intégrée _mm_popcnt_u64 de l'ensemble SSE4.2. Le code est simple : je parcours le tableau de uint64_t et j'accumule le résultat.
Tout fonctionne parfaitement, mais j'ai remarqué une chose étrange : si je change le type du compteur de boucle de 32 bits (unsigned int) à 64 bits (size_t), la performance chute de 2 à 3 fois ! Pourtant les données sont les mêmes, la taille du tableau est la même, le compilateur est le même (MSVC 2019, flags /O2 /arch:AVX2).
Voici le code simplifié :
#include
#include
#include
#include
int main() {
const size_t N = 1'000'000;
std::vector data(N, 0xFFFFFFFFFFFFFFFF); // tous les bits = 1
// Version 1 : compteur 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