Datengefahren in einem pipelierten Prozessor treten auf, wenn eine Datenabhängigkeit zwischen Anweisungen besteht, dh ein Anweisungen benötigt das Ergebnis einer früheren Anweisung, bevor dieses Ergebnis verfügbar ist. Dies kann die Pipeline zum Stillstand bringen und die Effizienz verringern. Verschiedene Techniken mildern diese Gefahren:
1. Datenweiterleitung (Bypass):
* Mechanismus: Dies ist die häufigste und effizienteste Methode. Wenn das Ergebnis einer Anweisung in einer späteren Phase der Pipeline durch eine Anweisung in einem früheren Stadium benötigt wird, wird das Ergebnis direkt von der späteren Phase zur früheren Phase weitergeleitet, wobei der Speicherzugriff umgeht.
* Beispiel: Nehmen wir an, die Anweisung I1 schreibt, um R1 zu registrieren, und die Anweisung I2 liest aus R1. Die Datenweiterleitung würde den von I1 geschriebenen Wert direkt an I2 senden und verhindern einen Stand, obwohl I1 sein Schreiben nicht in den Speicher abgeschlossen hat.
* Wirksamkeit: Hochwirksam zur Lösung von RAW -Gefahren (gelesen nach dem Schreiben), bei denen die Abhängigkeit zwischen dem Schreiben von Anweisungen und dem Lesen desselben Registers liegt.
2. Stalling (Blaseninsertion):
* Mechanismus: Wenn die Datenweiterleitung nicht möglich ist (z. B. die Abhängigkeit in der Pipeline zu weit voneinander entfernt oder den Speicherzugriff beinhaltet), wird die Pipeline durch Einfügen von "Blasen"-No-Op-Anweisungen-zum Einfügen von Anweisungen zum Einsetzen der Daten gestaltet.
* Beispiel: I1 schreibt in das Gedächtnis und i2 liest aus diesem Speicherort. Die Datenweiterleitung ist nicht möglich, da das Schreiben von I1 abgeschlossen ist, bevor I2 lesen kann. Die Pipeline stellt bis zum Abschluss ihres Schreibens ab.
* Wirksamkeit: Einfacher zu implementieren als weiterzuweiten, reduziert aber den Pipeline -Durchsatz erheblich.
3. Umbenennen von Register:
* Mechanismus: Der Compiler oder die Hardware weist Anweisungen mit einer Datenabhängigkeit unterschiedliche Register zu. Dadurch wird der Krieg (Schreiben nach Lektüren) und Waw (WAW After Write) beseitigt. Wenn beispielsweise zwei Anweisungen dasselbe Register verwenden, kann die Hardware eine davon in ein anderes Register umbenennen und so den Konflikt beheben.
* Beispiel: Zwei Anweisungen möchten an R1 schreiben. Die Umbenennung des Registers weist der zweiten Anweisung ein anderes temporäres Register zu, das die WAW -Gefahr auflöst.
* Wirksamkeit: Sehr effektiv bei der Beseitigung von Krieg und WAW -Gefahren, beinhaltet jedoch die Komplexität der Hardware. Häufig in Verbindung mit der Datenweiterleitung verwendet.
4. Compiler -Optimierungen:
* Mechanismus: Compiler können den Code für Datenabhängigkeiten analysieren und Anweisungen neu anordnen, um Gefahren zu minimieren. Dies kann eine Anweisungsplanung beinhalten, um Anweisungen zu trennen, die voneinander abhängen, wodurch die Notwendigkeit einer Stallung oder Weiterleitung verringert wird.
* Beispiel: Der Compiler kann Anweisungen neu ordnen, um Anweisungen zu verschieben, mit denen Daten weiter von den Anweisungen entfernt werden, die diese Daten schreiben, und so die Pipeline mehr Zeit für die Beendigung der abhängigen Anweisung verleiht.
* Wirksamkeit: Reduziert die Häufigkeit von Gefahren auf der Ebene der Quellcode, aber die Wirksamkeit hängt von den Fähigkeiten des Compilers ab.
Die Wahl der Minderungstechnik hängt von der spezifischen Architektur des Prozessors ab. Moderne Prozessoren verwenden in der Regel eine Kombination aus Datenweiterleitung, Registrierungs -Umbenennung und Compiler -Optimierungen für eine effiziente Datengefahrbehandlung. Das Stalling wird häufig als letztes Mittel verwendet, wenn andere Techniken nicht ausreichend sind.