Multi-CPU war die erste Version: Sie hätten ein oder mehrere Mainboards mit einem oder mehreren CPU-Chips. Das Hauptproblem dabei war, dass die CPUs einen Teil ihrer internen Daten der anderen CPU aussetzen mussten, damit sie sich nicht in die Quere kamen.
Der nächste Schritt war Hyper-Threading. Ein Chip auf dem Mainboard, aber einige Teile waren intern zweimal vorhanden, sodass zwei Befehle gleichzeitig ausgeführt werden konnten.
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 Synchronisationssignale einfach in den Chip einführen (anstatt sie an einem Pin herausführen zu müssen, dann über das überfüllte Mainboard und in einen zweiten Chip).
Supercomputer sind heutzutage Multi-CPU- und Multi-Core-Computer: Sie haben viele Mainboards mit normalerweise 2-4 CPUs, jede CPU ist Multi-Core und jeder hat seinen eigenen RAM.
[EDIT] Du hast das ziemlich richtig verstanden. Nur ein paar kleine Punkte:
Durch Hyper-Threading werden zwei Kontexte gleichzeitig in einem einzelnen Kern verfolgt, wodurch mehr Parallelität zum CPU-Kern außerhalb der Reihenfolge erzielt wird. Auf diese Weise werden die Ausführungseinheiten mit Arbeit versorgt, selbst wenn ein Thread aufgrund eines Cache-Fehlers, einer Fehlvorhersage der Verzweigung oder des Wartens auf Ergebnisse von Anweisungen mit hoher Latenz blockiert ist. Es ist eine Möglichkeit, einen höheren Gesamtdurchsatz zu erzielen, ohne viel Hardware zu replizieren, aber wenn überhaupt, verlangsamt es jeden Thread einzeln. In diesen Fragen und Antworten finden Sie weitere Details und eine Erklärung, was mit dem vorherigen Wortlaut dieses Absatzes nicht stimmte.
Das Hauptproblem bei Multi-CPUs besteht darin, dass der auf ihnen ausgeführte Code möglicherweise auf den RAM zugreift. Es gibt N CPUs, aber nur einen Bus, um auf den RAM zuzugreifen. Sie müssen also über Hardware verfügen, die sicherstellt, dass a) jede CPU eine angemessene Menge an RAM-Zugriff erhält, b) dass der Zugriff auf denselben Teil des RAM keine Probleme verursacht und c) vor allem, dass CPU 2 benachrichtigt wird wenn CPU 1 in eine Speicheradresse schreibt, die CPU 2 in ihrem internen Cache hat. Wenn dies nicht der Fall ist, verwendet CPU 2 den zwischengespeicherten Wert gerne, ohne zu wissen, dass er 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 macht dasselbe. Aus Effizienzgründen kopieren beide CPUs nicht nur die wenigen Bytes in den Cache, sondern eine ganze "Cache-Zeile" (was auch immer das sein mag). Die Annahme ist, dass Sie beim Lesen von Byte X bald auch X + 1 lesen werden.
Jetzt haben beide CPUs eine Kopie des Speichers in ihrem Cache. CPU 1 ruft dann das nächste Element aus der Liste ab. Ohne Cache-Synchronisierung hat es nicht bemerkt, dass CPU 2 auch die Liste geändert hat, und es beginnt mit dem gleichen Element wie CPU 2 zu arbeiten.
Dies macht Multi-CPU effektiv so kompliziert. Nebenwirkungen 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 war Multi-Core: Sie können problemlos so viele Drähte hinzufügen, wie Sie zum Synchronisieren der Caches benötigen. Sie können sogar Daten von einem Cache in einen anderen kopieren ( Teile einer Cache-Zeile aktualisieren , ohne sie leeren und neu laden zu müssen) usw. Oder die Cache-Logik kann sicherstellen, dass alle CPUs dieselbe Cache-Zeile erhalten, wenn sie auf denselben Teil von zugreifen echter RAM, der einfach CPU 2 für einige Nanosekunden blockiert, bis CPU 1 seine Änderungen vorgenommen hat.
[EDIT2] Der Hauptgrund, warum Multi-Core einfacher ist als Multi-CPU, ist, dass Sie auf einem Mainboard einfach nicht alle Drähte zwischen den beiden Chips verlegen können, die Sie für eine effektive Synchronisierung benötigen. Außerdem bewegt sich ein Signal nur über 30 cm / ns (Lichtgeschwindigkeit; in einem Draht haben Sie normalerweise viel weniger). Und vergessen Sie nicht, dass sich auf einem mehrschichtigen Mainboard die Signale gegenseitig beeinflussen (Übersprechen). Wir denken gerne, dass 0 0 V und 1 5 V ist, aber in Wirklichkeit liegt "0" zwischen -0,5 V (Overdrive beim Ablegen einer Leitung von 1-> 0) und 0,5 V und "1" liegt über 0,8 V.
Wenn Sie alles in einem einzigen Chip haben, laufen die Signale viel schneller und Sie können so viele haben, wie Sie möchten (na ja, fast :). Außerdem ist das Signalübersprechen viel einfacher zu steuern.