<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Pipeline-Hazard</id>
	<title>Pipeline-Hazard - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Pipeline-Hazard"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Pipeline-Hazard&amp;action=history"/>
	<updated>2026-06-07T14:41:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Pipeline-Hazard&amp;diff=401728&amp;oldid=prev</id>
		<title>imported&gt;ⵓ: Vorlage {{rp}} ersetzt Vorlage {{rp}} ersetzt/ →</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Pipeline-Hazard&amp;diff=401728&amp;oldid=prev"/>
		<updated>2025-11-22T16:42:34Z</updated>

		<summary type="html">&lt;p&gt;Vorlage {{&lt;a href=&quot;/index.php?title=Vorlage:Rp&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Vorlage:Rp (Seite nicht vorhanden)&quot;&gt;rp&lt;/a&gt;}} ersetzt Vorlage {{&lt;a href=&quot;/index.php?title=Vorlage:Rp&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Vorlage:Rp (Seite nicht vorhanden)&quot;&gt;rp&lt;/a&gt;}} ersetzt/ &lt;a href=&quot;/index.php?title=Benutzer:%E2%B5%93/ARreplace&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Benutzer:ⵓ/ARreplace (Seite nicht vorhanden)&quot;&gt;→&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Belege fehlen|2=Teilweise}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pipeline-Hazards&amp;#039;&amp;#039;&amp;#039; sind Konflikte in der [[Pipeline (Prozessor)|Pipeline]] von [[Prozessor]]en, die während der Programmlaufzeit auftreten können.&lt;br /&gt;
&lt;br /&gt;
Alle modernen Prozessoren sind in Pipeline-Architektur ausgeführt: Die einzelnen Instruktionen durchlaufen eine mehrstufige Pipeline, in der sie bei jedem Taktzyklus die nächste Stufe erreichen. In jeder Stufe wird ein Teil der Bearbeitung der Instruktion vollzogen. Jeder Teilschritt benötigt gewisse Ressourcen des Prozessors (z.&amp;amp;nbsp;B. Datenwege und Rechenwerke) und möglicherweise Ergebnisse einer vorhergegangenen Instruktion. Falls eine dieser Ressourcen von einer anderen Instruktion blockiert ist oder Ergebnisse noch nicht zur Verfügung stehen, muss diese Instruktion und alle in der Pipeline folgenden vorübergehend angehalten („stalled“) werden.&amp;lt;ref name=&amp;quot;mrkor&amp;quot; details=&amp;quot;114-132&amp;quot;&amp;gt;{{Literatur |Autor=Kai-Uwe Mrkor |Titel=CPU-Design Entwurf eines RISC-Prozessors in VHDL |Verlag=epubli GmbH |Datum=2013 |ISBN=978-3-8442-6666-5}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man unterscheidet drei Arten von Pipeline-Konflikten:&lt;br /&gt;
&lt;br /&gt;
== Datenkonflikte ==&lt;br /&gt;
&amp;#039;&amp;#039;Datenkonflikte&amp;#039;&amp;#039; ergeben sich aus Datenabhängigkeiten zwischen Befehlen im Programm. Hierbei gibt es drei Arten der Datenkonflikte.&lt;br /&gt;
&lt;br /&gt;
1. &amp;#039;&amp;#039;Read after Write (RAW)&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Echte Abhängigkeit&amp;#039;&amp;#039;: Ein Operand wurde verändert und kurz darauf gelesen. Da der erste Befehl den Operanden evtl. noch nicht fertiggeschrieben hat (Pipeline-Stufe „store“ ist weit hinten), würde der zweite Befehl falsche Daten verwenden. Ein „Shortcut“ im Datenweg der Pipeline kann den Hazard vermeiden. Bei problematischeren Situationen, wenn beispielsweise ein Rechenergebnis zur Adressierung verwendet wird oder bei berechneten und bedingten Sprüngen, ist ein Anhalten der Pipeline aber unumgänglich.&amp;lt;ref name=&amp;quot;mrkor&amp;quot;  details=&amp;quot;114-115 &amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;R1&amp;#039;&amp;#039;&amp;#039; = R2+R3&lt;br /&gt;
    R4 = &amp;#039;&amp;#039;&amp;#039;R1&amp;#039;&amp;#039;&amp;#039;+1&lt;br /&gt;
&lt;br /&gt;
2. &amp;#039;&amp;#039;Write after Read (WAR)&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Gegenabhängigkeit&amp;#039;&amp;#039;: Ein Operand wird gelesen und kurz danach überschrieben. Da das Schreiben bereits vor dem Lesen vollendet sein könnte, könnte der Lese-Befehl die neu geschriebenen Werte erhalten.  Dies stellt ein potentielles Problem bei [[Out-of-order execution]] dar, nicht bei [[In-order execution]].&amp;lt;ref name=&amp;quot;mrkor&amp;quot;  details=&amp;quot;114-115 &amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
    R1 = &amp;#039;&amp;#039;&amp;#039;R2&amp;#039;&amp;#039;&amp;#039;+R3&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;R2&amp;#039;&amp;#039;&amp;#039; = 2&lt;br /&gt;
&lt;br /&gt;
3. &amp;#039;&amp;#039;Write after Write (WAW)&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Ausgabeabhängigkeit&amp;#039;&amp;#039;: Zwei Befehle schreiben auf denselben Operanden. Der zweite könnte vor dem ersten Befehl beendet werden und somit den Operanden mit einem falschen Wert belassen. Auch dies stellt ein potentielles Problem bei [[Out-of-order execution]] dar, nicht bei [[In-order execution]].&amp;lt;ref name=&amp;quot;mrkor&amp;quot;  details=&amp;quot;114-115 &amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;R1&amp;#039;&amp;#039;&amp;#039; = R2+R3&lt;br /&gt;
    &amp;#039;&amp;#039;&amp;#039;R1&amp;#039;&amp;#039;&amp;#039; = 2&lt;br /&gt;
&lt;br /&gt;
== Steuerkonflikte ==&lt;br /&gt;
&amp;#039;&amp;#039;Steuerkonflikte&amp;#039;&amp;#039; treten bei Instruktionen auf, die den Befehlszähler verändern, z.&amp;amp;nbsp;B. bei bedingten Sprungbefehlen.&lt;br /&gt;
&lt;br /&gt;
Diese Art von Konflikten kann durch folgende Vorgehensweisen vermieden werden:&lt;br /&gt;
&lt;br /&gt;
* [[Sprungvorhersage]]: Eine zusätzliche Hardware-Einheit berechnet die Wahrscheinlichkeit, mit der es zu einem Sprung kommt.&lt;br /&gt;
* [[Sprungvorhersage#Delayed Branches|Delayed Branching]]: In der Zeit, in der das Sprungziel berechnet wird, kann man die CPU dazu nutzen, andere, von dem Sprung unabhängige Instruktionen, zu berechnen. Delayed Branching ist nicht mehr aktuell, es wird heute durch dynamische Branch-Voraussage-Algorithmen ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Strukturkonflikte ==&lt;br /&gt;
&amp;#039;&amp;#039;Strukturkonflikte&amp;#039;&amp;#039; treten auf, wenn Ressourcenkonflikte innerhalb von Befehlen in der Pipeline vorhanden sind, z.&amp;amp;nbsp;B. ein synchroner Zugriff auf einen [[Registerspeicher]] mit nur einem Eingang.&lt;br /&gt;
&lt;br /&gt;
In diesem einfachen Fall können alle Prozessoren durch einen „Shortcut“ im Datenweg der Pipeline den Hazard vermeiden, bei problematischeren Situationen, wenn beispielsweise ein Rechenergebnis zur Adressierung verwendet wird oder bei berechneten und bedingten Sprüngen, ist ein Anhalten der Pipeline aber unumgänglich.&lt;br /&gt;
&lt;br /&gt;
Das Beispiel zeigt, dass es sinnvoll ist, voneinander abhängige Befehle möglichst nicht direkt hintereinander auszuführen. Moderne Prozessoren können deshalb durch [[Out-of-order execution]] oder [[hardwareseitiges Multithreading]] in vielen Fällen Hazards und Ressourcen-Konflikte vermeiden.&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Rechnerarchitektur]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ⵓ</name></author>
	</entry>
</feed>