En bref, oui. Cela provoquera un blocage du processeur pendant qu'il attendra que cette instruction soit terminée et que les données soient disponibles avant de pouvoir exécuter l'instruction suivante. Il n'y a aucun moyen de prédire facilement quelles données vont arriver et donc que inc
ne peut tout simplement pas s'exécuter avant que l'instruction mov
est complet.
Ce n'est pas forcément un gros problème, car le processeur peut être capable de programmer des instructions qui ne dépendent pas du résultat de cette opération. mov
afin de maintenir le fonctionnement du noyau.
C'est ce qu'on appelle Exécution hors ordre et il peut contribuer à atténuer le coût des blocages du processeur lors de l'attente de longues instructions comme celles-ci.
Une précision supplémentaire...
J'aurais dû mieux lire votre exemple, je ne crois pas que la mov [rcx], rax
provoquera un blocage de l'instruction inc rax
mais provoquera tout ce qui dépend de l'instruction rcx
pour gagner du temps.
La page dont vous avez donné le lien énumère les débits réciproques grâce auxquels une autre instruction de ce type peut être émise. Plus précisément, je suppose que pendant ce laps de temps. cualquier une instruction avec des dépendances similaires pourrait être émise.
Je suppose donc que le registre RAX est soit renommé lorsque l'instruction est envoyée pour exécution ou est encodée dans les u-ops de l'instruction. L'instruction suivante peut travailler sur ce registre tant qu'elle n'est pas dépendante des résultats d'une opération précédente stockée. sur ce registre.
Donc, dans l'exemple de vos questions, ce que je crois devrait Il se trouve que le CPU a effectivement deux instructions dont la seule dépendance est la valeur actuelle du registre RAX et la valeur de celui-ci n'est modifiée que par la seconde instruction. La première instruction doit être distribuée et l'exécution quasi immédiate peut commencer sur la seconde ( inc
) instruction.