Die IPC Werte in der Intel Welt bestimmt mit Dhrystone
Den heutigen Artikel scheibe ich ergänzend zu meinem Grundlagenartikel über den Zuwachs an Geschwindigkeit bei Intel Prozessoren anhand des Dhrystone Benchmarks. Diesmal dreht sich alles um ein Kriterium: den IPC, die Abkürzung von Instructions per Cycle (Anweisungen pro Maschinenzyklus). Da geht schon das erste Erklären los. Was ist ein Maschinenzyklus? Jeder Prozessor hat einen Taktgeber. Bei jedem Taktschlag tut er etwas. Ein Maschinenzyklus besteht aus mehreren Takten. Der einfachste Zyklus aus drei Teilen: Daten aus dem Speicher holen, Befehl aus den Daten herausholen, Befehl ausführen. Die Definition eines Zyklus war früher wichtig, weil er die Geschwindigkeitsanforderungen an das Speichersystem definiert. Im obigen Basiszyklus von drei Takten wird nur im ersten Takt auf den Speicher zugegriffen, dann reicht für diesen eine Zugriffszeit, die nur einem Drittel der Geschwindigkeit des Mikroprozessors entspricht. Die meisten Prozessoren in der unteren Übersicht haben einen IPC-Wert größer 1, das heißt, die obige Definition des Taktzyklus ist nicht anwendbar, weil der Prozessor durch interne Parallelisierung (Pipeline, Parallelverarbeitung) mehrere Befehle pro Takt ausführt.
Der Dhrystone ist ein Benchmark. Jeder Benchmark dient dazu, die Geschwindigkeit eines Computers zu messen. Dazu einige Bemerkungen über Faktoren, die beim Beurteilen eines Benchmarks wichtig sind. Zuerst einmal ist wichtig, welche Bedingungen beim Lauf des Benchmarks erfüllt sind. Selbst beim selben Binärcode kann es verschiedene Resultate auf unterschiedlichen Computern geben. Das hängt vom Betriebssystem ab. Das Programm benötigt Funktionen des Betriebssystems, um auf Dateien oder Geräte zuzugreifen, wie den Monitor. Beim Dhrystone Benchmark gibt es kaum Benutzung von Betriebssystemfunktionen. Trotzdem differieren die Ergebnisse eines Benchmarks unter Windows, MacOs und Linux leicht. Der Grund ist das heutige Betriebssysteme Multitasking-Betriebssysteme sind. Selbst wenn der Benchmark das einzige Programm ist, das läuft, dann gibt es noch etliche andere Prozesse, die im Hintergrund laufen und ebenfalls Ressourcen benötigen. Dazu kommt je nach Auslegung des Benchmark auch, wie groß und schnell der Speicher ist. Wenn ein Benchmark viel auf den Speicher zugreift, so kann dies wesentlich für die Gesamtgeschwindigkeit sein. Das ist bei diesem Benchmark aber nicht der Fall.
Der wichtigste Faktor ist heute der Compiler. Dhrystone wurde in C geschrieben, der populärsten Programmiersprache. Für sie gibt es zahlreiche Compiler. Ein Compiler analysiert den Quelltext und übersetzt ihn in Maschinensprache. Die Algorithmen sind dazu unterschiedlich. Bei Intels Prozessoren erzeugen meist auch Intels Compiler den schnellsten Code. Sie kennen den internen Ablauf und die genauen Ausführungszeiten der Befehle, die heute nicht mehr absolut angegeben werden können, sondern oft von anderen Befehlen abhängen. Zudem gibt es je nach Prozessor noch Spezialbefehle. Schon der 8086 hatte „Stringbefehle“, die das sequenzielle Abarbeiten einer Bytekette beschleunigten. Die aktuellen Prozessoren haben Spezialbefehle, die das Verschlüsseln und Entschlüsseln nach AES beschleunigen und Rechenbefehle, die mehrere Zahlen auf einmal verarbeiten. Daher muss für einen Vergleich auch immer derselbe Compiler eingesetzt werden.
Die Bedeutung des Compilers geht noch weiter. Heutige Compiler optimieren den Quellcode. Das heißt, sie können eine ineffiziente Programmzeile durch eine effiziente ersetzen. Das kann sehr weit gehen. So ist in so alten Benchmarks der Code oft trivial. In einer Schleife wird z. B. immer dieselbe Berechnung durchgeführt, deren Ergebnis aber nie verwendet. Der Compiler erkennt das und die Schleife durch eine einzelne Anweisung ersetzen, in der nur der letzte Durchlauf durchgeführt wird. Bei den heutigen Prozessoren kann es sein, das wenn in einer Schleife deren Anweisungen unabhängig sind, sie durch den Compiler in mehrere Teilschleifen aufgespaltet wird und diese auf die Kerne verteilt werden. Der Codeteil läuft so viel schneller.
Das Problem der optimierenden Compiler gab es schon in den Achtzigern, als der Dhrystone Benchmark entstand. Auf den Dhrystone 1 folgte der Dhrystone 2, der Code enthielt, den man nicht so gut optimieren konnte. Seitdem ist der Code aber gleich geblieben. Heutige Compiler haben daher kein Problem den Code aus den Achtzigern zu optimieren.
Die Bedeutung für die Praxis
Wenn sie Software kaufen, dann können sie sich sicher sein, dass diese ohne viele Optimierungen erstellt wurde. Der Grund ist einfach: Sowohl Intel wie AMD haben zahlreiche Prozessoren im Angebot. Bei Intel reicht das von einfachen Atoms in den Celerons mit einem „J“ in der Bezeichnung, für einen Verkaufspreis von 20 bis 30 Euro bis zu Xeon Serverprozessoren mit Verkaufspreisen von mehreren Tausend Euro. Sie unterscheiden sich in Zahl der Prozessorkerne, Taktfrequenz aber auch interner Architektur. Die Atoms haben z.B. nicht die seit dem Pentium Pro eingeführte Out-of-Order-Architektur. Je teurer ein Prozessor ist, desto mehr Spezialfähigkeiten hat er. 2018, während ich diesen Beitrag schreibe, gibt es z.B. bei den Fließkommaeinheiten, die Generationen AVX2, AVX3 und AVX512. Ein Programm, das AVX512 nutzt, würde nur auf den teuersten Prozessoren von Intel laufen, aber allen anderen mit einem Fehler abbrechen. Noch problematischer: AMD kopiert nicht die Prozessoren von Intel, sondern entwickelt eigene. Der Kernbefehlssatz ist identisch, doch AMD hat eigene Befehle, die es bei Intel nicht gibt und umgekehrt.
Daher wird ein Programm so kompiliert, dass es auf möglichst vielen Prozessoren läuft ohne spezielle Optimierungen. Wer Programme für eine bestimmte Architektur erstellt, das ist z.B. bei Firmen der Fall, wo viele Computer desselben Typs vorhanden sind oder für Supercomputer, kann man diese Optimierungen anwenden. Aufgrund dessen sollte man beim Dhrystone Benchmark die „Nicht-Optimierte“ Version als Referenz für die Geschwindigkeit nehmen.
Der Dhrystone Benchmark
Der Dhrystone Benchmark ist sehr alt, er stammt von 1984. Das ist ein Nachteil, aber auch ein Vorteil. Ein Nachteil, weil er nur grundlegende Fähigkeiten der CPU prüft, zudem ein synthetischer Benchmark, nicht ein konkretes Problem, das ausgeführt wird oder gar die Geschwindigkeit eines Anwendungsprogramms. Das wäre aber nicht möglich. Würde man z. B. die Geschwindigkeit eines Editors im Jahre 1984 messen, so wäre er 2017 gar nicht mehr ausführbar, da das Betriebssystem, z.B. MS-DOS heute nicht mehr nativ ausgeführt werden kann.
Trotzdem gibt der Dhrystone Benchmark die Geschwindigkeit eines Computers relativ gut wieder, weil die meisten Befehle eben die gebräuchlichsten sind und die gab es schon 1984. Bei diesem Benchmark liegt der Hauptaugenmerk auf Zeichenkettenoperationen, wie sie bei Textverarbeitung benötigt werden. Damit kann man Prozessoren über einen Zeitraum von 30 Jahren vergleichen. Die Ausgabe ist für heutige Verhältnisse etwas kryptisch, es sind VAX-MIPS. Vereinfacht gesagt gibt der Benchmark an, wie schnell der Prozessor verglichen mit einer VAX 11/780 ist. Die VAX 11/780 ist einer der bekanntesten und meistverkauftesten Minicomputer und er erschien schon 1977. 1984 erreichten die schnellsten Mikroprozessoren wie der 80286 oder 68000 die Geschwindigkeit einer VAX, wie der Dhrystone Benchmark belegte. Das war natürlich für das Ego äußert förderlich, kostete doch ein solcher High-Power-PC eine vierstellige Summe, während eine VAX 11/780 so groß wie eine Kommode war und im fünfstelligen Bereich lag. Allerdings hat Digital Equipment, Hersteller der VAX, wenig später auch eine VAX in PC-Größe auf den Markt gebracht.
Die Angabe „VAX-MIPS“ gibt an, dass der Programmautor annahm, dass eine VAX 1 Million Befehle pro Sekunde ausführt (MIPS: Million Instructions per Second). In der Realität führte die VAX aber nur 0,5 MIPS pro Sekunde durch. So decken sich auch die offiziellen MIPS-Angaben des Intel 80386 (9,6 MIPD bei 40 MHz) mit dem Messergebnis des Dhrystone Benchmarks (4,32 ~ 0,5 * 9,6).
Die Tabelle habe ich einer anderen Webseite übernommen. Ich habe mich auf einen Prozessor pro Generation beschränkt. Die Tabelle enthält zahlreiche Prozessoren, darunter auch verschiedene Taktfrequenzen eines Prozessors oder von verschiedenen Herstellern (früher wurden x86 Prozessoren auch von IBM, Cyrus und anderen Firmen gefertigt. Innerhalb einer Generation steigt die Geschwindigkeit aber meist linear mit der Taktfrequenz an.
Bei Intel hatten die Prozessoren zuerst Nummern (8086, 80286, 80386, 80486), dann Pentium (Pentium, Pentium Pro, Pentium II, Pentium III und Pentium 4). Das letzte Schema ist das der Core. Benennung. Nach einer Übergangszeit gibt es heute eine vierstellige Nummer. Die erste Ziffer gibt die Generation an. Aktuell im Januar 2018 ist die Ziffer „8“. Gefertigt wercen aber auch noch die Vorgängergeneration mit den Ziffern 6 und 7. Die letzten drei Ziffern dahinter geben die Typennummer an, hier gilt: je höher desto leistungsfähiger. Um das Ganze noch zu verkomplizieren, gibt es mehrere Serien. Celeron und Pentium stellen die Einstiegsklasse da, in der Icore Serie werden die Prozessoren in den Serien i3, i5 und i7 leistungsfähiger und ganz oben die Xeon Serie für Server.
Oberflächlich betrachtet gibt es einen enormen Geschwindigkeitsunterschied zwischen dem ersten Prozessor in der Liste, dem 80386 und dem Letzten, einem Prozessor der Haswell-Generation (er erschien 2014). Dieser Unterschied relativiert sich, wenn man die VAX-MIPS durch die Taktfrequenz teilt. Das Ergebnis habe ich in diesem ersten Schaubild zusammengefasst. Er gibt pro Prozessor die Angabe VAX-MIPS/MHz wieder. In Diagramm 1 für die nicht optimiere Version, in Diagramm 2 für die optimierte Version.
Es ist der „nicht-optimierte“ Wert, stellvertretend für normale Programme um den Faktor 4 gestiegen, der optimierte Wert etwa den Faktor 8. In beiden Diagrammen fällt der Pentium 4 auf. Seine Architektur war auf hohe Taktgeschwindigkeit optimiert, dafür nahm man eine langsamere Verarbeitung der Befehle in Kauf. Er hatte weniger Parallelität als sein Vorgänger, der Pentium III. Der Takt konnte auch rasch von 1,2 auf 3 GHz gesteigert werden, dann jedoch nur noch langsam. Der Pentium 4 erwies sich als technologische Sackgasse. Die heutigen Prozessoren der Core-Generation basieren auf dem Pentium M, der deswegen auch mit aufgeführt ist. Seine Architektur basiert aber letztendlich auf dem Pentium Pro. Betrachtet man das Diagramm und die Tabelle, so fällt auf, das bei nicht-optimierten Programmen seit dem Pentium Pro von 1995 also mehr als 20 Jahren ist der IPC-Wert von 0,46 auf maximal 0,542 gestiegen. Bei den optimierten Dhrystone sieht es besser aus, das liegt daran, dass seit der Core Generation es mehrere Kerne pro Prozessor gibt und der Compiler so den Code auf mehrere Kerne verteilen kann.
Betrachtet man nun die absolute Performance, so zeigt sich in Diagramm 3, dass der Anstieg lange langsam war. Die Taktfrequenzen stiegen anfangs langsam an. Der 8086 erschien 1978 mit maximal 8 MHz, in 15 Jahren konnte man ihn bis 1993 beim 80486 auf 50 MHz, also um den Faktor 6 steigern. Dann stieg der Takt einige Jahre lang rasant an, um im Jahr 2003 3.000 MHz zu erreichen – in zehn Jahren der Faktor 50. Damit war eine physikalische Grenze erreicht, da bei jedem Takt Transistoren Strom abgeben, steigt die Verlustleistung bei steigendem Takt rapide an. Diese Leckströme führten auch zum Ende der Pentium 4 Architektur die 7 bis 9 GHz erreichen sollte. Seitdem sind die Taktraten nur wenig angestiegen, was sich dann auch im Plateau in den letzten Jahren niederschlägt.
In der Summe ist es heute so, dass ein aktueller PC der Skylake/Kabylake-Generation (2018 aktuell) zwar schneller aber nicht mehr signifikant schneller als einer der Ivy-/Sandybridge Generation von 2012/13 ist. Da seit 2017 AMD mit der Zen-Architektur wieder attraktive CPU‘s fertigt, setzt heute Intel eher auf mehr Kerne um sich besser zu positionieren, bisher aber nur im Spitzensegment.