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 x86).
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.
É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
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. –
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. –