Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/02/2011, à 23:59

ehmicky

[Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Salut à tous,
Je voudrais des infos sur le nombre de cycles de l'horloge (clock cycle) pour chaque instruction x86. Est-ce que :
   1) ce nombre varie en fonction de l'instruction x86 ?
   2) ce nombre varie en fonction de l'implémentation de x86 par le CPU (-> micro-architecture) ? Par exemple, le nombre de clock cycles d'un movzx ne serait pas forcément le même entre un Pentium III et un Intel Core 2, et encore moins entre un Pentium III et un AMD Athlon.
   3) vous sauriez où trouver de la documentation sur le sujet ?

(Pourquoi ? Par simple curiosité ! tongue)

Merci beaucoup !

Dernière modification par ehmicky (Le 08/02/2011, à 10:17)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 08/02/2011, à 00:33

grim7reaper

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Salut,

ehmicky a écrit :

1) ce nombre varie en fonction de l'instruction x86 ?

Oui, les instructions qui accèdent à la mémoire prennent en général plus de cycles (bon après il y a bien les caches qui arrangent un peu les choses).

ehmicky a écrit :

2) ce nombre varie en fonction de l'implémentation de x86 par le CPU (-> micro-architecture) ? Par exemple, le nombre de clock cycles d'un movzx ne serait pas forcément le même entre un Pentium III et un Intel Core 2, et encore moins entre un Pentium III et un AMD Athlon.

Oui ça peut influer.
Si tu as trois bus internes au lieu d'un (simple exemple) dans ton processeur, il te faudras moins de cycles pour réaliser certaines instructions. La présence de MAC et de barrel shifter a aussi une influence.

3) vous sauriez où trouver de la documentation sur le sujet ?

Je pense que tu peux regarder du côté de cours du genre « architecture avancée des ordinateurs » ou chercher les datasheet des processeurs. Bon après, faut pas rêver, tu ne trouveras probablement rien de bien précis sur le design interne des processeurs d'aujourd'hui. Ça reste des trucs gardés relativement secrets (t'auras peut-être plus de chance du côté des processeurs libres).

Aujourd'hui, on ne parle plus trop de nombre de cycles/instruction (vu les archi actuelles, on peut faire des instructions en moins d'un cycle), on parle plutôt de nombre d'instructions/cycle (cela dit, ça ne change pas grand chose à ta question smile).

Sinon il n'y a pas que le x86 dans la vie, il y a aussi des trucs très sympa à voir du côté d'ARM (entre autres) smile

Dernière modification par grim7reaper (Le 08/02/2011, à 00:46)

Hors ligne

#3 Le 08/02/2011, à 01:06

ehmicky

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Salut, merci de ta réponse !
Si je suis ton raisonnement, je peux en déduire qu'en plus, une même instruction ne va pas prendre le même nombre de cycles si l'opérande est un registre, une adresse mémoire ou une valeur immédiate ?
Donc conclusion : ça dépend de tellement de choses que faut pas trop se prendre la tête avec tout ça ? big_smile
Et deuxième conclusion : les (nombreux) gens qui comparent les performances de deux bouts de code C ou C++ par le nombre d'instructions produites (hors interruptions) par le compilateur ont tout faux ?
Sinon, ARM était justement le prochain sur ma feuille de route big_smile
Merci en tout cas pour la qualité de ta réponse ! smile

Dernière modification par ehmicky (Le 08/02/2011, à 01:08)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 08/02/2011, à 09:02

grim7reaper

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

ehmicky a écrit :

Si je suis ton raisonnement, je peux en déduire qu'en plus, une même instruction ne va pas prendre le même nombre de cycles si l'opérande est un registre, une adresse mémoire ou une valeur immédiate ?

Je pense que oui (après je ne connais pas trop les archi x86 donc je ne préfère rien assurer, mais ça me paraîtrait logique).
En ARM on n'a pas ce problème car c'est une architecture Load & Store : on ne travaille que sur des registre (ou des valeurs immédiates), on à un minimum d'instructions pour charger des valeurs dans les registres et écrire dans la mémoire (les modes d'adressage sont aussi moins nombreux que dans un jeu d'instructions x86).

ehmicky a écrit :

Donc conclusion : ça dépend de tellement de choses que faut pas trop se prendre la tête avec tout ça ? big_smile

En général non, il vaut mieux ne pas trop se prendre la tête (mais après ça dépend sur quoi tu bosses). Ça ne t'empêche pas d'essayer d'optimiser ton code, mais au cycle près ça me paraît difficile (sauf si tu es sur une archi pas trop complexe et que tu connais très bien son fonctionnement).

ehmicky a écrit :

Et deuxième conclusion : les (nombreux) gens qui comparent les performances de deux bouts de code C ou C++ par le nombre d'instructions produites (hors interruptions) par le compilateur ont tout faux ?

Ils n'ont pas totalement tout faux, mais disons que c'est bien plus complexe que ça en réalité (le nombre d'instructions ne fait pas tout). Sur des archi simples, c'était assez simple de comparer des codes assembleurs.
Maintenant, avec les pipelines, les prédictions de saut, les archi superscalaires… il est de plus en plus difficile de savoir comment un code va être exécuté réellement.
Pire encore, sur certains processeurs le code généré par le compilo n'est pas forcément celui exécuté : certains processeurs réorganisent le code à la volée pour l'optimiser.
Donc comparer comparer les perfs sur la longueur du code assembleur me semble un peu bancal comme approche.

Hors ligne

#5 Le 08/02/2011, à 10:02

Nasman

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Si le nombre d'octets correspondant à une instruction assembleur est fixe (mais dépend du type d'adressage - immédiat, indexé...), le nombre de cycles dépend du processeur. Il te faut donc potasser la doc spécifique à chaque processeur.
Intel xxxxx
Amd yyyyy
...
Selon le type de processeur tu auras des instructions accessibles ou non
i386
i496
pentium...
Tu pourras avoir accès aux opérations en virgule flottante (ou pas), des opérations sur 64 bits (ou pas)
C'est aussi pourquoi la compilation d'un programme en tenant compte des spécificité de ton processeur permet d'optimiser le résultat.


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#6 Le 08/02/2011, à 10:17

ehmicky

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Merci à vous deux !
Le lien sur l'out-of-order exécution m'a retourné le cerveau big_smile (dans le bon sens du terme)
Bon, bah problème archi-résolu smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#7 Le 09/03/2018, à 21:11

Compte supprimé

Re : [Résolu][ASM x86]Nombre de cycles de l'horloge par instruction

Intéressant.
Selon http://calcul.math.cnrs.fr/Documents/Ec … /archi.pdf
On a :
MIPS= (Fréquence MHz) ÷ CPI.

D'où CPI= (Fréquence MHz) ÷ MIPS, pour répondre à la question.