Désoptimisation d'un programme pour le pipeline dans les processeurs Intel de la famille Sandybridge
Problème :
La mission consiste à introduire des inefficacités dans un programme donné pour ralentir sa vitesse d'exécution. Le programme est une simulation de Monte Carlo utilisant des nombres aléatoires gaussiens et l'accent est mis sur l'exploitation de la structure de pipeline des processeurs Intel de la famille Sandybridge.
Solution :
Présentation des inefficacités face aux risques liés aux pipelines :
-
Utilisation opérations atomiques avec barrières de chargement de stockage : Les opérations atomiques répétées sur des variables partagées créent des dépendances de mémoire qui bloquent le pipeline. De plus, les barrières de chargement du magasin forcent l'exécution sérialisée des opérations de mémoire.
-
Créez un faux partage : Assurez-vous que plusieurs threads accèdent à des emplacements de mémoire adjacents dans différentes lignes de cache, provoquant des conflits et des invalidations de banques de cache.
-
Utilisez des modèles d'accès à la mémoire irréguliers : Évitez les accès séquentiels à la mémoire pour empêcher une prélecture et une utilisation efficaces du cache. Par exemple, accédez aux éléments dans un ordre non contigu ou utilisez des listes chaînées au lieu de tableaux.
Affaiblissement du parallélisme au niveau de la boucle :
-
Sérialiser les itérations de boucle : Utilisez des mécanismes de synchronisation tels que des verrous ou des incréments atomiques pour garantir qu'un seul thread exécute chaque boucle itération à la fois.
-
Introduisez des branches imprévisibles : Incluez les branches difficiles à prédire pour le prédicteur de branche, provoquant des erreurs de prédiction et des vidages de pipeline lorsque le mauvais chemin est emprunté.
-
Utilisez des opérations inefficaces : Remplacez les opérations arithmétiques efficaces par des alternatives plus lentes, telles que la division au lieu de la multiplication ou la racine carrée à la place de multiplication et de multiplication de constantes au lieu de logarithmes et de fonctions exponentielles.
Exploiter les caractéristiques microarchitecturales :
-
Provoquer des déversements et des remplissages inutiles de registre : Utilisez de nombreuses variables locales et de grandes structures de données, forçant les opérations de déversement et de remplissage à mémoire.
-
Utilisez des instructions inefficaces : Utilisez des instructions qui entraînent des blocages importants ou réduisent le parallélisme au niveau des instructions, telles que des accès mémoire non alignés ou des opérations 16 bits en mode 32 bits.
-
Contestez les ressources de cache : Créez des échecs de cache excessifs en accédant simultanément à plusieurs tableaux ou structures de données, en utilisant modèles d'accès à la mémoire non contigus ou invalidation explicite des lignes de cache à l'aide d'instructions telles que CLFLUSH.
Évitement de l'optimisation du compilateur :
-
Utiliser l'assembly en ligne : Contourner les optimisations du compilateur en utilisant l'assembly en ligne pour contrôler manuellement la génération d'instructions et éviter les transformations de code respectueuses du cache.
-
Utiliser un comportement non défini : Effectuer des opérations susceptibles de provoquer un comportement inattendu ou de générer du code inefficace, telles que l'arithmétique de pointeur sur des types non pointeurs ou une mémoire non initialisée accès.
-
Forcer les recompilations inutiles : Modifiez le code d'une manière qui nécessite une recompilation, comme l'ajout de commentaires ou la modification de macros, pour invalider les chemins de code mis en cache et réduire l'efficacité des optimisations du compilateur.
Conclusion :
En incorporant ces inefficacités dans le programme, il est possible de ralentir considérablement sa vitesse d'exécution et de souligner l'importance de l'optimisation du code pour les architectures de pipeline modernes. Cependant, il est important de noter que ces techniques ne sont pas destinées à une utilisation pratique dans des applications réelles et visent uniquement à illustrer les impacts potentiels d'une mauvaise optimisation sur les performances.
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!