Rolf B: MIPS Branch Hazards

Beitrag lesen

Hallo Julia,

sorry, da komme ich nicht wirklich mit. Ich kann zwar Vermutungen anstellen, aber so tief in der technischen Informatik bin ich nicht (mehr) drin, dass ich hier verbindlich was sagen kann. Gerade die Techniken beim Pipelining kenne ich nur oberflächlich.

Ich kann den Assembler-Code soweit deuten, dass hier das erste Element gesucht wird das nicht $zero ist (also hoffentlich nicht 0 ist) und dessen Adresse in $v0 hinterlassen wird. $a0 muss so initialisiert werden, dass es 4 Bytes vor den Listenbeginn gesetzt wird - oder das erste Element wird nicht beachtet.

Was eine FU genau tut und warum sie die Abhängigkeit zwischen dem addi und lw auflöst - keine Ahnung. Kurzes googlen sagt mir aber, dass sie wohl genau das tut was Du geschrieben hast. Weshalb die FU beim Schreiben auf $a0 wirkt, aber beim Schreiben auf $v0 nicht, so dass der nop nötig wird - keine Ahnung. Ich musste ja auch erstmal googeln was $a0 und $v0 überhaupt sind :)

Deinen Überlegungen zum Stalling, BPB und BTB kann ich überhaupt nicht folgen. Nicht wegen der Qualität deines Textes, sondern weil ich die verwendeten Prinzipien nicht gut genug kenne. Ein Intel-Prozessor würde hier vermutlich mit Register Renaming arbeiten, um einen potenziell falschen move nach $v0 verwerfen zu können.

Deine letzte Code-Umordnung (mit 4($a0)) dürfte aber falsch sein. Sie führt meines Erachtens auf eine Endlosschleife, wenn der erste Wert der Liste 0 ist. Unbekannt ist mir, ob der Prozessor eine Adresse 0($a0) genauso schnell bearbeitet wie 4($a0). Letzeres braucht eine zusätzliche Addition, ersteres ggf. nicht, es kommt also darauf an, ob es für 0($a0) eine optimierte Instruktion gibt bzw. ob die Adressierung im Data Fetch Offsets ohne Zeitverlust verarbeiten kann.

Rolf

--
sumpsi - posui - clusi