2013-03-22 10 views
7

Ich bin ein wenig verwirrt über was Speicher sieht aus wie in einem Dual-CPU-Maschine aus der Perspektive eines C/C++ Programms auf Linux läuft.Dual Socket vs Single Socket Speichermodell?

Fall 1 (verstanden)

Mit einem Vierkern-HT CPU, 32GB RAM, I kann in der Theorie, eine einzige Prozessanwendung schreiben, bis 8 Threads und bis zu 32 GB RAM ohne in den Tausch zu gehen oder die Threading-Möglichkeiten zu überlasten - ich ignoriere das Betriebssystem und andere Prozesse hier zur Vereinfachung.

Fall 2 (Verwirrung)

Was mit einem HT CPU mit 64GB RAM aufgebaut Dual Quad-Core passiert?

Entwicklungs-weise, müssen Sie eine Anwendung schreiben, um als zwei Prozesse (8 Threads, je 32 GB) zu kommunizieren, oder Sie können es als einen Prozess schreiben (16 Threads, 64 GB voller Speicher)?

Wenn die Antwort die erstere ist, was sind einige effiziente moderne Strategien, um die gesamte Hardware zu nutzen? Shm? IPC? Wie lenkt man Linux dazu, für jeden Prozess eine andere CPU zu verwenden?

+2

Es gibt eine Reihe von Möglichkeiten, dies zu tun. Eine Möglichkeit besteht darin, zwei Prozessoren zu verwenden und sie anzuheften. Dann benutze IPC. Die andere Möglichkeit besteht darin, sie einfach als eine Maschine mit gemeinsam genutztem Speicher zu behandeln und entweder den NUMA-Overhead zu essen oder Tricks mit Speicherzuweisung und Affinität zu spielen, um jeden letzten Tropfen auszuquetschen. – Mysticial

+1

Aus Sicht der Anwendung ist eine Dual-Quad-Core-Maschine eine Octo-Core-Maschine (dh 16 Prozessor Threads). Die Zeiten und Verzögerungen können jedoch unterschiedlich sein. –

Antwort

7

Aus Sicht der Anwendung spielt die Anzahl der physischen CPUs (Dies) keine Rolle. Nur die Anzahl der virtuellen Prozessoren. Dazu gehören alle Kerne auf allen Prozessoren und doppelt, wenn auf einem Core Hyperthreading aktiviert ist. Threads sind auf ihnen auf die gleiche Weise geplant. Es spielt keine Rolle, ob die Kerne alle auf einem Chip liegen oder über mehrere Chips verteilt sind.

Im Allgemeinen ist der beste Weg, um diese Dinge zu handhaben zu nicht. Mach dir keine Sorgen darüber, was auf welchem ​​Core läuft. Erstellen Sie einfach eine entsprechende Anzahl von Threads für Ihre Anwendung (bis zu einem theoretischen Maximum, das der Gesamtanzahl der Kerne im System entspricht), und lassen Sie das Betriebssystem mit der Planung umgehen.

Der Speicher wird natürlich von allen Kernen im System gemeinsam genutzt. Aber noch einmal, es ist das Betriebssystem, um die Zuweisung von physischem Speicher zu handhaben. Sehr wenige Anwendungen müssen sich wirklich Gedanken darüber machen, wie viel Speicher sie verwenden, und diesen Speicher zwischen Threads aufteilen. Lassen Sie das OS damit umgehen.

+0

ok - das ist der Threading-Teil - was ist mit dem Speicher? Ich kann auf die vollen 64 GB in einem Prozess (16 Threads) zugreifen? Beide CPUs können auf den vollen RAM zugreifen? – kfmfe04

+3

@ kfmfe04 Ja, beide CPUs können auf den vollen RAM zugreifen. Die Leistung wird nicht sein obwohl. (NUMA) Aber sie können auf den Speicher des jeweils anderen zugreifen. – Mysticial

+0

@Mysticial - interessant: dann kann ich einfach das einfache Modell eines Prozesses mit 64GB (16 Threads) dann tun ... ... Ich wusste nicht: Gedanke mit Dual-CPU, konnte jede CPU nur auf seine separate Bank zugreifen der Erinnerung. – kfmfe04

0

Das Speichermodell hat ** nichts ** mit der Anzahl der Kerne per se zu tun, es hat vielmehr mit der Architektur zu tun, die auf Multicore-Computern verwendet wird. Die meisten Mainstream-Computer verwenden ein symmetrisches Multiprozessormodell, bei dem ein einzelnes Betriebssystem alle CPUs steuert und Programme, die auf diesen CPUs ausgeführt werden, Zugriff auf den gesamten verfügbaren Speicher haben. Jede CPU verfügt über privaten Speicher (Cache), aber der RAM wird gemeinsam genutzt. Also, wenn Sie 64-Bit-Maschine haben, macht es Zilch Unterschied, ob Sie 1 Prozess schreiben, oder zwei Prozesse AS FAR AS Speicherverbrauch Auswirkungen sind betroffen. Programmweise wäre es besser, einen einzigen Prozess zu verwenden.

Wie auf andere hingewiesen, müssen Sie sich Sorgen über Thread-Affinitäten und dergleichen machen, aber das hat mehr mit effizienter Nutzung der CPU-Ressourcen zu tun, und wenig mit RAM-Nutzung zu tun. Es würde jedoch einige Implikationen der Cache-Nutzung geben.

Im Gegensatz zu anderen Speichermodellcomputern wie NUMA (Non-Uniform Memory Access), bei denen jede CPU über einen eigenen Speicherblock verfügt und über CPUs kommunizieren muss, sind einige Arbiter dazwischen erforderlich. Auf diesen Computern müssen Sie sich Gedanken darüber machen, wo Sie Ihre Threads speichern sollten.

Verwandte Themen