2012-01-27 10 views
7

Ho un set e prova il blocco dell'assemblaggio basato su xchg. la mia domanda è:Abbiamo bisogno di mfence quando si utilizza xchg

abbiamo bisogno di utilizzare scherma memoria (mfence, sfence o lfence) quando si utilizza xchg istruzioni?

Edit:

64 piattaforma Bit: con Intel Nehalem

+1

Quale piattaforma/CPU? –

risposta

11

Come detto nelle altre risposte il prefisso di blocco è implicito, qui, quindi non c'è alcun problema a livello di assemblatore. Il problema può dipendere dal livello C (o C++) quando lo si usa come assemblatore in linea. Qui devi assicurarti che il compilatore non riordini le istruzioni rispetto al tuo xchg. Se si utilizza gcc (o cugini) è in genere fare qualcosa di simile:

__asm__ __volatile__("xchgl %1, %0" 
         : "=r"(ret) 
         : "m"(*point), "0"(ret) 
         : "memory"); 

che è dichiarare l'istruzione come volatile e aggiungere il clobber "memoria".

+4

+1 per il "clobber di memoria". –

5

No. xchg è garantito per compilare in qualcosa, che assicurerà la coerenza a livello di hardware.

+0

Immagino che il downvote derivi dall'uso di "compile" invece di "assemblare" o qualsiasi altra cosa: lezione appresa: polacco il mio inglese. Sono comunque soddisfatto del contenuto. –

+0

Supponendo che si usi il prefisso LOCK, ovviamente. –

+8

@Daniel: Secondo [questo] (http://stackoverflow.com/questions/3144335/on-a-multicore-x86-is-a-lock-necessario-come-unprefix-to-xchg) il ' il prefisso lock' è implicito per 'xchg' e quindi non è esplicitamente necessario per x86. – Grizzly

12

Secondo Capitolo 8 Bus Chiusura, del Intel 64 e manuale, Volume 3A IA-32 Architetture dello sviluppatore di software

Il modello di memoria-ordinazione impedisce carichi e negozi di essere riordinate bloccato istruzioni che vengono eseguite prima o dopo.

Quindi l'istruzione XCHG bloccata funge da barriera di memoria e non è necessaria alcuna barriera aggiuntiva.

+1

Sì, in base alla sezione 8.1.2.2 del manuale menzionato, l'istruzione 'XCHG' è sempre bloccata se fa riferimento alla memoria, anche se non esiste un prefisso LOCK specificato. Quindi la regola per l'ordine di memoria di cui sopra dovrebbe effettivamente essere applicata e non è necessaria alcuna barriera aggiuntiva. – Eugene

-1

l'istruzione xchg ha un prefisso di blocco implicito in base ai manuali Intel.

Problemi correlati