Désoptimisation d'un programme pour le pipeline dans les processeurs Intel de la famille Sandybridge
Introduction
Le La tâche consiste à réduire l'efficacité d'un programme de simulation Monte-Carlo en exploitant l'architecture du processeur Intel Sandybridge. Ce processeur dispose d'un pipeline hors service avec des fonctionnalités telles que le renommage des registres et la mise en mémoire tampon, ce qui rend difficile la réduction du parallélisme au niveau des instructions (ILP) et l'introduction de dangers.
Analyse du programme
Le programme est une simulation Monte-Carlo qui calcule le prix des options call et put vanille européennes. Les composants clés du programme sont :
- Une boucle qui itère un nombre de fois spécifié
- Génération de nombres aléatoires gaussiens
- Formule de tarification des options Black-Scholes
Techniques d'optimisation
Ce qui suit des techniques peuvent être utilisées pour réduire l'efficacité du programme :
-
Fausses dépendances : Introduire des dépendances inutiles entre les instructions pour augmenter les blocages à risque.
-
Glots d'étranglement de mémoire : Provoquer des échecs de cache et des retards d'accès à la mémoire en alignant mal les données ou en utilisant un accès à la mémoire non contigu modèles.
-
Instructions retardées :Utilisez des instructions qui ont des latences plus longues et peuvent être retardées par le pipeline.
-
Opérations moins efficaces :Utilisez des modèles moins efficaces opérations mathématiques comme la division au lieu de la multiplication.
-
Erreur de prédiction des branches : Présenter branches imprévisibles pour provoquer des vidages de pipeline.
-
Décrochages de transfert de magasin : Utilisez des techniques telles que le XORing des octets élevés de doubles pour provoquer des blocages de transfert de magasin.
-
Cache d'instructions miss : Divisez les routines en petits morceaux pour créer un cache d'instructions manque.
Suggestions spécifiques
Sur la base des techniques ci-dessus, voici quelques suggestions spécifiques pour pessimiser le programme :
- Utilisez std::atomic pour les compteurs de boucles et les désaligner.
- Induire un faux partage entre les variables non atomiques.
- Multi-thread avec un seul std::atomiccompteur de boucles partagé.
- Réécrire les expressions avec des équivalents associatifs/distributifs pour augmenter travail.
- Utilisez les fonctions intrinsèques avec précaution pour éviter les blocages du pipeline.
- Utilisez l'assemblage en ligne pour diviser le cache uop.
- Utilisez CPUID/RDTSC pour chronométrer chaque itération et induire la sérialisation. .
- Parcourez les tableaux dans un ordre non contigu et utilisez des tableaux avec remplissage et mal alignés éléments.
- Utilisez la précision double au lieu de float pour augmenter la latence.
- Forcez les conversions d'entier en flottant et inversement.
-
Désactivez les optimisations du compilateur avec -O0 et utilisez -march=i386 pour des instructions plus lentes.
- Définissez fréquemment l'affinité du processeur sur différents processeurs.
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