2016-05-23 9 views
0

Ich mache einige Fragen zu Pipelines. Mit diesem brauche ich Hilfe.Pipeline-Blockierung nach einer Ladeanweisung, aber nicht nach einer Additionsanweisung

Warum kann nach einem Ladebefehl ein Pipelinestall auftreten, aber nicht nach ein add Befehl?

Ich weiß, dass ein unbenutzter Steckplatz in der Pipeline einen Pipeline-Stall genannt wird. Meine Vermutung ist, dass es sich um einen Pipeline-Block nach einer Ladeanweisung handeln kann, weil wir auf ein Register warten müssen, das möglicherweise aktualisiert wird. Aber ich kann keine Antwort darauf finden, warum ein add-Befehl keinen Pipelinestall erzeugen kann. Vielleicht liegt es daran, dass wir zu diesem Zeitpunkt schon aus einem Register gelesen haben?

+0

Add ist oft nur 1 Zyklus Latenz, also mit Weiterleitung (auch bekannt als Bypass) das Ergebnis Ein Add kann von der nächsten Anweisung verwendet werden. [Dieses Q & A könnte relevant sein] (http://stackoverflow.com/questions/19041315/pipeline-stalling-and-bypassing-examples), aber ich habe es nicht gelesen. –

Antwort

2

Ein Pipelinestall wird verwendet, um Gefahren zu beheben, die normalerweise durch Datenabhängigkeiten verursacht werden. Ein Add kann tatsächlich einen Pipelinestall erzeugen, aber betrachten wir zuerst ein Beispiel, in dem dies nicht der Fall ist.

SUB r2, r3 
ADD r1, r2 

Obwohl der Befehl add das Ergebnis der Subtraktion verwendet, gibt es keine Blockierung. Dies liegt daran, dass die EX-Stufe Zugriff auf die Daten der vorherigen EX-Phase hat.

Betrachten wir nun ein Beispiel, in dem ein Add einen Stillstand erzeugen kann.

Hier werden Daten, die von der Ladeinstruktion von der MEM-Stufe erzeugt werden, als Eingabe von der EX-Stufe der ADD-Anweisung benötigt. Die EX-Stufe hat nur Zugriff auf die Daten der vorherigen EX-Stufe, wodurch die Pipeline aufgrund einer Lese-nach-Schreib-Gefahr blockiert wird. Dies wird durch dieses Diagramm veranschaulicht

diese durch Einführen einer Luftblase in die Rohrleitung gelöst ist (wie ein NOP), die die Datenabhängigkeit löst, ohne dass Daten zu propagieren rückwärts in der Zeit (was unmöglich ist).

enter image description here

du mehr über viel ausführlicher lernen durch Lesen auf hazards, bubbles und forwarding

+0

Daten von einer Last, die von einer Addition verbraucht wird, sind nicht wirklich die 'add', die einen Stillstand erzeugen, IMO. Ich würde das der Last zuordnen, nicht dem Verbraucher, da Lasten ihr Ergebnis später in der Pipeline erzeugen als ALU-Operationen. –

+0

Müssen Load-Adressen in der EX-Phase dieses Beispiels einer klassischen RISC-Pipeline bereit sein, oder kann Pointer-Chasing mit 1c-Latenz nur geladene Daten von der MEM-Stufe zurück in die MEM-Stufe leiten? –

+0

@PeterCordes Ich würde behaupten, dass das Add IS einen Stall produziert. Dies liegt daran, dass ohne den Befehl kein Stillstand auftritt. Ställe werden durch den Befehl erzeugt, der die Datenabhängigkeit verursacht. Wenn Sie die Anweisung zum Hinzufügen entfernen, wird die Blockierung nicht auftreten. Daher würde ich argumentieren, dass das "Hinzufügen" den Stall erzeugt. Wie bei Ihrer zweiten Frage wird die Zeigerverfolgung mit Operandenweiterleitung ermöglicht. Genauso wie die EX-Stufe Daten von der vorherigen EX-Stufe lesen kann, kann die MEM-Stufe Daten von der vorherigen MEM-Stufe lesen. –

Verwandte Themen