Pipelines haben erstmal reingarnichts mit dem Cache zu tun ! Somit mischt ihr da zwei unterschiedliche Techniken wie man heutzutage die Geschwindigkeit der CPU beschleunigen will.
Während ein Cache versucht den langsammen Flaschenhals zwischen CPU und externem
RAM zu beseitigen, versucht man mit Pipelines auf einer sequentiell arbeitenden CPU den Code denoch in quasi-parellel auszuführen. D.h. unterstützt die CPU mehrere Pipelines so heist das nicht anderes als das die CPU die Ausführung der einzelnen Maschinenbefehle erstmal in mehrere Schritte zerlegt. Einmal den Instruction-Decoder und einmal die Arithmetische Recheneinheit. Der Instruction-Decoder kann nun für jede Pipeline separat vorliegen und schon mehrere CPU Takte im Vorhinhein die nächsten abzuarbeitenden Befehle vom
RAM anfordern und decodieren. Exakt in diesem Zusammenspiel kommt es nun vor das dieser Decoder der Pipeline auf sogenannte Branches trifft, also Verzweigungen im Programmfluß. Es gibt ZWEI Typen von Verzweigungen, die Bedingten und Unbedingten Branches. GOTOs, CALLs usw. sind Unbedingte Verzweigungen, sie sind also ABSOLUT verhersehbar weil sie IMMER verzweigen. Der Instruction-Decoder der einzelnen Pipelines ist also durchaus in der Lage bei GOTOs oder CALLs schon im vorhinhein den cache mit richtigen Daten zu laden. Dies ist bei bedingten Verzweigungen eben nicht mehr so einfach möglich. Um dies zu umgehen enthalten nun die CPU's eine Branch Prediction, eine Verzweigungs-Wahrscheinlichkeits-Maschine. Diese arbeitet wie ein Cache und merkt sich wohin die CPU beim letzten abarbeiten des Branches gesprungen wurde. Bei nächsten mal nutzt sie diese Informationen um eine bessere Wahrscheinlichkeits-Abschätzung zu treffen. Dies ist natürlich nur technologisch begrenzt möglich, aber denoch kann man Pi*Daumen heute sagen das die Branch-Predictions mit > 75% Wahrscheinlichkeit die RICHTIGE Vorhersagen treffen.
So, all dies hat mit Cacheing erstmal rein garnichts zu tun. Man sieht aber das es für eine CPU aus Geschwindigkeitsaspekten gesehen ein GOTO wesentlich effizienter ist. Ein CALL ist nichts anderes wie ein zweigeteiltes GOTO das die Information wohin man zurückgehren soll nach dem GOTO auf dem Stack speichert. Sogesehen gibt es aus Sicht des Programmflusses erstmal keine großen Unterschiede zwischen GOTOs oder CALLs.
Die Caches wiederum speichern NICHT linear einen EINZIGSTEN Speicerbereich zwischen.Dies wäre ja höchstineffizient. Ganz im Gegenteil der Speicher des Caches wird in sogenannte Cache-Lines aufgeteilt, ca. 256-512 Bytes. In jeder Cacheline kann man nun Daten speicher die sich auf UNTERSCHIEDLICHE Datenbereich im externen
RAM beziehen. Zusätzlich werden zu jeder Cacheline verschiedene Informationen, wie das Alter der Daten usw. gespeichert. Anhand dieser Daten kann nun der Cacheprozessor erkennen welche Daten er invalidieren muß, wlche Daten er laden muss oder aktualisieren muß (Multiprozessoren). Somit fordern die Instruction-Decoder jeder Piplines der Haupt-CPU erstmal nur Daten aus dem externen
RAM an und stellen dies als Aufgabe an den Cachprozessor durch. Dieser kann dann quasi im Hintergund überprüfen ob der diese Daten schon im internen Speicher hat, ob sie gültig sind oder ob er eine neue Cachline aus dem externen
RAM laden muß. Je nachdem kann dies dazu führen das nun 128-512 Bytes aus dem externen
RAM geladen werden müssen nur weil 1 Byte benötigt wird oder aber nur weil ein Branche FALSCH vorhergesagt wurde. In jedem Falle MUSS der Instruction-Decoder derjeweiligen Pipelin WARTEN mit der Decodierung der nächsten Instruktion, da ja der Cache nocht NICHT die richtigen Daten enthält. Dieses zusätzliche Warten ist es aber was man mit der Branch-Prediction möglichst vermeiden will.
Fazit: GOTOs sind aus Sicht der CPU der zweit-beste Fall einer Verzweigung=Branches, da sie am effizientesten und schnellsten ausgeführt werden können. Der beste Fall einer Verzeigung ist KEINE Verzweigung. CALLs, also nterprogrammaufrufe sind wesentlich ineffizienter !! Aus dieser Sicht wäre GOTO als Programverzweigung also die beste Wahl überhaupt, WENN man verzweigen muß. Das Augrument des Leherer ist also absolut falsch und das exakte GEGETEIL ist der Fall, GOTOs beschleunigen die Caches.
Gruß Hagen