SCPCDLe 07/07/2011 à 21:43
en prenant au hasard :
"GPU qui avait certaines instructions qui passaient pas ! Il fallait les eviter avec d'autres instructions"
=> ce n'est pas vrai.
toutes les instructions fonctionnent, il y a juste de rare instructions où dans un context bien spécifique il faut faire attention à l'état du pipeline.
"il décodait et exécutait deux instructions en même temps"
=> ce n'est pas vrai.
il lit certe en mémoire 2 instructions en même temps (prefetch) pour des raisons de réduction d'utilisation de bande passante mais les instructions sont ensuite décomposé en plusieurs étapes ce qui permet d'avoir un flux tendu d’exécution (comme tout processeur à pipeline) mais au final il n'y a qu'une instruction d'éxécuté à la fois.
le cas du "jmp" suivit d'un "move" ne fait pas exécuter le move en même temps que le jump :
au moment de traiter le jump, au lieu d'avoir un cycle de mort (ie causé par le fait qu'il y ai un pipeline et donc une rupture du flux d'instruction) les concepteurs on préféré donné la possibilité d'utiliser ce cycle pour exécuter une instruction complémentaire.
C'est une features très utiles pour gagner un cycle de traitement dans les boucles critiques. (mais c'est certes pas commun d'avoir cette possibilité et en rebute plus d'un)
le cas indiqué du "move r1, r2" suivit par un autre "move r2, r3" posant problème n'est pas vrai non plus.
Il n'y a aucun problème pour effectuer ce traitement :
- l'instruction "move" a la particularité d'être exécuté en un cycle de moins que les autres instructions, ce qui permet justement d'effectuer ce genre d'opération tout en gagnant un cycle comparé à un "add r1, r2" suivit d'un "add r2, r3" par exemple.
- le mécanisme de détection de lecture d'un registre qui va être écrit fonctionne parfaitement : c'est justement ce qui permet d'éviter de tomber dans le seul bug génant du DSP et GPU qui apparait sur le séquencement instructions lentes suivit d'une rapide qui écrivent sur le même registre et le cas particulier de divisions successives qui utilisent le résultat de la division précédente.