Intel ne recommande en utilisant uniquement les instructions PAUSE
lorsque la boucle de spin est très court.
Comme je l'ai compris à partir de vos questions, les attentes dans votre cas sont très longues. Dans ce cas, les boucles de spin ne sont pas recommandées.
Vous avez écrit que vous avez un "thread qui continue à balayer certains endroits (par ex.Dans ce cas, Intel vous recommande d'utiliser les fonctions de l'API de synchronisation de votre système d'exploitation, par exemple, vous pouvez créer un événement lorsqu'un nouveau nœud apparaît dans une file d'attente, et attendez simplement que vous en ayez besoin. Cet événement utilise le WaitForSingleObject(Handle, INFINITE)
Selon le Manuel d'optimisation Intel, l'instruction PAUSE
est généralement utilisée avec des threads logiciels s'exécutant sur deux processeurs logiques situés dans le même cœur de processeur. Les boucles d'attente courtes ont tendance à durer entre quelques dizaines et quelques centaines de cycles (c.-à-d. entre 20 et 500 cycles de processeur), il est donc plus avantageux d'attendre en occupant le processeur que lding à l'OS. 500 cycles CPU sur un processeur Core i7 7700K à 4500 MHz est 0,0000001 secondes, c'est-à-dire 1/10000000ème de seconde: la CPU peut faire 10 millions de fois par seconde cette boucle de 500 cycles CPU.
Comme vous voyez, cette instruction PAUSE
est vraiment short périodes de temps. D'autre part, chaque appel à une fonction API comme Sleep() subit le coût élevé d'un changement de contexte, qui peut être de 10000 cycles et plus; il subit également le coût de l'anneau 3 à l'anneau 0 transitions, qui peuvent être 1000+ cycles. S'il y a plus de threads, alors les cœurs du processeur (multiplié par la fonction hyperthreading, s'il y a lieu) sont disponibles, et un thread passe à un autre au milieu d'une section critique, attendant la section critique d'un autre thread peut vraiment prendre looong, au moins 10000+ cycles, de sorte que l'instructionsera futile.
S'il vous plaît voir cet article pour plus d'informations:
Lorsque la boucle d'attente devrait durer des milliers de cycles ou plus, il est préférable de céder au système d'exploitation en appelant l'une des fonctions API de synchronisation du système d'exploitation, telles que WaitForSingleObject sous Windows OS.
En conclusion: dans votre scénario, l'instruction PAUSE
ne sera pas le meilleur choix, puisque votre temps d'attente est long alors que le PAUSE
est prévu pour des boucles très courtes. PAUSE est juste 131 cycles SkyWell ou processeurs plus tard. Par exemple, il est juste ou 31.19ns sur Intel Core i7-7700K CPU @ 4.20GHz Kaby Lake.
Sur les processeurs antérieurs, comme Haswell, j'ai environ 9 cycles. Il est de 2,81ns sur Intel Core i5-4430 @ 3GHz. Ainsi, pour les boucles longues, il vaut mieux abandonner le contrôle à d'autres threads en utilisant les fonctions de l'API de synchronisation du SE plutôt que d'occuper le CPU avec la boucle PAUSE
.
Le point d'un spin-wait * est * de perdre du temps CPU. Burning 100% core est * mauvais * pour perf, il empêche un autre thread de donner quelque chose à votre travailleur. –