Kann man CPU-Kerne zusammenführen?

726
Jonathan Irons

In der Vergangenheit gab es so etwas wie Hyperthreading, bei dem ein einzelner CPU-Kern wie zwei Kerne fungierte.

Aber ist es möglich, zwei CPU-Kerne zu einem einzigen zusammenzuführen, um die Leistung von Programmen zu verbessern, die nicht mehrere Kerne verwenden. (von alten Spielen bis zum X-Flugzeug 11)

1
Kurze Antwort, nein das ist meines Wissens nicht möglich. Ich wünschte, es gäbe auch ähnliche Probleme. LPChip vor 5 Jahren 2
Nicht, es sei denn, du hast wirklich einen wirklich winzigen Lötkolben und eine ruhige Hand ... Tetsujin vor 5 Jahren 1
@Tetsujin schickt jemand diese Idee schnell zum Intel und macht dann brennbare Lemona Jonathan Irons vor 5 Jahren 0
Ein "Kern" ist ein physisch getrennter Teil des Systems. Auf einem sehr groben Niveau ist das Aufbringen von 2 Kernen auf einem Prozessorchip ungefähr gleich wie auf zwei separaten 1-Kern-Chips. Mit dieser Analogie sollte klar sein, dass sie nicht zusammengeführt werden können, dave vor 5 Jahren 4
@dave eine Sekunde habe ich etwas realisiert. Programme laufen tatsächlich auf Threads. Ist es also möglich, einen Thread zwischen zwei Kernen zu teilen? Jonathan Irons vor 5 Jahren 0
Ein "Thread" ist ein "Thread der Ausführung", dh es gibt genau einen Befehlsprozessor ("Kern"), der zu jedem Zeitpunkt einen Befehlsstrom ausführt. Wenn Sie zwei Kerne verwenden möchten, benötigen Sie (mindestens) zwei Fäden; Das ist einer der Gründe für die Erfindung von Threads. dave vor 5 Jahren 2

2 Antworten auf die Frage

3
Layne Bernardo

Kurze Antwort: Nein.

Etwas längere Antwort: Kerne auf einem Multicore-Chip sind im Wesentlichen separate physische Prozessoren. Hyperthreading ermöglicht das Aufteilen eines physischen Kerns in z. B. zwei Threads. Dies hat den Vorteil, dass der einzelne Kern zwischen Threads hin- und herwechseln kann, so dass, wenn ein Thread wartet (beispielsweise für E / A), der andere Thread wieder aufgenommen werden kann. Zwei Threads auf einem Hyper-Threaded-Core nutzen Ressourcen gemeinsam, wodurch ein sehr effizienter Kontextwechsel zwischen Threads ermöglicht wird.

Warum kannst du nicht das Gegenteil tun? Nun, stell es dir einfach vor. Sie haben zwei physische Kerne, aber nur einen einzigen Prozess. Es gibt zwei mögliche Szenarien:

  1. Der ausführende Code kann parallel ausgeführt werden. In diesem Fall hätten Sie nur zwei Threads, einen für jeden Kern. Auf diese Weise können beide Threads gleichzeitig ausgeführt werden.

  2. Der ausführende Code kann nicht parallel ausgeführt werden. Darum fragen Sie. In diesem Fall haben Sie einen einzelnen Thread. Da der Code nicht gleichzeitig ausgeführt werden kann, können Sie ihn nicht gleichzeitig auf zwei separaten Prozessoren ausführen. Um einen einzelnen Thread auf beiden Kernen auszuführen, wechseln Sie einfach den Thread zwischen den beiden Kernen hin und her. Dies würde zu keinem Leistungsgewinn führen und würde die Performance aufgrund unnötiger Kontextwechsel beeinträchtigen.

Dies ist ein ungünstiger Nachteil von Multicore-Systemen. Sie sehen nur dann einen Leistungsgewinn, wenn die Anwendung mehrere Aufgaben parallel ausführen kann und dafür geschrieben wurde. Selbst dann ist der Gewinn nicht direkt proportional zur Anzahl der Kerne (siehe Amdahls Gesetz ).

2
Quanten

Nein nicht wirklich

Sie müssen die Anweisungen in irgendeiner Weise parallelisieren, und viele davon hängen von den Ergebnissen anderer Anweisungen ab [1]. Darüber hinaus ist die Recheneinheit (das Gehirn, die wirklich berechnend ist) normalerweise nicht der Engpass.

Um auf Daten zugreifen und sie berechnen zu können, müssen sie gespeichert werden. Um dies schnell zu machen, gibt es mehrere Speicherebenen (Register, Cache (Level 1,2,3), RAM). Zwei Kerne (in einem x86-Prozessor) teilen sich normalerweise nur den RAM (und möglicherweise einen L3-Cache). Sie können also ein Programm nicht einfach aufteilen, da die andere Hälfte über die benötigten Daten verfügt.

Wie funktioniert Hyperthreading?

Hyperthreading nutzt die Zeit, die Recheneinheit wartet auf etwas anderes.

Das Laden eines Werts aus dem z. B. RAM (AFAIK in etwa 500 CPU-Zyklen) dauert lange. In dieser Zeit, wenn die Recheneinheit normalerweise nichts unternimmt, führt Hyperthreading den zweiten Prozess auf demselben Kern aus.

[1] Das ist auch der Punkt, an dem die spekulative Ausführung zu helfen versucht. Und möglicherweise Sicherheitslücken schaffen (Spectre und Meltdown)