need help. informatik Pipeline-Ansatz

Mitglied seit
15.03.2002
Beiträge
400
Reaktionen
0
ich bräuchte bis morgen 15 Uhr ein Antworten auf die folgende Frage:

Nennen Sie 2 Probleme die der Pipeline-Ansatz in sich bringt und wie diese gelöst werden können.

Ich weiß dazu aus Skript, Wiki und Google:
Eine Pipeline ist im Prozessor eine Art Queue (oder Warteschlange) in der komplexe Befehle in simple einzel Aktionen zerlegt werden. In der Pipeline werden diese "kleinen" Befehle nun in einem Takt ausgeführt. Wenn ich das richtig verstanden habe werden mehrere Pipes mit unterschiedlichen Befehlen gefüttert, ob so den Prozessor möglichst voll auszulasten.
Ein Problem ist auf jeden Fall, dass Abhängigkeiten zwischen manchen Befehlen existieren. So kann z.B. ein Befehl erst dann ausgeführt, wenn eine Information von einem anderen Befehlt (der noch nicht verarbeitet wurde) eingetroffen ist. Dadurch bilden sich so genannte "Blasen" ist der Pipeline. Lösung: irgendwie wird ein Sprung ausgeführt. Aber wie? Kann das jemand in einfachen Worten erklären?

Zweites Problem: Im Falle eines Flushes (was genau ist das?) müssen ALLE Befehle, die sich in der Pipe befinden verworfen werden. Ich versteh das so, dass im Falle eines Fehlers sämtliche Befehle in der Pipe verloren gehen und diese anschließend komplett neu gefühllt werden muss.
Lösung: kein Plan :)

Falls ich irgendwo einen Fehler gemacht, lasse ich mich gerne berichtigen. Meine Quellen zu dem Thema sind nicht besonders aufschlussreich...
Vielen Dank im Vorraus!
 
Mitglied seit
15.05.2003
Beiträge
11.306
Reaktionen
6
Ort
Fortuna 1895 Düsseldorf
hm schau dir mal man bash oder google mal nach bash. so einfach in worten zu erklären ist das nicht, weil man auf der bash wie wild pipen kann.

einfach geht es so

kommando1 | kommando2

die standart ausgabe des 1. kommandos wird an das zweite kommando übergeben. das zweite kommando bearbeitet dann die liste und gibt das gewünschte aus

beispiel
ps -ef | grep root

ps -ef erzeugt eine liste aller laufenden prozesse, diese werden an das 2. kommando grep root übergeben, grep root wiederum filtert aus der liste alle prozesse, die dem user root gehören und zeigt diese an.

einfach erklärt, man kann damit ziemlich viel machen, wenn man es beherscht.


€ edit, vielleicht hab ich dich aber auch völlig falsch verstanden -.-
 

Clawg

Guest
Zum ersten Problem:
Ein Sprung? Soweit ich weiss wird dann eben ein Wartebefehl eingefuegt?

Zum zweiten Problem:
Die Sache ist die, dass Befehle schon in die Pipeline gesetzt werden, bevor der letzte Befehle der Pipeline abgearbeitet wurde (das ist ja gerade der Zweck der Pipeline). Wenn aber Sprungbefehle auftauchen, dann muessen die bereits in der Pipeline liegenden Befehle herausgeschmissen werden und die Pipeline neugefuellt werden, weil durch den Sprung ja andere Befehle folgen als wenn der Sprung nicht genommen worden waere.
 
Mitglied seit
15.03.2002
Beiträge
400
Reaktionen
0
Original geschrieben von Clawg
Zum zweiten Problem:
Die Sache ist die, dass Befehle schon in die Pipeline gesetzt werden, bevor der letzte Befehle der Pipeline abgearbeitet wurde (das ist ja gerade der Zweck der Pipeline). Wenn aber Sprungbefehle auftauchen, dann muessen die bereits in der Pipeline liegenden Befehle herausgeschmissen werden und die Pipeline neugefuellt werden, weil durch den Sprung ja andere Befehle folgen als wenn der Sprung nicht genommen worden waere.

Ja, genau das ist der Sinn der Pipe.
Kannst du das mit dem Sprung noch etwas genauer erklären?
Ich habe also eine Folge von Befehlen die in jeder Stufe irgendwie verarbeitet werden z.B.:

B4| B3 | B2 | B1
nächster Schritt:
B5| B4 | B3 | B2 und B1 ist fertig.

Nun ist z.B. B5 ein Sprungbefehl. Was passiert jetzt genau? Oder was passiert wenn z.B. B5 auf das Ergebnis von B3 wartet.


@2FICKENDEHUNDE: Ich meine die Pipeline auf der Hardwareebene z.B. in RISC-Prozessoren. In eine Konsole kann ich da leider gar nichts eingeben :D. Du meinst glaube ich den "|" Pipe-Operator in C, der dazu dient die Ein-/Ausgabe verschieder Programme zu verbinden.
 
Mitglied seit
15.05.2003
Beiträge
11.306
Reaktionen
6
Ort
Fortuna 1895 Düsseldorf
Original geschrieben von ash.4.eVer



@2FICKENDEHUNDE: Ich meine die Pipeline auf der Hardwareebene z.B. in RISC-Prozessoren. In eine Konsole kann ich da leider gar nichts eingeben :D.


jo ich hab dein post nur überflogen, und was von befehlen gelesen und pipeline und das was ich geschrieben habe gilt natürlich nur für shells, ksh, bash, usw
 

The_Company

Guest
Original geschrieben von ash.4.eVer
B4| B3 | B2 | B1
nächster Schritt:
B5| B4 | B3 | B2 und B1 ist fertig.

Nun ist z.B. B5 ein Sprungbefehl. Was passiert jetzt genau? Oder was passiert wenn z.B. B5 auf das Ergebnis von B3 wartet.
gar nichts passiert, wenn B5 ein Sprungbefehl ist. Es passiert erst was, wenn B5 fertig ist.
Also:
B9 | B8 | B7 | B6 und B5 ist fertig.
B5 ist aber ein Sprung. Und der sagt "der naechste Befehl ist B17. Also koeene wir jetzt die Ergebnisse von B6-B9 wegschmeissen, weil die interessieren ja gar nicht. D.h. wir haben 4 Befehle umsonst ausgefuehrt.
 

Clawg

Guest
Original geschrieben von ash.4.eVer
achso!!! danke!
kannst du mir jetzt noch sagen, was man dagegen macht?

Entweder 'kluges' Auswaehlen, ob der Sprung genommen wurde oder nicht (gibts paar Algorithmen) oder beide Moeglichkeiten parallel berechnen.

Da drueber gibt's aber ne halbe Vorlesung...
 

The_Company

Guest
Einige Compiler haben die Moeglichkeit, bei Branches anzugeben, was wahrscheinlicher ist. Dann kann die Pipeline das wahrscheinlichere machen.
 
Mitglied seit
02.08.2002
Beiträge
1.000
Reaktionen
0
hat das vieleicht was mit der jump prediction zu tun?
 

RRA^StArFiRe

Guest
wird zwar für den topic ersteller schon zu spät sein ^^
aber ein prob ist das mit den sprüngen, man weiß nicht, ob der sprung gemacht wird, oder der code am stück weiter ausgeführt wird.
das macht man, indem man einfach den ersten befehl (bzw abhängig von der größe der pipes) falls ein sprung kommt, quasi hinter den branch zieht. damit hat der prozessor keine leerlaufzeiten.
also einfach durch codeoptimierungen.
würde dann irgendwie so aussehen...

bla: xxx y,z
....
bne kk
jmp bla
....

und das wird zu

bla: ....
bne.f kk
jmp bla
xxx y,z
....

das bne.f hatte irgendwie ne spezielle bezeichnung, kA wie das war. und soll bedeuten, wenn der sprung nicht ausgeführt wird, wird der nachfolgende befehl übersprungen.

aber wurde hier im topic ja schon weitgehendst erklärt glaub ich o_O

und ne andere sache an die ich mich noch erinner, war das mit dem wertübertrag.
also dass zb ein wert in der write phase geschrieben wird, der aber in der execute phase schon gebraucht wird. also in der fetchphase nen anderer wert geholt wurde. normalerweise müsste man da den code umschreiben.
das wurde so gelöst, dass die executepipeline nen extra speicherplatz hat, wo ein wert, der unmittelbar davor in der executephase errechnet wurde, gleich im nächsten executeschritt benutzt werden kann.
 
Mitglied seit
18.08.2002
Beiträge
2.513
Reaktionen
160
Erstmal zum anschaulichen Verständnis zum Sinn einer Pipeline. Mit Prozessor richtig auslasten etc. hat das nämlich wenig zu tun. Eine Pipeline soll den Datendurchsatz erhöhen.
Wenn du dir ein Fließband vorstellst, auf dem Autos in mehreren Arbeitsschritten sequentiell gefertigt werden, erhöht es natürlich die Produktivität, wenn bereits mit dem nächsten Auto angefangen werden kann, sobald der vorige Wagen die erste Stufe passiert hat. Analoges gilt für die folgenden Schritte.
Die Latenzzeit ist bei einem solchen Fließbandmodell höher, dafür steigt der Durchsatz, da mit jedem Takt ein Befehl abgearbeitet ist. (ausgenommen ganz am Anfang, wo der erste Befehl erst die komplette Pipeline durchlaufen muß)

Die Problematik dabei sind Kontrollfluß- und Datenflußkonflikte, die ja mittlerweile schon erklärt wurden.
btw. ich kenn vom SPARC beq, a wo ein Sprung angenommen wird und im negativen Fall der nachfolgende Befehl annullliert (übersprungen) wird. alternative wäre halt das Einfügen eines nop (no operation) Befehls, der das Problem (etwas uneleganter) behebt.

Toll! Eben erst gesehen, schon viel zu spät. Jetzt post ichs trotzdem-.-
 
Mitglied seit
17.11.2004
Beiträge
6.852
Reaktionen
0
Ort
G-Town
bräuchte mal konkrete hilfe :)


Ein Prozessor verarbeitet Fetch, Decode, Operand Fetch, Execute und Store.
Weviele Instruktonen kann ein Prozessor mit Takt f= 1 GHz pro Sekunde abarbeiten wenn jede Phase einen Takt dauert?????

Und wieviele Instruktionen können maximal verarbeitet werden, wenn eine 5 stufige Pipeline verwendet wird?


danke sehr :)
bräuchte ich morgen für die prüfung
 
Oben