Le remplacement d'un compteur de boucle 32 bits par un compteur 64 bits provoque d'étranges sauts de performance avec _mm_popcnt_u64 sur les CPU Intel
Bonjour à tous ! J'écris une fonction haute performance pour compter les bits unitaires (popcount) dans un grand tableau d'entiers 64 bits. J'utilise l'intrinsèque `_mm_popcnt_u64` de SSE4.2. Le code est simple — une boucle qui additionne le popcount pour chaque élément.
J'ai découvert un comportement étrange : si je déclare la variable de boucle comme `uint32_t`, la fonction fonctionne très rapidement. Mais si je la remplace par `uint64_t` (en changeant simplement le type de `i`), la performance chute de près de moitié ! J'ai testé sur plusieurs Intel Core i7 (Sandy Bridge, Haswell, Skylake) — l'effet se reproduit. Le compilateur est MSVC 2010, bien que sur GCC 4.6.3, le tableau soit similaire. Les optimisations sont activées (/O2 ou -O2).
Voici un exemple de code minimal :
```cpp
#include
#include
#include
#include
// Version rapide avec un compteur 32 bits
uint64_t popcnt32(const uint64_t* data, size_t size) {
uint64_t result = 0;
for (uint32_t i = 0; i < size; ++i) { // <-- 32-bit
result += _mm_popcnt_u64(data[i