Gute Frage oder zumindest eine mit einer interessanten Antwort. Ein Teil dieser Antwort Bilder einer Welt , in der CPUs könnte effizient in der Breite statt mit mehreren getrennten Kernen skalieren. Lizenz- / Preismodelle wären anders!
Der Rest erklärt, warum sie nicht können. Zusammenfassung:
- Die Kosten für mehrere Kerne sind nahezu linear
- Die Kosten für die Erweiterung der Superskalar-Pipeline eines Kerns sind ~ quadratisch. Dies ist mit genügend Brute-Force ohnehin bis zu einem gewissen Punkt machbar. Singlethread-Leistung ist für die interaktive Verwendung von großer Bedeutung (End-to-End-Latenz, nicht nur der Durchsatz), daher zahlen aktuelle High-End-CPUs mit großem Kern diesen Preis. zB Skylake (4 breit), Ryzen (5 oder 6 breit) und Apple A12 (7 breit für die großen Kerne, 3 breit für die kleinen energieeffizienten Kerne)
- Ein ernsthaft nachlassender IPC ist darauf zurückzuführen, dass die Pipeline nur um mehr als 3 oder 4 Stellen erweitert wurde, auch wenn die ILP nicht in der richtigen Reihenfolge ausgeführt wurde . Verzweigungsfehler und Cache-Fehler sind schwer und blockieren immer noch die gesamte Pipeline.
Sie haben die Frequenz nicht erwähnt, nur IPC, aber die Skalierungsfrequenz ist auch schwierig. Höhere Frequenzen erfordern höhere Spannungen, daher skaliert die Leistung mit der gewürfelten Frequenz : ^1
von der Frequenz direkt und^2
von der Spannung. (Kondensatorspeicherenergie skaliert mit V ^ 2, und der größte Teil der dynamischen Leistung jenseits des Leckstroms stammt aus dem Pumpen von Ladung in die kapazitiven Lasten von FET-Gates + Drähten.)
Leistung = Häufigkeit mal IPC. (Innerhalb derselben Architektur. Mit einer breiteren SIMD-Karte können Sie dieselbe Arbeit mit weniger Anweisungen erledigen. Einige ISAs sind dichter als andere. MIPS benötigt häufig mehr Anweisungen, um dieselbe Arbeit zu erledigen als x86 oder AArch64.)
Die Kosten sind im Werkzeugbereich (Herstellungskosten) und / oder in der Leistung (was die Frequenz indirekt begrenzt, da die Kühlung schwierig ist). Auch eine geringere Leistung pro Watt ist an sich schon ein Ziel, insbesondere bei Mobilgeräten (Akku) und Servern (Leistungsdichte / Kühlkosten / Stromkosten).
Bevor Multi-Core pro Socket zum Thema wurde, gab es Multi-Socket-Systeme für High-End-Anwendungsfälle, bei denen Sie einen höheren Durchsatz wollten, als dies mit einer einzelnen CPU möglich war, die hergestellt werden konnte. Dies waren also die einzigen SMP-Systeme. (Server, High-End-Workstations).
Wenn ein einzelner Kern so effizient skaliert werden könnte, wie Sie es wünschen, hätten wir Systeme mit einem physischen Kern pro Socket und SMT (z. B. HyperThreading), damit diese als mehrere logische Kerne fungieren können. Typische Desktops / Laptops hätten nur einen physischen Kern, und es würde uns nicht schwer fallen, Dinge zu parallelisieren, die sich nicht linear mit mehr Kernen skalieren lassen. B. make -j4
um die Vorteile von Multi-Socket-Servern zu nutzen und / oder die E / A-Latenz auf einem Desktop auszublenden. (Oder wir würden immer noch versuchen, viel zu parallelisieren, wenn die Pipeline-Breite leicht skaliert würde, IPC jedoch nicht. Daher mussten wir mehr SMT-Threads verwenden.) Ihr Betriebssystemkern müsste immer noch auf allen logischen Kernen ausgeführt werden, es sei denn, die CPU Da SMT gegenüber dem Betriebssystem sehr unterschiedlich war, wären dort noch parallele Scheduling-Algorithmen und Sperren erforderlich.
Donald Knuth sagte in einem 2008 Interview
Ich könnte genauso gut ein bisschen über meine persönliche Unzufriedenheit mit dem aktuellen Trend zur Multicore-Architektur brennen. Für mich sieht es so aus, als wären den Hardware-Designern die Ideen ausgegangen und sie versuchen, die Schuld für den zukünftigen Untergang von Moores Gesetz an die Software-Autoren weiterzugeben, indem sie uns Maschinen geben, die nur auf wenigen Rechnern schneller arbeiten Schlüsselbenchmarks!
Ja, wenn wir wunderbare Single-Core-CPUs mit dem 8-fachen Durchsatz für echte Programme hätten , würden wir sie wahrscheinlich immer noch verwenden. Bei Dual-Socket-Systemen nur dann, wenn es sich gelohnt hat, für mehr Durchsatz viel mehr zu zahlen (keine Single-Thread-Leistung).
Mehrere CPUs reduzieren die Kosten für den Kontextwechsel, wenn mehrere Programme ausgeführt werden (indem sie wirklich parallel ausgeführt werden, anstatt schnell zwischen ihnen zu wechseln). Das präventive Multitasking, das die massiven Maschinenausfälle unterbricht, die eine solche CPU erfordern würde, würde wahrscheinlich noch mehr schaden als jetzt.
Physisch wäre es ein einzelner Kern (für eine einfache Cache-Hierarchie ohne Verbindungen zwischen den Kernen), der jedoch SMT (z. B. Intels HyperThreading) unterstützt, sodass die Software ihn als 8 logische Kerne verwenden könnte, die dynamisch um Durchsatzressourcen konkurrieren. Oder wenn nur 1 Thread läuft / nicht blockiert ist, würde dies den vollen Nutzen bringen.
Sie würden also mehrere Threads verwenden, wenn dies tatsächlich einfacher / natürlicher wäre (z. B. getrennte Prozesse, die gleichzeitig ausgeführt werden), oder für leicht parallelisierbare Probleme mit Abhängigkeitsketten, die verhindern würden, dass der IPC dieser Bestie maximal genutzt wird.
Leider ist es ein Wunsch von Knuth, dass Multi-Core-CPUs zu diesem Zeitpunkt nie mehr aufhören werden, eine Sache zu sein.
Single-Thread-Leistungsskalierung
Ich denke, wenn sie ein 1-Kern-Äquivalent zu einer 8-Kern-CPU herstellen würden, hätte ein Kern eine Steigerung des IPC um 800%, sodass Sie die volle Leistung in allen Programmen erhalten würden, nicht nur in denjenigen, die für mehrere Kerne optimiert sind.
Ja das stimmt. Wenn es überhaupt möglich wäre, eine solche CPU zu bauen , wäre das sehr erstaunlich. Aber ich denke, es ist buchstäblich unmöglich, denselben Halbleiterfertigungsprozess durchzuführen (dh dieselbe Qualität / Effizienz von Transistoren). Mit dem gleichen Strombudget und der gleichen Chipfläche wie eine 8-Kern-CPU ist dies sicherlich nicht möglich, auch wenn Sie beim Zusammenkleben von Kernen weniger Logik benötigen und nicht so viel Platz für private Caches pro Kern benötigen.
Selbst wenn Sie Frequenzerhöhungen zulassen (da das eigentliche Kriterium "Arbeit pro Sekunde" und nicht "Arbeit pro Takt" ist), wäre es eine große Herausforderung, selbst eine doppelt so schnelle CPU zu bauen.
Wenn es an jedem Ort möglich waren in der Nähe der gleichen Leistung und Druckbereich Budget ( und damit die Herstellungskosten) eine solche CPU zu bauen, würde ja CPU - Anbieter bereits sie auf diese Weise bauen.
Speziell die mehr Kerne oder breiteren Kerne? Abschnitt für den notwendigen Hintergrund, um diese Antwort zu verstehen; Es beginnt einfach mit der Funktionsweise von Pipeline-CPUs in der richtigen Reihenfolge und ist dann superskalar (mehrere Befehle pro Takt). Anschließend wird erklärt, wie wir die Power-Wall direkt um die P4-Ära erreicht haben und damit die einfache Frequenzskalierung beendet haben. Dabei bleibt meist nur IPC und es wird mehr Arbeit pro Befehl (z. B. SIMD) als Weg nach vorne erledigt, auch mit kleineren Transistoren.
Wenn Sie eine Pipeline verbreitern (max. Anweisungen pro Takt), werden die Kosten in der Regel im Quadrat der Breite angegeben . Diese Kosten werden in der Chipfläche und / oder der Leistung gemessen, um eine breitere parallele Abhängigkeitsprüfung (Gefahrenerkennung) und einen breiteren Planer für nicht ordnungsgemäße Ausführung zu ermöglichen, um fertige Anweisungen zu finden. Und mehr Lese- / Schreib-Ports für Ihre Registerdatei und Ihren Cache, wenn Sie andere Anweisungen als ausführen möchten nop
. Vor allem, wenn Sie Anweisungen mit drei Eingängen wie FMA oder Add-with-Carry (2 Register + Flags) haben.
Es gibt auch sinkende IPC-Erträge, um die CPUs breiter zu machen . Die meisten Workloads verfügen über eine begrenzte ILP (Instruction Level Parallelism) für kleine und kurze Reichweiten, die von CPUs genutzt werden kann. Wenn der Kern also breiter wird, erhöht sich der IPC (Anweisungen pro Takt) nicht, wenn der IPC bereits auf weniger als die Breite des beschränkt ist Kern durch Abhängigkeitsketten, Verzweigungsfehler, Cache-Fehler oder andere Verzögerungen. Sicher, Sie würden in einigen entrollten Schleifen mit unabhängigen Iterationen eine Beschleunigung erhalten, aber das ist nicht das, was die meisten Code-Ausgaben die meiste Zeit tun. Compare / Branch-Anweisungen machen 20% des Anweisungsmixes im "typischen" Code IIRC aus. (Ich glaube, ich habe Zahlen von 15 bis 25% für verschiedene Datensätze gelesen.)
Außerdem kostet ein Cache-Fehler, der alle abhängigen Anweisungen blockiert (und dann alles, was bei Erreichen der ROB-Kapazität passiert), mehr für eine breitere CPU. (Die Opportunitätskosten, die entstehen, wenn mehr Ausführungseinheiten im Leerlauf verbleiben; mehr potenzielle Arbeit wird nicht erledigt.) Oder ein Zweigfehlschlag verursacht in ähnlicher Weise eine Blase.
Um den 8-fachen IPC zu erhalten, benötigen wir mindestens eine 8-fache Verbesserung der Genauigkeit der Verzweigungsvorhersage und der Cache-Trefferraten . Bei den meisten Workloads lässt sich die Cache-Trefferrate jedoch nicht gut mit der Cache-Kapazität ab einem bestimmten Punkt skalieren. Und HW Prefetching ist klug, aber kann nicht sein , dass smart. Und beim 8-fachen der IPC müssen die Verzweigungsvorhersagen 8-fach so viele Vorhersagen pro Zyklus erstellen und auch genauer sein.
Gegenwärtige Techniken zum Aufbau von CPUs zur Ausführung außerhalb der Reihenfolge können ILP nur über kurze Entfernungen finden . Zum Beispiel beträgt die ROB-Größe von Skylake 224 Fused-Domain-Uops, und der Scheduler für nicht ausgeführte Uops beträgt 97 Nicht-Fused-Domain. Weitere Informationen zum Einfluss von lfence auf eine Schleife mit zwei langen Abhängigkeitsketten finden Sie unter Erhöhen der Länge in einem Fall, in dem die Scheduler-Größe der begrenzende Faktor beim Extrahieren von ILP aus zwei langen Befehlsketten ist, wenn diese zu lang werden. Und / oder sehen Sie diese allgemeinere und einleitende Antwort ).
Das Auffinden von ILP zwischen zwei separaten langen Schleifen ist also mit Hardware nicht möglich. In einigen Fällen könnte eine dynamische Neukompilierung von Binärdateien für die Schleifenfusion möglich sein, aber hart und nicht etwas, was CPUs wirklich können, wenn sie nicht die Transmeta Crusoe-Route einschlagen. (x86-Emulationsschicht auf einer anderen internen ISA; in diesem Fall VLIW). Aber moderne x86-Standarddesigns mit UOP-Caches und leistungsstarken Decodern sind für die meisten Codes nicht einfach zu übertreffen.
Ausserhalb von x86 sind alle noch verwendeten ISAs relativ einfach zu dekodieren, sodass es keine andere Motivation für eine dynamische Neukompilierung gibt als Fernoptimierungen. TL: DR: Die Hoffnung auf magische Compiler, die mehr ILP für die Hardware verfügbar machen können, hat sich für Itanium IA-64 nicht bewährt. Es ist unwahrscheinlich, dass eine Super-Wide-CPU für einen vorhandenen ISA mit einem seriellen Ausführungsmodell funktioniert.
Wenn Sie eine Super-Wide-CPU hatten, möchten Sie auf jeden Fall, dass diese SMT unterstützt, damit Sie die Arbeit aufrechterhalten können, indem Sie mehrere Threads mit niedrigem ILP-Wert ausführen.
Da Skylake derzeit 4 Uops breit ist (und einen realen IPC von 2 bis 3 Uops pro Takt oder sogar 4 Uops im Hochdurchsatzcode erreicht), wäre eine hypothetische 8x breitere CPU 32-fach!
Es wäre fantastisch , dies in 8 oder 16 logische CPUs zurückzuspeichern, die diese Ausführungsressourcen dynamisch gemeinsam nutzen: Nicht blockierte Threads erhalten die gesamte Front-End-Bandbreite und den gesamten Back-End-Durchsatz.
Bei 8 getrennten Kernen bleibt jedoch nichts anderes übrig, als die Ausführungseinheiten mit Strom zu versorgen, wenn ein Thread zum Stillstand kommt. Die anderen Threads profitieren nicht.
Die Ausführung ist häufig stoßweise: Sie bleibt stehen und wartet auf das Laden eines Cachefehlers. Wenn dann viele Befehle gleichzeitig eingehen, kann das Ergebnis verwendet werden. Bei einer sehr breiten CPU kann dieser Burst schneller ablaufen und bei SMT sogar hilfreich sein.
Aber wir können keine magischen Super-Wide-CPUs haben
Um den Durchsatz zu steigern, müssen wir stattdessen Parallelität zur Hardware in Form von Parallelität auf Thread-Ebene verfügbar machen . Generell wissen Compiler nicht genau, wann und wie man Threads verwendet, außer in einfachen Fällen wie sehr großen Schleifen. (OpenMP oder gcc's -ftree-parallelize-loops
). Es erfordert immer noch menschliche Geschicklichkeit, Code zu überarbeiten, um nützliche Arbeit effizient parallel zu erledigen, da die Kommunikation zwischen Threads und der Start von Threads teuer sind.
TLP ist eine grobkörnige Parallelität, im Gegensatz zu der feinkörnigen ILP innerhalb eines einzelnen Ausführungsthreads, den HW ausnutzen kann.
CPUs, die auf interaktive Workloads ausgerichtet sind (wie Intel / AMD x86- und Apple / ARM AArch64-High-End-Kerne), sorgen auf jeden Fall für die sinkenden Renditen der IPC-Skalierung, da die Leistung mit einem Thread immer noch so wertvoll ist, wenn es auf Latenz ankommt, nicht nur auf den Durchsatz massiv parallele Probleme.
Die Möglichkeit, 8 Kopien eines Spiels mit jeweils 15 Bildern pro Sekunde parallel auszuführen, ist weitaus weniger wert als die Möglichkeit, eine Kopie mit 45 Bildern pro Sekunde auszuführen. CPU-Anbieter wissen dies, und deshalb verwenden moderne CPUs eine Ausführung außerhalb der Reihenfolge, obwohl dies erhebliche Kosten für Leistung und Chipfläche verursacht. (Aber GPUs nicht, weil ihre Arbeitslast bereits massiv parallel ist).
Intels Xeon Phi-Hardware mit vielen Kernen (Knight's Landing / Knight's Mill) ist ein interessanter Punkt auf halber Strecke: sehr begrenzte Ausführung außerhalb der Reihenfolge und SMT, um 2-breite Kerne mit AVX512-SIMD-Anweisungen zu versorgen, um Zahlen zu knacken. Die Kerne basieren auf der stromsparenden Silvermont-Architektur von Intel. (Außer Betrieb, aber mit einem kleinen Neuordnungsfenster, viel kleiner als die Sandybridge-Familie mit großem Kern. Und einer engeren Pipeline.)
Übrigens ist dies alles orthogonal zu SIMD. Es hilft immer, mehr Arbeit pro Anweisung zu erledigen , wenn es für Ihr Problem möglich ist.
Preismodelle
Software-Preismodelle basieren auf der aktuellen Hardwarelandschaft.
Mit dem Aufkommen von Multi-Core-CPUs verbreiteten sich Lizenzierungsmodelle pro Kern (und waren sogar für Single-Socket-Desktops relevant). Vorher war es nur für Server und große Workstations relevant.
Wenn Software nicht mehrere Kerne benötigt, um mit höchster Geschwindigkeit zu laufen, gibt es keine Möglichkeit, sie billiger an Leute zu verkaufen, die nicht so viel Nutzen daraus ziehen, weil sie sie auf einer schwächeren CPU ausführen. Es sei denn, das Software- / Hardware-Ökosystem hat möglicherweise Steuerelemente für "SMT-Kanäle" entwickelt, mit denen Sie eine maximale Ausführungsbreite für Code konfigurieren können, der auf diesem logischen Kern ausgeführt wird. (Stellen Sie sich erneut eine Welt vor, in der CPUs anstelle mehrerer separater Kerne in der Pipelinebreite skalieren.)