Più CPU / core possono accedere contemporaneamente alla stessa RAM?


15

Questo è ciò che suppongo sarebbe successo:

  1. Se due core provassero ad accedere allo stesso indirizzo nella RAM, uno dovrebbe attendere che l'altro acceda alla RAM. La seconda volta che ciascun core tenta di accedere allo stesso indirizzo, è possibile che la RAM sia ancora memorizzata nella cache, in modo da poter accedere contemporaneamente alle rispettive cache .

  2. Se due core provassero ad accedere a indirizzi diversi nella stessa RAM, uno dovrebbe attendere che l'altro acceda alla RAM.

In altre parole, immaginerei che per le attività di programmazione intensiva della RAM, il multiprocessing non aiuterà molto a meno che non implichi la lettura dello stesso indirizzo nella RAM più volte per core.

Quindi, più CPU / core possono accedere contemporaneamente alla stessa RAM o è corretto?


Non posso parlare al livello hardware a cui ti riferisci, ma posso dire che le attività ad alta intensità di ram possono essere aiutate dal multiprocessing semplicemente dividendo l'utilizzo; vale a dire se hai ram da 500mb di dati che devi elaborare, distribuisci 250mb di tali dati / ram a un proc e 250mb a un altro e hai effettivamente raddoppiato il tuo throughput possibile (le restrizioni della larghezza di banda della ram non resistono). A prescindere dal fatto che l'hardware sia in grado di farlo o meno, avere più processori che accedono allo stesso indirizzo di ram è una cattiva idea, e la maggior parte del codice multiprocesso cerca scrupolosamente di evitarlo.
Jimmy Hoffa,

1
@JimmyHoffa Ma le restrizioni sulla larghezza di banda RAM sono esattamente ciò di cui sta parlando (dato che il presupposto è che l'attività è legata alla memoria).

@Jimmy Non vedo alcun problema con due processori che provano a leggere dallo stesso indirizzo RAM. Vedrei un problema solo se provassero a scriverlo allo stesso tempo.
Hobbit perso il

1
in particolare con il processore multicore con cui lavoravo, i core non "sapevano" nulla al di là delle loro cache locali; le cose che dovevano essere sincronizzate con la cache condivisa venivano eseguite in modo trasparente con queste in un numero specificato di cicli del processore; programmatore disposto a tenerne conto appena aggiunto manualmente la quantità necessaria di nops nel proprio codice assembly
moscerino

2
Risposta breve: dipende dall'architettura del bus di sistema, dal protocollo di coerenza della cache, dal numero di porte nel controller DDR e dal numero di controller DDR. La risposta lunga è nel foglio dati del sistema.
Logica SK

Risposte:


11

Riepilogo: è generalmente possibile per un singolo core saturare il bus di memoria se l'accesso alla memoria è tutto ciò che fa.

Se si stabilisce la larghezza di banda di memoria della propria macchina, si dovrebbe essere in grado di vedere se un processo a thread singolo può davvero ottenere questo risultato e, in caso contrario, come l'effettiva larghezza di banda utilizza le scale con il numero di processori.


I dettagli dipenderanno dall'architettura che stai utilizzando. Supponendo qualcosa come il moderno SMP e SDRAM:

  1. Se due core hanno tentato di accedere allo stesso indirizzo nella RAM ...

    potrebbe andare in diversi modi:

    • entrambi vogliono leggere, contemporaneamente:

      • due core sullo stesso chip probabilmente condivideranno una cache intermedia a un certo livello (2 o 3), quindi la lettura verrà eseguita una sola volta. Su un'architettura moderna, ogni core può essere in grado di continuare a eseguire µ-op da una o più pipeline fino a quando la linea della cache è pronta
      • due core su chip diversi potrebbero non condividere una cache, ma devono comunque coordinare l'accesso al bus: idealmente, qualunque chip non abbia emesso la lettura semplicemente ficcerà la risposta
    • se entrambi vogliono scrivere:

      • due core sullo stesso chip scriveranno nella stessa cache e dovranno essere scaricati nella RAM solo una volta. Infatti, poiché la memoria verrà letta e scritta nella RAM per riga di cache, le scritture a indirizzi distinti ma sufficientemente vicini possono essere riunite in un'unica scrittura nella RAM

      • due core su chip diversi hanno un conflitto e la riga della cache dovrà essere riscritta nella RAM da chip1, recuperata nella cache di chip2, modificata e riscritta nuovamente (non ho idea se la scrittura / recupero può essere coalizzata dallo snooping)

  2. Se due core tentano di accedere a indirizzi diversi ...

    Per un singolo accesso, la latenza CAS significa che due operazioni possono potenzialmente essere intercalate per non richiedere più tempo (o forse solo un po 'più a lungo) rispetto a quando il bus fosse inattivo.


Un altro elemento dell'elenco è quando un core avvia un trasferimento DMA mentre un altro core colpisce l'area di destinazione.
ott--

7

Quindi, più CPU / core possono accedere contemporaneamente alla stessa RAM o è corretto?

Esistono molte architetture di macchine diverse, ognuna con il proprio set di funzionalità. Una categoria di macchine multiprocessore è denominata MISD , per dati singoli con istruzioni multiple, e tali macchine sono progettate per fornire gli stessi dati a più processori contemporaneamente. Una classe correlata di macchine note come architetture SIMD (Single Instruction Multiple Data) sono molto più comuni e forniscono anche l'accesso alla stessa memoria allo stesso tempo, ma la memoria contiene istruzioni anziché dati. Sia in MIMD che in SIMD, "accesso" significa accesso in lettura - puoi immaginare il problema che avresti se due unità provassero a scrivere nella stessa posizione allo stesso tempo!


3

Sebbene la maggior parte delle risposte si avvicini dal lato del modello software e / o hardware, il modo più pulito è considerare come funzionano i chip RAM fisici. (La cache si trova tra il processore e la memoria e utilizza semplicemente lo stesso bus degli indirizzi e il suo funzionamento è completamente trasparente per il processore.) I chip RAM hanno un decodificatore a singolo indirizzo, che riceve l'indirizzo della cella di memoria, arrivando su il bus degli indirizzi (e similmente un bus dati, in entrata o in uscita). Le memorie presenti sono costruite nell '"approccio a processore singolo", ovvero un processore è collegato attraverso un bus a un chip di memoria. In altre parole, questo è il "collo di bottiglia di von Neumann", poiché ogni singola istruzione deve fare riferimento alla memoria almeno una volta. Per questo motivo, su un filo (o fili, aka bus) può esistere un solo segnale alla volta, quindi il chip RAM può ricevere un indirizzo di cella alla volta. Fino a quando non è possibile garantire che i due core inseriscano lo stesso indirizzo nel bus dell'indirizzo, l'accesso al bus simultaneo da parte di due driver di bus diversi (come i core) non è fisicamente possibile. (E, se è lo stesso, è ridondante).

Il resto è la cosiddetta accelerazione hardware. Il bus di coerenza, la cache, l'accesso SIMD, ecc. Sono solo alcune belle facciate di fronte alla RAM fisica, la tua domanda era. Gli acceleratori citati possono coprire la lotta per l'utilizzo esclusivo del bus degli indirizzi e i modelli di programmazione non hanno molto a che fare con la tua domanda. Si noti inoltre che l'accesso simultaneo sarebbe anche contrario all'astrazione "spazio di indirizzi privati".

Quindi, alle tue domande: l'accesso diretto diretto alla RAM non è possibile, né con gli stessi né con indirizzi diversi. L'uso della cache potrebbe coprire questo fatto e potrebbe consentire l'accesso apparentemente simultaneo in alcuni casi. Dipende dal livello della cache e dalla costruzione, nonché dalla località spaziale e temporale dei dati. E sì, hai ragione: l'elaborazione multi (core) senza un accesso RAM avanzato, non aiuterà molto per le applicazioni ad alta intensità di RAM.

Per una migliore comprensione: basta ricordare come funziona l'accesso diretto alla memoria. Sia la CPU che il dispositivo DMA possono inserire l'indirizzo sul bus, quindi devono escludersi a vicenda dall'uso simultaneo del bus.


1

Non ti interessa la RAM fisica, ti preoccupi di più della memoria virtuale e dello spazio di indirizzi di processi o thread (tutti i thread dello stesso processo condividono uno spazio di indirizzi comune) in pratica.

Naturalmente se stai codificando un kernel del sistema operativo multi-core, ti preoccupi molto della coerenza della RAM e della cache.

La maggior parte dei processori multi-core ha una qualche forma di meccanismo di coerenza della cache . I dettagli sono specifici del processore. Poiché il processore utilizza cache della CPU , a volte si comportano come se diversi core del processore accedessero contemporaneamente alla stessa posizione di memoria.

I recenti standard di linguaggi industriali come C11 o C ++ 11 hanno alcuni modelli di memoria (multi-thread-aware) .


0

Le moderne CPU sono fisicamente legate ai loro dispositivi di memoria esterni al fine di ottenere la massima larghezza di banda per il trasferimento dei dati. Ciò è dovuto ai requisiti di integrità del segnale (lunghezza della traccia, terminazione, inclinazione dell'orologio, ecc.) Necessari per sostenere le elevate velocità di trasferimento. Ad esempio, su una scheda madre multi-CPU, ogni CPU ha un set dedicato di slot DIMM. Indipendentemente da ciò che i programmatori di software potrebbero pensare, una CPU non può semplicemente accedere ai dati della memoria esterna di un'altra CPU. Un software di gestione della memoria di un sistema, a livello di kernel del sistema operativo, Hypervisor, core del piano dati o in altro modo, gestisce il trasferimento dei dati della memoria tra CPU.


1
questo post è piuttosto difficile da leggere (wall of text). Ti dispiacerebbe modificarlo in una forma migliore?
moscerino del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.