2016-12-29 1 views
-3

Je dois écrire un code d'assemblage x86 qui devrait fonctionner sur un processeur Intel x86.Comment écrire le code d'assemblage x86 pour vérifier l'effet de la température sur les performances du processeur

En fait, vous devez écrire comme des instructions d'addition ou de déplacement pour voir l'effet de ces instructions sur la performance de la température du processeur. Cela signifie que mon code devrait être capable de générer de la chaleur contrôlée à partir du processeur.

Si vous avez un tel code ou si vous avez de l'expérience pour écrire ce type de code, partagez-le.

+0

Édité votre titre afin que les gens ne soient pas induits en erreur par des "malveillants". Si vous avez besoin d'une «génération de chaleur contrôlée», utilisez une méthode de rétroaction. Vous pourriez ne pas avoir besoin d'asm du tout. – Jester

+1

Attendez une minute "vérifier l'effet de la température sur la performance?" Pourquoi écrivez-vous votre propre code pour cela? Pourquoi n'utilisez-vous pas simplement prime95 pour déclencher l'étranglement thermique comme une personne normale? Je n'ai pas remarqué la partie "vérifier l'effet sur la performance" du titre tout en répondant, puisque vous n'avez même pas mentionné cela dans le corps de la question. –

+0

Merci @PeterCordes. Pour mon projet, je dois le faire. Et parce que je veux mesurer la plus petite augmentation de température, c'est pourquoi je veux utiliser un code. –

Répondre

3

Pour une chaleur maximale, vous voulez que le plus grand nombre de transistors possible changent d'état à chaque cycle d'horloge. Les unités FMA à virgule flottante ont beaucoup de transistors; les tenir occupés fait beaucoup de chaleur, en particulier pour les vecteurs AVX 256b.

par exemple. Voir la section "tests de stress" de this Skylake overclocking guide, où vous pouvez voir que Prime95 version 28 et Linpack sont les charges de travail les plus chaudes. Il y a aussi un tableau de la consommation d'énergie de l'ensemble du système.

Voir aussi http://agner.org/optimize/ pour en savoir plus sur les composants internes du CPU, en particulier le guide de la microarch de Agner. Vous devriez être capable de faire moins ou plus de chaleur en ayant une boucle qui rentre dans le tampon de bouclage ou non. Les décodeurs x86 consomment beaucoup plus d'énergie que la réutilisation d'Uops déjà décodés. Voir this Q&A about uop throughput for various loop sizes, pour le cas où il n'y a pas de dépendances significatives entre les instructions, donc seul le débit limite le débit. (Voir aussi le tag tag ).


Je doute que vous verrez très différente dans la chaleur du nombre entier add reg, reg par rapport mov reg, reg ou quelque chose. Peut-être saturer le débit de l'unité entière mul ferait une différence de chaleur/puissance mesurable, mais le coût différent d'un additionneur par rapport à un mov ou un op booléen simple est probablement éclipsé par le coût de l'énergie de l'exécution hors d'état suivant le add à travers le pipeline.

Les charges ou les magasins qui conservent le cache et le matériel de stockage en mémoire tampon actifs peuvent être différents, mais add peut également avoir une source de mémoire ou un dest. Assurez-vous de ne pas gâcher votre boucle sur la latence de transfert en magasin d'un seul ajout de destination mémoire.


Pour un minimum de chaleur sans dormir réellement, utilisez le pause instruction dans une boucle. Sur Skylake, il dort beaucoup plus longtemps (~ 100 cycles) que sur les anciennes microarchitectures Intel (~ 5 cycles), IIRC.

Selon powertop on Linux, le noyau utilise mwait avec différentes indications pour entrer différents niveaux de veille sur les processeurs Intel (par exemple mon bureau Skylake). Vous pouvez le faire depuis l'espace utilisateur si vous le souhaitez, ou utiliser nanosleep pour alterner sommeil/réveil et exécuter une charge de travail produisant de la chaleur avec un certain cycle de travail.

Dormir fréquemment peut empêcher le système d'exploitation de faire grimper le processeur jusqu'à la vitesse d'horloge maximale, en fonction de votre configuration. Why does this delay-loop start to run faster after several iterations with no sleep?

Pour d'autres idées sur la réduction du débit dans une boucle, voir Deoptimizing a program for the pipeline in Intel Sandybridge-family CPUs. Les stalles qui sont juste lentes sans avoir à retourner beaucoup de transistors pour récupérer pourraient être un bon moyen de faire une boucle qui ne fait pas beaucoup de chaleur.


Sans pause, vous verrez un échauffement important de une simple boucle infinie comme .repeat: jmp .repeat, en particulier sur un processeur qui peut « turbo » à une haute tension/fréquence aussi longtemps que les limites thermiques permettent.

+0

Je pense que l'utilisation de FMA à virgule flottante augmentera radicalement la température. Avec les entiers que je veux mesurer comme changement de basse température que je peux. Puis-je faire cela en ayant une boucle? S'il y a un moyen? Avez-vous un exemple de code? Merci beaucoup. –

+0

Une boucle serrée avec 'add',' mov', ce qui serait suffisant pour empêcher le processeur de dormir, générant ainsi de la chaleur. Pas un excès, certes, mais on dirait que c'est le genre de petit impact que le PO recherche. L'astuce va rivaliser avec le programmateur de l'OS si vous essayez de "contrôler" précisément la quantité de chaleur générée. –

+0

@ Peter Cordes @CodyGray J'ai exécuté le code de stress de Prime95 qui augmente graduellement la température jusqu'à 20 degrés. Dans mon cas, ça va de 40 à 80 aussi. Maintenant, je veux en insérer quelques-unes, disons 4 lignes de code différentes qui causeront peu de déviation de la température par rapport au code original, 20 fois pour obtenir les 20 écarts de température différents. Comment et où puis-je insérer ces lignes 20 fois pour 20 écarts différents de température? Merci –