Das Buch zu dieser Webseite

Computertechnik-Fibel

Die Computertechnik-Fibel, das Computer-Buch

Käufer der Computertechnik-Fibel Kundenmeinung:
Die Computertechnik-Fibel ist wirklich verständlich geschrieben, frei von Ballast und ein tolles Nachschlagewerk. Insgesamt ein sehr empfehlenswertes Buch.

Computertechnik-Fibel
jetzt bestellen!

Auszeichnungen

Das Buch zu dieser Webseite

Netzwerktechnik-Fibel

Die Netzwerktechnik-Fibel

Käufer der Netzwerktechnik-Fibel Kundenmeinung:
Die Netzwerktechnik-Fibel ist sehr informativ und verständlich. Genau das habe ich schon seit langem gesucht.

Netzwerktechnik-Fibel
jetzt bestellen!

Parallelisierung (Prozessor)

Die Entwickler von Prozessoren haben im Laufe der Zeit festgestellt, dass sich die Verarbeitungsgeschwindigkeit eines Prozessors nicht nur durch die Erhöhung der Taktrate beschleunigen lässt.
So kommt es bei der Abarbeitung des Programmcodes immer wieder zu Verzögerungen. Zum Beispiel beim Zugriff auf den Speicher oder die Peripherie. In so einem Fall ist der Prozessor mit Warten beschäftigt. Er macht erst dann im Programmcode weiter, wenn die Daten aus dem Speicher oder von der Peripherie in die Register geladen wurde. Diese Wartezeit führt dazu, dass ein Großteil der zur Verfügung stehenden Rechenleistung überhaupt nicht genutzt wird.
Deshalb haben sich die Prozessor-Entwickler schon sehr früh überlegt, wie sie einen Prozessor intern so strukturieren müssen, dass er im Programmcode weitermachen kann, während Daten von außen geladen werden. Das hat dazu geführt, dass moderne Prozessoren die anstehenden Aufgaben auf viele parallel arbeitende Einheiten verteilen.

Instruction Pipelines (Pipeline-Verarbeitung / Pipelining)

Pipeline-Verarbeitung / Pipelining
Die Befehlsausführung in einem RISC-Prozessor erfolgt wie an einem Fließband (Pipeline). Eine Pipeline ist eine Abfolge von Verarbeitungseinheiten, die einen Befehl ausführen. Wenn ein Befehl von Phase 1 seiner Ausführung in Phase 2 tritt, betritt der nächste Befehl Phase 1. Die Bearbeitung in jeder Phase dauert im Optimalfall einen Taktzyklus.
Die Pipeline-Verarbeitung erfolgt in RISC-CPUs, da die RISC-Befehle so komplex sind, dass ihre Ausführung innerhalb eines Taktzyklusses nicht möglich ist.

Beispiel einer Pipeline-Verarbeitung
Im oberen Beispiel besteht die Pipeline zur Befehlsverarbeitung aus 5 Stufen. Innerhalb der Pipeline wird versucht alle Stufen gleichzeitig für aufeinanderfolgende Befehle zu benutzen. In diesem Beispiel benötigt der dritte Befehl zwei Taktzyklen zur Befehlsausführung (Execute). Die nachfolgenden Befehle müssen so lange warten.
Bei Desktop-Prozessoren ist es üblich die Pipeline zu verlängern, um darüber den Takt nach oben zu treiben. Bei Server-Prozessoren steigt die Taktrate nicht in dem Maße an. Hier spielt die "echte" Performance eine viel wichtigere Rolle. Weniger Pipeline-Stufen haben auch ihre Vorteile. Insbesondere dann, wenn im Programmcode ein unvorhergesehener Sprung zu einer anderen Stelle im Programmcode erfolgt. Bei einer langen Pipeline muss diese komplett geleert werden. Die bereits erfolgten Berechnungen sind überflüssig. In einer kurzen Pipeline macht ein unvorhergesehener Sprung nicht so viel aus. Um trotzdem eine lange Pipeline realisieren zu können, setzt man auf eine spekulative Sprungvorhersage.

Superskalarität

Doppelte Pipeline
Zur Ausführung eines Befehls ist meistens nur eine bestimmte Einheit eines Prozessors beschäftigt. Andere Einheiten bleiben ungenutzt. Wenn die Befehle eines Programms in geeigneter Reihenfolge auf zwei oder mehrere Pipelines aufgeteilt werden und diese unabhängig voneinander arbeiten (skalar) können, entsteht eine parallele Ausführung.

parallel arbeitende Ausführungseinheiten
Sind von einer Ausführungseinheit gleich mehrere vorhanden, spricht man von Superskalarität.

zwei Pipelines mit parallel arbeitenden Ausführungseinheiten
Moderne Prozessoren verwenden meist eine Kombination aus mehreren Pipelines und Ausführungseinheiten.

In-Order-Execution

Mit einfachen Heuristiken prüft der Prozessor, ob zwei aufeinanderfolgende Befehle parallel ausgeführt werden können. Wenn ja, dann werden sie in zwei Pipelines abgearbeitet. Für spezielle Befehlsgruppen gibt es sogar eigene Pipelines.
Wenn ein Befehl früher fertig ist als der Befehl in der anderen Pipeline, dann wartet er, bis auch der andere abgearbeitet ist. Erst dann geht es im Programmcode weiter. Der Compiler kann durch geschickte Sortierung der Befehle für eine Optimierung sorgen. Wenn dann aber ein Befehl auf den Speicher zugreift und die Daten nicht in einem der Caches sind, dann muss der Prozessor warten. An dieser Stelle hätte die Out-of-Order-Execution klare Vorteile. Hier treten Wartezeiten seltener auf.

Out-of-Order-Execution

Out-of-Order-Execution
Bei superskalaren Prozessoren ist die Leistungssteigerung im wesentlichen von der Auslastung der parallel arbeitenden Ausführungseinheiten abhängig. Dabei kann es vorkommen, dass ein Befehl, der im Programmcode nach einem Befehl steht, noch vor diesem aufgeführt wird. Das hatte zur Folge, dass Operationen, die im Programmcode eigentlich erst später folgen sollten, vorgezogen werden konnten, wenn gerade Rechenleistung frei war. Diese Technik nennt man Out-of-Order-Execution.
Ein Teil der Out-of-Order-Execution ist die Out-of-Order-Completion. Die Out-of-Order-Completion ist ein spezieller Mechanismus, der sicherstellt, dass das Ergebnis dem entspricht, was bei einer sequentieller Bearbeitung herauskommen würde.

Sprungvorhersage (Spekulation)

Richtig effizient ist die Out-of-Order-Execution erst dann, wenn sie spekulieren (Sprungvorhersage) kann. Dann nämlich kann sie versuchen den Programmcode vorherzusehen und Befehle vorzeitig ausführen, um später dann das Ergebnis zum Einsatz zu bringen.
Die Sprungvorhersage beruht im einfachsten Fall auf statistischen Erkenntnissen. Rückwärtssprünge im Programmcode finden oft am Ende von Schleifen statt. Während bedingte Vorwärtssprünge meistens nicht statt finden.
Trifft die Sprungvorhersage (Spekulation) nicht zu, dann muss der Prozessor das Ergebnis verwerfen und am letzten sicheren "Checkpoint" von vorne anfangen. Trifft die Sprungvorhersage zu, dann hat das einen regelrechten Geschwindigkeitsschub zur Folge. Die Hardware für die Spekulation verbraucht leider sehr viel Energie.

Multi-Threading

Mit Multi-Threading ist die Fähigkeit eines Prozessors gemeint, der mehrere Berechnungen parallel ablaufen lassen kann. Im Idealfall laufen zwei oder mehr Aktionen (Threads) gleich lang und können anschließend miteinander kombiniert werden. Die Wartezeit für den Nutzer würde sich erheblich reduzieren.
Leider lassen sich nicht alle Aufgaben gleich gut parallelisieren. Es kommt eben auch vor, dass ein Thread auf einen anderen warten muss. Algorithmen, die sich schlecht parallelisieren lassen oder schlecht parallelisiert sind, vergeuden die Zeit mit aufwendigen Abgleichprozeduren. Erschwerend sind die vielen Engstellen im System. Zum Beispiel Schnittstellen und Massenspeicherzugriffe.
Für den Programmierer ist nicht immer ersichtlich, welche Funktionen sich für die Auslagerung in einen eigenen Thread eignen. Das Parallelisieren von Funktionen verlangt vom Programmierer eine völlig andere Denkweise ab. In Echtzeitstrategiespielen könnte die Spielelogik unabhängig von der grafischen Ausgabe und der Bedienung durch den Spieler arbeiten. Bei der Bildbearbeitung lohnt es sich zum Beispiel aufwendige Berechnungen in einen eigenen Thread zu verlagern. So bleibt der Zugriff auf das Programm für den Nutzer möglich. Doch nicht immer ist das möglich. So wird ein Großteil der Berechnungen von der Grafikkarte selbst ausgeführt. Hinzu kommt, dass die Treiber für OpenGL und DirectX nur einen Thread gleichzeitig bearbeiten können.

SMT - Simultanes Multi-Threading

Simultanes Multi-Threading bedeutet, dass mehrere Threads gleichzeitig abgearbeitet werden. Ein Thread ist ein Code-Faden bzw. ein Programmablauf. Wartet ein Thread auf Daten aus dem Speicher, dann wird auf einen anderen Thread umgeschaltet, der die freien Ressourcen weiterverwendet.
SMT wird deshalb gerne eingesetzt, weil ein Thread alleine die ganzen Funktionseinheiten in einem Prozessor überhaupt nicht auslasten kann. Die Auslastung ist bei zwei gleichzeitig ablaufenden Threads wesentlich besser. Außerdem sind die Ausführungspfade unterschiedlicher Threads unabhängig voneinander. Sie kommen sich nur sehr selten in die Quere.
Weil SMT relativ gut funktioniert verzichten manche Prozessor-Architekturen komplett auf die Out-of-Order-Technik. Das macht sich insbesondere beim Energieverbrauch bemerkbar. Single-Thread-Prozessoren mit SMT verbrauchen einfach weniger Leistung.

Hyper-Threading (Intel)

Hyper-Threading ist eine Entwicklung von Intel und eine Vorstufe zum Multicore-Prozessor. Hyper-Threading gaukelt dem Betriebssystem einen zweiten Prozessorkern vor, um dadurch die Funktionseinheiten besser auszulasten und Speicherwartezeiten zu überbrücken.
Wenn der erste Thread des Prozessors auf Daten aus dem Speicher warten muss, dann kann der Prozessor den zweiten Thread nutzen, um im Programmcode weiter zu machen. Wenn ein genügend großer Cache und ein gutes Prefetching vorhanden sind, dann stehen die Chancen nicht schlecht, dass die Wartezeit sinnvoll überbrückt werden kann.
Prefetching ist ein Verfahren, bei dem Befehle und Daten vorab geladen und ausgeführt werden.
Der zusätzliche Hardware-Aufwand für Hyper-Threading liegt bei 20 Prozent und soll mit 40 bis 50 Prozent Geschwindigkeitsgewinn im Multi-Threading-Betrieb bringen.

Weitere verwandte Themen:

Dieser Text ist mir was wert:[ ? ]
Computertechnik-Fibel
Computertechnik-Fibel

EUR 21,50