Avatar ·

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