Maison >développement back-end >C++ >Pourquoi le changement d'un compteur de boucles de 32 bits à 64 bits a-t-il un impact considérable sur les performances _mm_popcnt_u64 sur les processeurs Intel ?

Pourquoi le changement d'un compteur de boucles de 32 bits à 64 bits a-t-il un impact considérable sur les performances _mm_popcnt_u64 sur les processeurs Intel ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-17 01:00:25834parcourir

Why Does Changing a Loop Counter from 32-bit to 64-bit Dramatically Impact _mm_popcnt_u64 Performance on Intel CPUs?

Le remplacement d'un compteur de boucle 32 bits par 64 bits introduit des écarts de performances fous avec _mm_popcnt_u64 sur les processeurs Intel

Résumé du problème

Les performances d'un benchmark popcount variaient considérablement lorsque la variable du compteur de boucles passait de 32 bits non signés à 64 bits non signés, bien que le changement ne semble pas affecter le fonctionnement de base de la boucle.

Question

  1. Pourquoi y a-t-il un tel une différence de performances entre l'utilisation d'un compteur de boucles 32 bits et 64 bits ?
  2. Comment le remplacement d'une taille de tampon non constante avec une valeur constante conduit à un code plus lent ?
  3. Comment l'ajout du mot-clé 'static' à la variable de taille du tampon rend-il la boucle 64 bits plus rapide ?

Réponse

1. La différence de performances est due à une fausse dépendance de données dans l'instruction popcnt sur les processeurs Intel.

Lorsque le compteur de boucle est de 32 bits, les instructions popcnt de chaque itération de boucle sont exécutées indépendamment, ce qui permet un fonctionnement parallèle exécution. Cependant, lorsque le compteur de boucles est de 64 bits, une fausse dépendance de données est introduite entre les instructions popcnt, rendant impossible leur exécution en parallèle. Cette dépendance est causée par la réutilisation du registre de destination de l'instruction popcnt pour l'itération suivante, créant une dépendance artificielle qui limite les performances.

2. Remplacer une taille de tampon non constante par une valeur constante peut ralentir le code car cela empêche le compilateur d'effectuer certaines optimisations.

Avec une taille de tampon constante, le compilateur connaît la taille exacte du tampon au moment de la compilation, ce qui peut permettre des modèles d'accès à la mémoire et une planification des instructions plus efficaces. Cependant, avec une taille de tampon non constante, le compilateur doit assumer le pire des cas, ce qui peut conduire à un code moins optimisé.

3. L'ajout du mot-clé 'static' à la variable de taille du tampon rend la boucle 64 bits plus rapide car cela fait de la taille du tampon une constante au moment de la compilation, permettant au compilateur d'effectuer des optimisations supplémentaires.

En faisant le la taille du tampon est une constante au moment de la compilation, le compilateur peut optimiser de manière plus agressive les modèles d'accès à la mémoire et la planification des instructions, ce qui entraîne un code plus rapide.

Leçons Appris

Même de petits changements dans une boucle peuvent avoir un impact significatif sur les performances en raison de dépendances inattendues ou d'optimisations du compilateur. Il est important de comprendre ces dépendances et comment elles affectent les performances pour écrire du code efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn