Maison > développement back-end > C++ > Comment une simulation Monte Carlo peut-elle être davantage désoptimisée pour ralentir considérablement l'exécution sur un processeur Intel de la famille Sandybridge ?

Comment une simulation Monte Carlo peut-elle être davantage désoptimisée pour ralentir considérablement l'exécution sur un processeur Intel de la famille Sandybridge ?

DDD
Libérer: 2024-11-29 00:57:10
original
948 Les gens l'ont consulté

How Can a Monte Carlo Simulation Be Further Deoptimized to Significantly Slow Down Execution on an Intel Sandybridge-Family CPU?

Déoptimisation d'un programme pour le pipeline dans les processeurs Intel de la famille Sandybridge

Objectif : Pessimiser un programme pour qu'il s'exécute plus lentement, en exploitant la connaissance de l'Intel i7 pipeline.

Problème :

La mission prévoyait deux options : les programmes Whetstone ou Monte-Carlo. L'étudiant a choisi le programme de simulation Monte-Carlo, mais ses efforts de pessimisation n'ont fait qu'augmenter le temps d'exécution du code d'une seconde.

Question :

Comment l'étudiant peut-il pessimiser davantage le code pour obtenir un résultat plus significatif ralentissement ?

Réponse :

Stratégies générales :

  • Introduire des branches imprévisibles pour augmenter les pénalités de mauvaise interprétation.
  • Rallonger les chaînes de dépendances portées par des boucles pour réduire le niveau d'instruction parallélisme.
  • Utilisez des opérations et des divs FP plus lents, en particulier les fonctions exp et log.

Idées spécifiques à Uarch :

Avec des intrinsèques () :

  • Utilisez movnti pour expulser les données du cache.
  • Utilisez des mélanges d'entiers entre les opérations mathématiques FP pour provoquer des retards de contournement.
  • Évitez de mélanger les instructions SSE et AVX sans utiliser vzeroupper.

Avec asm (en ligne) :

  • Forcer les problèmes d'alignement pour briser le cache uop.
  • Utiliser auto- modifier le code pour déclencher l'effacement du pipeline.

Induire des échecs de cache et de la mémoire Ralentissements :

  • Effectuez des magasins étroits pour provoquer des blocages de transfert de magasin.
  • Remplacez les variables locales par des membres d'une grande structure pour contrôler la disposition de la mémoire.
  • Organisez la disposition de la mémoire pour augmenter les échecs de cache et les chargements fractionnés.
  • Utilisez des variables mal alignées pour couvrir limites de ligne de cache ou de page.
  • Bouclez sur des tableaux dans un ordre non contigu.
  • Envisagez d'utiliser des listes chaînées au lieu de tableaux.

Autres techniques :

  • Utiliser std::atomic compteurs de boucles pour les opérations atomiques plus lentes.
  • Compilez avec -m32 ou -march=i386 pour forcer une génération de code plus lente.
  • Forcez les doubles calculs longs de moindre précision pour une lenteur supplémentaire.
  •  Définissez fréquemment l'affinité du processeur avec différents processeurs.
  • Implémentez des appels système excessifs pour le changement de contexte. frais généraux.

Notes finales :

  • Bien que ces techniques ralentissent efficacement le code, leur niveau d'« incompétence diabolique » dépend de la justification donnée .
  • L'instructeur chargé de la mission avait peut-être pour intention que les étudiants se familiarisent avec les dangers et les dépendances des pipelines, plutôt que de simplement appliquer ces techniques. aveuglément.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal