Désoptimisation d'un programme pour le pipeline dans les processeurs Intel de la famille Sandybridge
Le but de cette mission est de modifier un programme donné pour diminuer ses performances, appelé désoptimisation. Cette tâche nécessite une compréhension de l'architecture du pipeline Intel i7 et de la manière de réorganiser les chemins d'instructions pour introduire des dangers.
1. Faux partage :
Faire en sorte que les variables non atomiques soient stockées dans la même ligne de cache, ce qui entraîne des blocages de transfert de stockage.
2. Étals de transfert de magasin :
Utilisez XOR pour inverser le bit de signe d'un double au lieu d'utiliser l'opérateur "-", forçant un magasin étroit à un seul octet du double.
3. Désambiguïsation de la mémoire :
Placez les données 4096B à part pour déclencher de fausses dépendances sur les magasins vers différentes pages.
4. Données mal alignées :
Utilisez __attribute__((packed)) pour forcer le désalignement des variables à travers les limites de la ligne de cache ou de la page, augmentant ainsi les échecs de cache.
5. Stride :
Boucle sur les tableaux avec un pas de 4096 octets, provoquant un accès à la mémoire non contigu et réduisant l'utilisation du cache.
6. Liste chaînée :
Stockez les résultats dans une liste chaînée, introduisant des dépendances de charge de poursuite de pointeur et des nœuds potentiellement dispersés en mémoire.
1. Variables atomiques :
Utilisez std::atomic
2. Double long :
Utilisez des variables doubles longues pour forcer l'émulation x87, même avec des processeurs compatibles SSE2.
3. Conversions entières :
Convertissez à plusieurs reprises entre les types entiers et flottants, en introduisant des instructions de conversion avec une latence élevée.
4. Appels système :
Introduisez des appels système fréquents et inutiles pour forcer les changements de contexte et les échecs de cache/TLB.
En employant ces techniques, il est possible de pessimiser considérablement le donné programme et le faire fonctionner beaucoup plus lentement que sa version originale. La clé d'une désoptimisation réussie est de justifier chaque étape par une « incompétence diabolique » plutôt que par une intention malveillante.
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!