Können mehrere CPUs / Kerne gleichzeitig auf denselben Arbeitsspeicher zugreifen?


15

Dies ist , was ich denke , würde passieren:

  1. Wenn zwei Kerne versuchen, auf dieselbe Adresse im RAM zuzugreifen , müsste einer warten, bis der andere auf den RAM zugreift. Beim zweiten Versuch, auf dieselbe Adresse zuzugreifen, wird der RAM möglicherweise immer noch zwischengespeichert, sodass gleichzeitig auf die entsprechenden Caches zugegriffen werden kann .

  2. Wenn zwei Kerne versuchen, auf unterschiedliche Adressen im selben RAM zuzugreifen , müsste einer warten, bis der andere auf den RAM zugreift.

Mit anderen Worten, ich würde mir vorstellen, dass bei RAM-intensiven Programmieraufgaben Multiprocessing nicht viel hilft, wenn es nicht darum geht, mehrmals pro Kern von derselben Adresse im RAM zu lesen.

Können also mehrere CPUs / Kerne gleichzeitig auf denselben RAM zugreifen, oder ist das, was ich sage, richtig?


Ich kann nicht mit der Hardware-Ebene sprechen, auf die Sie sich beziehen, aber ich kann sagen, dass ram-intensive Aufgaben durch Mehrfachverarbeitung unterstützt werden können, indem einfach die Verwendung aufgeteilt wird. Das heißt, wenn Sie 500 MB Daten im RAM haben, den Sie verarbeiten müssen, geben Sie 250 MB dieser Daten / RAM an einen Proc und 250 MB an einen anderen aus, und Sie haben Ihren möglichen Durchsatz effektiv verdoppelt (RAM-Bandbreitenbeschränkungen nicht eingehalten). Abgesehen davon, ob die Hardware dies kann oder nicht, ist es eine wirklich schlechte Idee, mehrere Prozessoren auf dieselbe RAM-Adresse zugreifen zu lassen, und die meisten Multi-Proc-Codes versuchen dies sorgfältig zu vermeiden.
Jimmy Hoffa

1
@ JimmyHoffa Aber RAM-Bandbreitenbeschränkungen sind genau das, worüber er spricht (da die Annahme ist, dass die Aufgabe speichergebunden ist).

@ Jimmy Ich sehe kein Problem mit zwei Prozessoren, die versuchen, von derselben RAM-Adresse zu lesen. Ich würde nur dann ein Problem sehen, wenn sie gleichzeitig versuchen würden, darauf zu schreiben.
Verlorene Hobbit

1
Bei bestimmten Multicore-Prozessoren, mit denen ich gearbeitet habe, "wussten" die Cores nichts über ihre lokalen Caches hinaus. Dinge, die für die Synchronisierung mit dem gemeinsam genutzten Cache benötigt wurden, wurden für diese in der angegebenen Anzahl von Prozessorzyklen transparent erledigt. Programmierer bereit , dies zu berücksichtigen , nur manuell benötigte Menge an zugesetztem nops in ihrem Assembler - Code
gnat

2
Kurze Antwort: hängt von Ihrer Systembusarchitektur, dem Cache-Kohärenzprotokoll, der Anzahl der Ports in Ihrem DDR-Controller und der Anzahl der DDR-Controller ab. Eine ausführliche Antwort finden Sie im Datenblatt Ihres Systems.
SK-logic

Antworten:


11

Zusammenfassung: Es ist im Allgemeinen möglich, dass ein einzelner Kern den Speicherbus ausfüllt, wenn nur auf den Speicher zugegriffen wird.

Wenn Sie die Speicherbandbreite Ihres Computers ermitteln, sollten Sie in der Lage sein, festzustellen, ob ein Single-Thread-Prozess dies tatsächlich erreichen kann, und wenn nicht, wie die effektive Bandbreitennutzung mit der Anzahl der Prozessoren skaliert.


Die Details hängen von der verwendeten Architektur ab. Unter der Annahme von etwas wie modernem SMP und SDRAM:

  1. Wenn zwei Kerne versuchten, auf dieselbe Adresse im RAM zuzugreifen ...

    könnte mehrere Wege gehen:

    • beide wollen gleichzeitig lesen:

      • Zwei Kerne auf demselben Chip teilen sich wahrscheinlich einen Zwischen-Cache auf einer bestimmten Ebene (2 oder 3), sodass der Lesevorgang nur einmal ausgeführt wird. In einer modernen Architektur kann jeder Kern u-ops von einer oder mehreren Pipelines ausführen, bis die Cache-Zeile bereit ist
      • Zwei Kerne auf verschiedenen Chips teilen sich möglicherweise keinen Cache, müssen jedoch den Zugriff auf den Bus koordinieren. Im Idealfall wird die Antwort nur von jedem Chip abgehört, der den Lesevorgang nicht ausgeführt hat
    • wenn beide schreiben wollen:

      • Zwei Kerne auf demselben Chip schreiben nur in denselben Cache, und dieser muss nur einmal in den Arbeitsspeicher geschrieben werden. Tatsächlich können Schreibvorgänge mit unterschiedlichen, aber ausreichend engen Adressen zu einem einzelnen Schreibvorgang in den RAM zusammengefasst werden, da der Speicher pro Cachezeile aus dem RAM gelesen und in diesen geschrieben wird

      • Zwei Kerne auf verschiedenen Chips haben einen Konflikt, und die Cache-Zeile muss von Chip1 in den RAM zurückgeschrieben, in den Cache von Chip2 abgerufen, geändert und dann wieder zurückgeschrieben werden (keine Ahnung, ob das Schreiben / Abrufen durch Snooping zusammengeführt werden kann).

  2. Wenn zwei Kerne versuchten, auf unterschiedliche Adressen zuzugreifen ...

    Für einen einzelnen Zugriff bedeutet die CAS-Latenz, dass zwei Operationen möglicherweise so verschachtelt werden können, dass sie nicht länger (oder möglicherweise nur ein wenig länger) dauern, als wenn der Bus im Leerlauf wäre.


Ein weiteres Listenelement ist, wenn ein Kern eine DMA-Übertragung initiiert, während ein weiterer Kern in den Zielbereich stößt.
ott--

7

Können also mehrere CPUs / Kerne gleichzeitig auf denselben RAM zugreifen, oder ist das, was ich sage, richtig?

Es gibt viele verschiedene Maschinenarchitekturen mit jeweils eigenen Funktionen. Eine Kategorie von Multiprozessor-Maschinen heißt MISD (Multiple Instruction Single Data), und diese Maschinen sind so konzipiert, dass sie mehrere Prozessoren gleichzeitig mit denselben Daten versorgen. Eine verwandte Klasse von Maschinen, die als SIMD- Architekturen (Single Instruction Multiple Data) bezeichnet wird, ist weitaus häufiger anzutreffen und bietet gleichzeitig Zugriff auf denselben Speicher, der Speicher enthält jedoch Anweisungen anstelle von Daten. Sowohl in MIMD als auch in SIMD bedeutet "Zugriff" Lesezugriff - Sie können sich die Probleme vorstellen, die auftreten würden, wenn zwei Geräte gleichzeitig versuchen würden, an denselben Speicherort zu schreiben!


3

Obwohl die meisten Antworten von der Seite des Software- und / oder Hardwaremodells ausgehen, ist es am saubersten, zu prüfen, wie die physischen RAM-Chips funktionieren. (Der Cache befindet sich zwischen dem Prozessor und dem Speicher und verwendet einfach denselben Adressbus, und sein Betrieb ist für den Prozessor vollständig transparent.) RAM-Chips haben einen einzelnen Adressdecoder, der die Adresse der Speicherzelle empfängt, die ankommt der Adressbus (und ähnlich ein Datenbus, entweder rein oder raus). Die gegenwärtigen Speicher sind in dem "Einzelprozessor-Ansatz" aufgebaut, dh ein Prozessor ist über einen Bus mit einem Speicherchip verbunden. Mit anderen Worten, dies ist der "von Neumann-Engpass", da jeder einzelne Befehl mindestens einmal auf den Speicher verweisen muss. Aus diesem Grund kann auf einem Draht (oder Drähten, auch Bus genannt) immer nur ein Signal vorhanden sein. so kann der RAM-Chip jeweils eine Zellenadresse empfangen. Solange Sie nicht sicherstellen können, dass die beiden Kerne dieselbe Adresse auf den Adressbus legen, ist der gleichzeitige Buszugriff durch zwei verschiedene Bustreiber (wie Kerne) physikalisch nicht möglich. (Und wenn es dasselbe ist, ist es überflüssig).

Der Rest ist die sogenannte Hardwarebeschleunigung. Der Kohärenzbus, der Cache, der SIMD-Zugriff usw. sind nur einige nette Fassaden vor dem physischen RAM, um die es bei Ihrer Frage ging. Die genannten Beschleuniger decken möglicherweise den Kampf um die ausschließliche Verwendung des Adressbusses ab, und die Programmiermodelle haben nicht viel mit Ihrer Frage zu tun. Beachten Sie auch, dass der gleichzeitige Zugriff auch gegen die Abstraktion "privater Adressraum" verstößt.

Also, zu Ihren Fragen: Der gleichzeitige direkte RAM-Zugriff ist weder mit der gleichen noch mit unterschiedlichen Adressen möglich. Die Verwendung von Cache kann diesen Umstand abdecken und in einigen Fällen den scheinbar gleichzeitigen Zugriff ermöglichen. Dies hängt von der Cachestufe und -konstruktion sowie von der räumlichen und zeitlichen Lokalität Ihrer Daten ab. Und ja, Sie haben Recht: Multi (Core) -Verarbeitung ohne erweiterten RAM-Zugriff hilft bei RAM-intensiven Anwendungen nicht viel.

Zum besseren Verständnis: Denken Sie daran, wie Direct Memory Access funktioniert. Sowohl die CPU als auch das DMA-Gerät können dem Bus Adressen zuweisen, so dass sie sich gegenseitig von der gleichzeitigen Nutzung des Busses ausschließen müssen.


1

Sie interessieren sich nicht für den physischen RAM, sondern für den virtuellen Speicher und den Adressraum von Prozessen oder Threads (alle Threads desselben Prozesses teilen sich einen gemeinsamen Adressraum).

Wenn Sie einen Multi-Core-Betriebssystemkernel codieren, sind Ihnen natürlich RAM und Cache-Kohärenz sehr wichtig.

Die meisten Mehrkernprozessoren verfügen über eine Art Cache-Kohärenzmechanismus . Details sind prozessorspezifisch. Da Prozessoren CPU-Caches verwenden , verhalten sie sich manchmal so, als würden mehrere Prozessorkerne gleichzeitig auf denselben Speicherort zugreifen.

Jüngste Standards für Industriesprachen wie C11 oder C ++ 11 verfügen über ein (Multithread-fähiges) Speichermodell .


0

Moderne CPUs sind physisch an ihre externen Speichergeräte gebunden, um die maximale Datenübertragungsbandbreite zu erhalten. Dies liegt an den Anforderungen an die Signalintegrität (Trace-Länge, Terminierung, Taktversatz usw.), die erforderlich sind, um die hohen Übertragungsraten aufrechtzuerhalten. Beispielsweise verfügt bei einem Motherboard mit mehreren CPUs jede CPU über einen dedizierten Satz von DIMM-Steckplätzen. Unabhängig davon, was Software-Programmierer denken, kann eine CPU nicht einfach auf externe Speicherdaten einer anderen CPU zugreifen. Die Speicherverwaltungssoftware eines Systems, egal ob auf der Ebene des Betriebssystemkerns, des Hypervisors, der Datenebenenkerne oder auf andere Weise, verarbeitet die Datenübertragung zwischen den CPUs.


1
Dieser Beitrag ist ziemlich schwer zu lesen (Textwand). Hätten Sie etwas dagegen bearbeiten sie in eine bessere Form ing?
gnat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.