Avatar ·

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