Question

J'ai le code MIPS suivant et je cherche à réécrire / réorganiser le code afin que je puisse réduire le nombre de nop Instructions nécessaires pour une bonne exécution pipeline tout en préservant l'exactitude. On suppose que le chemin de données ni stalls ni avant. Le problème donne deux indices: il nous rappelle que les branches et les sauts sont retardés et ont besoin de leurs emplacements de retard remplis et que cela fait allusion à la chagrinaire de la valeur de décalage dans les instructions d'accès à la mémoire (LW, SW) si nécessaire.

LOOP:  lw           $1, 100 ($2)
       addi         $1, $1, 1
       sw           $1, 500 ($2)
       addiu        $2, $2, 4
       bne          $2, $10, LOOP

Il est assez évident pour moi que ce code incrémente le contenu d'un tableau et le stocke dans un autre tableau. Je ne vois donc pas exactement comment je pourrais réorganiser ce code, car les indices doivent être calculés avant de terminer la boucle.

Je suppose que ce serait de déplacer le LW Instruction après l'instruction de la branche puisque (pour autant que je comprends) l'instruction dans la fente de retard est toujours exécutée. Là encore, je ne comprends pas très bien ce sujet et j'apprécierais une explication. Je comprends le pipelining en général, mais pas tellement de ramification retardée. Merci

Était-ce utile?

La solution

Une façon de remplir la fente de retard de la branche serait:

addiu  $2, $2, 4  # We'll now iterate over [$2+4, $10] instead of [$2, $10[
LOOP:  lw           $1, 96 ($2)
       addi         $1, $1, 1
       sw           $1, 496 ($2)
       bne          $2, $10, LOOP
       addiu        $2, $2, 4  # Use the delay slot to increase $2

Autres conseils

En termes de deuxième indice:

Faites la 4e instruction le 2e. Il peut être pipené dans (après ID de la 1ère instruction, si vous utilisez la terminologie P / H) tandis que le premier s'exécute encore. Ensuite, faites le décalage dans la (ancienne) 3e instruction 496 au lieu de 500. Je suppose que vous voyez maintenant pourquoi?

Quant au premier indice, je ne connais pas trop la façon dont les succursales retardées s'exécutent exactement (non implémentées sur SPIM, donc je m'en fichais). L'ancienne dernière instruction peut probablement être faite du deuxième à la dernière comme le nom "retardé" l'indique, mais je ne pouvais pas vous dire comment et pourquoi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top