12 - CPU-Design [ID:10301]
50 von 809 angezeigt

Was wir uns letzte Woche angeguckt haben, war das Problem mit dem mit dem Häsersatz bei den Daten.

So von der Art wir wollen uns Daten aus dem Speicher laden als Beispiel und die hinterher

zusammen addieren. Dann müssen wir in der Zwischenzeit mal wie auch immer Däumchen drehen.

Wir haben uns angeguckt wir müssen Däumchen drehen. Wir wissen manchmal nicht so recht wie lange wir

Däumchen drehen müssen, was letztendlich einfach von unserer Pipeline abhängt. Wie lang die ist.

Wir haben schon gesehen wenn man entsprechend durch den Compiler Nops einfügt, das ist ja

doch irgendwie ein bisschen kontraproduktiv. Wir haben die Pipeline gebaut damit es schneller geht

und haben gesehen mit den ganzen Nops die wir da einbauen ist die ganze Performance eigentlich

nahezu wieder weg. Was könnte man tun? Das eine sogenanntes Interlocking heißt wenn wir

gerade nicht weiter wissen, also wir haben da oben angestoßen das laden von zwei Werten.

Jetzt geht es im Moment nicht. Wenn wir das erkennen, aber wenn wir das sagen wir mal

erkennen, dann könnten wir Nops in die Pipeline schieben. Das muss man ja nicht notwendigerweise

durch den Compiler machen lassen, das kann man im Prinzip auch die Hardware machen lassen. Wenn

die Hardware sieht mir fehlt noch ein Datum, dann schiebt die Hardware Nops rein. Ist das jetzt

besser als durch den Compiler? Oder schlechter? Das sind schon mal zwei gute Argumente.

Compiler nicht anfassen, das macht man einmal. Das ist schöner wenn man es nicht machen muss,

aber das ginge ja notfalls noch. Aber wichtig natürlich unabhängig jetzt wie lang die Pipeline

ist, dem Compiler ist das wurscht, dem Programmierer ist das wurscht, die Hardware regelt das schon.

Noch ein dritter Punkt. Das ist jetzt kein Vorteil, das steht auf der anderen Seite.

Das kostet natürlich Hardware irgendwie, müssen wir uns bauen. Schneller werden wir nicht,

ne. Also das steht weder auf der Positiv- noch auf der Negativliste, das genauso schnell wie

vorher. Aber wir haben noch einen großen Pluspunkt. Wir brauchen in unserem Programm nicht die

ganzen Nops reinzuschreiben, das soll heißen, sie stehen auch nicht im Speicher. Wir hatten

ja zwischenzeitlich zum Teil mehr Nops in unserem Programm als eigentlich Instruktionen. Das soll

heißen, wenn ich das Programm mit Hardware, mit den Nops erledige, dann schrumpelt das Programm

auf die Hälfte oder was zusammen. Ich brauche für mein Programm nicht ein Megabyte, ich brauche

ein halbes Megabyte Speicher oder so. Also insofern, wo du sagst, man braucht mehr Gatter,

man braucht zwar in der CPU mehr Gatter, dafür braucht man aber sehr viel weniger Speicher.

Jo, das wäre eine Lösung, die man machen kann. Die gucken wir uns später ein bisschen genauer

an. Und das zweite, das ist eigentlich das, was man heutzutage bevorzugt, das sogenannte

Forwarding. Das soll heißen, wenn man sich das in der Pipeline anguckt. Wir haben unseren

Fetch, wir haben unser Decode, wir haben unser Execute. Und jetzt kommt noch unsere Memorystage

und unser Writeback. Und unser Problem war ja, das wird erst von da reingeschrieben. Das soll

heißen, ein, zwei, drei Schritte. Eigentlich ist das Rechnergebnis ja schon an der Stelle

fertig. Das wird ja eigentlich nur noch da hinten so durchgeschoben. Manchmal braucht

die Memory Unit ja das als Input. Man könnte aber auch sagen, naja, man könnte das doch

hier so sich gleich wiederholen. Wenn ich rechne, in einem Schritt rechne ich, dann

habe ich das Ergebnis. Und wenn ich das Ergebnis für die nächste Rechnung brauche, dann könnte

ich mir das doch so hintenrum mal abzweigen. Das ist nicht so ganz einfach, das werden

wir uns noch angucken, wie das genau geht. Das wäre jedenfalls das sogenannte Forwarding.

Allerdings, das Forwarding geht nicht immer. Wir hatten gerade schon ein Beispiel gehabt,

nämlich hier dieses Beispiel mit dem Load. Bei dem Load, naja, da kommt das Ergebnis

da hinten raus. Aber das ist natürlich, wenn ich das mir jetzt als nächstes hole zum Rechnen,

das ist nicht im nächsten Takt da. Das ist erst einen Tag später da. Und wenn es einen

Tag später da ist, dann kann ich es nicht sofort verwenden. Das geht definitiv nicht,

das ist einfach noch nicht da, das Ergebnis. Das wäre dann eine Möglichkeit, dass man

sagt, naja, eigentlich mache ich immer ein Forwarding, wenn es irgendwie geht. Aber jetzt

in dem Fall, wenn es erst aus dem Speicher geholt wird, dann kann es noch nicht da sein,

per Definition. Und dann sage ich eben, naja, gut, dann bauen wir halt mal eine Blase ein.

So eine Boppe. Jo, wie im Einzelnen machen wir das Interlocking. Jo, die Pipeline soll

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

01:30:46 Min

Aufnahmedatum

2013-06-04

Hochgeladen am

2019-04-06 17:29:27

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen