Domanda

Cosa si intende per utilizzo di una barriera di memoria esplicita?

È stato utile?

Soluzione

Ai fini delle prestazioni, le moderne CPU eseguono spesso istruzioni non funzionanti per sfruttare al massimo il silicio disponibile (inclusa la lettura / scrittura della memoria). Poiché l'hardware impone l'integrità delle istruzioni, questo non viene mai notato in un singolo thread di esecuzione. Tuttavia, per più thread o ambienti con memoria volatile (ad esempio I / O mappati in memoria) ciò può portare a comportamenti imprevedibili.

Una barriera / barriera di memoria è una classe di istruzioni che indica che le letture / scritture della memoria si verificano nell'ordine previsto. Ad esempio, un "full fence" indica tutte le operazioni di lettura / scrittura prima che il recinto venga eseguito prima di quelli dopo il recinto.

Nota: i recinti di memoria sono un concetto hardware. Nei linguaggi di livello superiore siamo abituati a trattare con mutex e semafori - questi potrebbero essere implementati usando recinzioni di memoria a basso livello e l'uso esplicito delle barriere di memoria non è necessario. L'uso delle barriere di memoria richiede uno studio attento dell'architettura hardware e più comunemente presente nei driver di dispositivo rispetto al codice dell'applicazione.

Il riordino della CPU è diverso dalle ottimizzazioni del compilatore, sebbene gli artefatti possano essere simili. È necessario adottare misure separate per impedire al compilatore di riordinare le istruzioni se ciò può causare comportamenti indesiderati (ad esempio l'uso della parola chiave volatile in C).

Altri suggerimenti

Copia la mia risposta ad un'altra domanda, Quali sono alcuni trucchi che un processore fa per ottimizzare il codice? :

  

Il più importante sarebbe il riordino dell'accesso alla memoria.

     

Assenze recinzioni di memoria o istruzioni di serializzazione, il processore è libero di riordinare gli accessi alla memoria. Alcune architetture di processori hanno restrizioni su quanto possono riordinare; Alpha è noto per essere il più debole (cioè quello che può riordinare di più).

     

Un ottimo trattamento dell'argomento può essere trovato nella documentazione sorgente del kernel Linux, in Documentazione / memory-barriers.txt .

     

Il più delle volte, è meglio usare primitive bloccanti dal compilatore o dalla libreria standard; questi sono ben testati, dovrebbero avere tutte le necessarie barriere di memoria e probabilmente sono abbastanza ottimizzati (l'ottimizzazione delle primitive di blocco è difficile; anche gli esperti possono sbagliarle a volte).

Nella mia esperienza si riferisce a una barriera di memoria , che è un'istruzione (esplicita o implicito) per sincronizzare l'accesso alla memoria tra più thread.

Il problema si verifica nella combinazione di moderni compilatori aggressivi (hanno una straordinaria libertà di riordinare le istruzioni, ma di solito non sanno nulla dei tuoi thread) e moderne CPU multicore.

Una buona introduzione al problema è il " The ' La dichiarazione con doppio controllo è rotta "Dichiarazione ". Per molti, è stato il campanello d'allarme che ci sono draghi.

Le barriere implicite di memoria completa sono generalmente incluse nelle routine di sincronizzazione dei thread della piattaforma, che ne coprono il nucleo. Tuttavia, per una programmazione senza blocchi e l'implementazione di schemi di sincronizzazione personalizzati e leggeri, spesso è necessaria solo la barriera o anche solo una barriera a senso unico.

Wikipedia sa tutto ...

  

Barriera di memoria, nota anche come membar   o memory fence, è una classe di   istruzioni che causano una centrale   unità di elaborazione (CPU) per imporre un   vincolo di ordinazione sulla memoria   operazioni emesse prima e dopo il   istruzione barriera.

     

Le CPU utilizzano ottimizzazioni delle prestazioni   ciò può risultare fuori servizio   esecuzione, incluso carico di memoria e   operazioni di magazzino. Operazione di memoria   il riordino normalmente passa inosservato   all'interno di un singolo thread di esecuzione,   ma provoca comportamenti imprevedibili in   programmi e driver di dispositivo simultanei   se non attentamente controllato. L'esatto   la natura di un vincolo di ordinazione è   dipendente dall'hardware e definito da   modello di memoria dell'architettura. Alcuni   le architetture forniscono molteplici   barriere per far rispettare diverse   vincoli di ordinazione.

     

Le barriere di memoria sono generalmente utilizzate   durante l'implementazione di macchine di basso livello   codice che funziona su memoria condivisa da   più dispositivi. Tale codice include   primitive di sincronizzazione e   strutture dati senza blocco su   sistemi multiprocessore e dispositivo   driver che comunicano con il computer   hardware.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top