Dies ist , was ich denke , würde passieren:
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 .
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?
quelle
nop
s in ihrem Assembler - CodeAntworten:
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:
könnte mehrere Wege gehen:
beide wollen gleichzeitig lesen:
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).
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.
quelle
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!
quelle
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.
quelle
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 .
quelle
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.
quelle