Multi-CPU war die erste Version: Sie einen oder mehrere Mainboards mit einem oder mehreren CPU-Chips auf sie haben würde. Das Hauptproblem bestand darin, dass die CPUs einige ihrer internen Daten der anderen CPU offenlegen mussten, damit sie ihnen nicht in die Quere kommen konnten.
Der nächste Schritt war Hyper-Threading. Ein Chip auf dem Mainboard, aber es hatte einige Teile intern zweimal, so dass es zwei Anweisungen gleichzeitig ausführen konnte.
Die aktuelle Entwicklung ist Multi-Core. Es ist im Grunde die ursprüngliche Idee (mehrere komplette CPUs), aber in einem einzigen Chip. Der Vorteil: Chipdesigner können die zusätzlichen Drähte für die Sync-Signale einfach in den Chip stecken (anstatt sie auf einem Pin, dann über das überfüllte Mainboard und auf einen zweiten Chip zu legen).
Supercomputer sind heute Multi-CPU, Multi-Core: Sie haben viele Mainboards mit meist 2-4 CPUs, jede CPU ist Multi-Core und jeder hat seinen eigenen Arbeitsspeicher.
[EDIT] Sie haben das ziemlich genau richtig. Nur ein paar kleine Punkte:
Hyper-Threading verfolgt zwei Kontexte auf einmal in einem einzigen Kern, mehr parallel zu dem out-of-order-CPU-Kern freigelegt wird. Dies hält die Ausführungseinheiten mit der Arbeit zugeführt wurden, selbst dann, wenn ein Faden auf einem Cache-Fehltreffer zum Stillstand gekommen ist, Zweigfehlvorhersage oder für die Ergebnisse von hohen Latenz Anweisungen warten. Es ist ein Weg, um mehr Gesamtdurchsatz zu erhalten, ohne viel Hardware zu replizieren, aber wenn etwas verlangsamt es jeden Thread einzeln nach unten. See this Q&A for more details, und eine Erklärung, was mit dem vorherigen Wortlaut dieses Absatzes falsch war.
Das Hauptproblem bei Multi-CPU ist, dass Code auf sie läuft schließlich den RAM zugreifen. Es gibt N CPUs, aber nur einen Bus, um auf den RAM zuzugreifen. So müssen Sie einige Hardware haben, die dafür sorgt, dass a) jede CPU einen fairen Betrag von RAM-Zugriff erhält, b), die Zugriffe auf den gleichen Teil des RAM verursacht keine Probleme und c) am wichtigsten ist, wird die CPU 2 benachrichtigt wenn die CPU 1 in eine Speicheradresse schreibt, die die CPU 2 in ihrem internen Cache hat.Wenn das nicht passiert, wird CPU 2 glücklich den zwischengespeicherten Wert verwenden, ohne auf die Tatsache zu achten, dass es veraltet ist.
Stellen Sie sich vor, Sie haben Aufgaben in einer Liste und möchten diese auf alle verfügbaren CPUs verteilen. CPU 1 holt also das erste Element aus der Liste und aktualisiert die Zeiger. CPU 2 wird das gleiche tun. Aus Gründen der Effizienz werden beide CPUs nicht nur die wenigen Bytes in den Cache kopieren, sondern eine ganze "Cache-Zeile" (was auch immer das sein mag). Die Annahme ist, dass Sie, wenn Sie Byte X lesen, bald auch X + 1 lesen.
Nun sind beide CPUs haben eine Kopie des Speichers in ihrem Cache. Die CPU 1 holt dann das nächste Element aus der Liste. Ohne Cachesynchronisierung hätte es nicht bemerkt, dass CPU 2 auch die Liste geändert hat und es mit dem gleichen Element wie CPU 2 zu arbeiten beginnt.
Das macht Multi-CPU so kompliziert. Nebenwirkungen davon können zu einer Leistung führen, die schlechter ist als die, die Sie erhalten würden, wenn der gesamte Code nur auf einer einzelnen CPU ausgeführt würde. Die Lösung bestand aus mehreren Kernen: Sie können problemlos so viele Drähte hinzufügen, wie Sie zum Synchronisieren der Caches benötigen. Sie könnten sogar Daten von einem Cache auf einem anderen kopieren (Teile eine Cache-Zeile zu aktualisieren, ohne sie zu spülen und mit neu laden) usw. Oder der Cache-Logik könnte sicherstellen, dass alle CPUs die gleiche Cache-Zeile erhalten, wenn sie die gleichen Zugang Teil des realen RAM, blockiert CPU 2 für einige Nanosekunden, bis CPU 1 seine Änderungen vorgenommen hat.
[EDIT 2] Der Hauptgrund, warum Multi-Core einfacher als Multi-CPU ist, dass auf einem Mainboard, Sie können einfach nicht alle Drähte zwischen den beiden Chips laufen, die Sie effektiv sync machen bräuchten zu . Außerdem läuft ein Signal nur 30 cm/ns (Lichtgeschwindigkeit; in einem Kabel haben Sie normalerweise viel weniger). Und vergessen Sie nicht, dass Signale auf einem mehrschichtigen Mainboard sich gegenseitig beeinflussen (Crosstalk). Wir denken gerne, dass 0 0V und 1 5V ist, aber in Wirklichkeit ist "0" etwas zwischen -0.5V (Overdrive beim Fallenlassen einer Linie von 1-> 0) und .5V und "1" ist etwas über 0.8V.
Wenn Sie alles innerhalb eines einzelnen Chips haben, laufen Signale viel schneller und Sie können so viele haben, wie Sie möchten (gut, fast :). Außerdem ist das Signalübersprechen viel einfacher zu steuern.
Hyperthreading ist nicht minderwertig. Es ist sehr nützlich, insbesondere für Server. Es gibt abnehmende Erträge von ILP (Prozessor bleibt beschäftigt, indem sequentielle Befehle neu angeordnet werden). Hyperthreading ist eine Alternative zur Erhöhung der Parallelität: Mehrere Hardware-Threads werden ohne großen Overhead ausgeführt. –
Wie wäre es mit meinen anderen Punkten über Multi-Core und Multi-Prozessor, denkst du, dass meine Punkte richtig sind? Irgendwas falsch? – George2
@ George2 - Ihre Bearbeitung ist sehr wahr. Das ist die ganze Idee. :) Das Beste, was Sie auf einem Server bekommen können, ist wahrscheinlich eine Multi-Core-Multi-CPU, aber für die übliche Verwendung ist Multi-Core der beste Schuss! –