2011-01-27 13 views
5

In base al Manuale per gli sviluppatori di software Intel 64 e IA-32 Architectures, il prefisso di segnale LOCK "assicura che il processore abbia l'uso esclusivo di qualsiasi memoria condivisa mentre il segnale viene asserito". Questo può essere un blocco sotto forma di bus o cache.Intel 64 e IA-32 | Operazioni atomiche inclusa acquisizione/rilascio semantica

Ma - e questo è il motivo per cui sto facendo questa domanda - non è chiaro per me, se questo prefisso fornisce anche una barriera di memoria.

Sto sviluppando con NASM in un ambiente multiprocessore e ho bisogno di implementare operazioni atomiche con acquisizioni opzionali e/o release semantiche.

Quindi, devo utilizzare le istruzioni di MFENCE, SFENCE e LFENCE o sarebbe ridondante?

risposta

6

No, non è necessario utilizzare le istruzioni MFENCE, SFENCE and LFENCE in relazione al prefisso LOCK.

MFENCE, SFENCE and LFENCE istruzioni garantiscono la visibilità della memoria in tutti i core della CPU. Ad esempio l'istruzione MOV non può essere utilizzata con il prefisso LOCK, quindi per essere sicuri che il risultato dello spostamento della memoria sia visibile a tutti i core della CPU, è necessario assicurarsi che la cache della CPU venga scaricata nella RAM e che si raggiunga con le istruzioni.

EDIT: più sulle operazioni atomiche bloccate da manuale Intel:

LOCKED ATOMIC GESTIONE

Il 32 bit IA-32 processori supportano bloccati atomici operazioni su posizioni nel sistema di memoria . Queste operazioni sono tipicamente utilizzato per gestire strutture dati condivise (come semafori, segmento descrittori, segmenti di sistema o pagina tabelle) in cui due o più processori possono cercare simultaneamente modificare lo stesso campo o bandiera. Il processore utilizza tre interdipendenti meccanismi per effettuare bloccato operazioni atomiche:

• operazioni atomiche garantite

• bloccaggio bus, utilizzando il segnale LOCK # e il prefisso istruzione BLOCCO

• protocolli di coerenza cache che assicuri che le operazioni atomiche possano essere eseguite su strutture di dati cache (cache lock); questo meccanismo è presente nei processori della famiglia Pentium 4, Intel Xeon e P6

Questi meccanismi sono interdipendenti in nei seguenti modi. Alcune transazioni di memoria di base (come la lettura di o la scrittura di un byte nella memoria di sistema) sono sempre gestite in modo atomico. Cioè, una volta avviato, il processore garantisce che l'operazione sia completata prima di un altro processore o bus è accesso consentito alla posizione di memoria. Il processore supporta anche bus bloccaggio per eseguire memoria selezionata operazioni (ad esempio un'operazione lettura-modifica-scrittura in un spazio comune di memoria) che tipicamente devono essere maneggiati atomicamente, ma sono non gestito automaticamente questo modo . Poiché frequentemente usati memoria posizioni sono spesso memorizzate nella cache L1 o L2 cache un processore di , atomici operazioni possono spesso essere eseguite all'interno cache di un processore senza affermare la serratura bus. Qui protocolli di coerenza della cache del processore del assicurare che altri processori che memorizzazione nella cache stesse posizioni di memoria sono gestiti correttamente durante atomici operazioni vengono eseguite su cache locazioni di memoria.

+0

Sì, lo so. Ma voglio usare (per esempio) un incremento interbloccato per segnalare che sto acquisendo una risorsa. Quindi, ho bisogno di usare "lfence" prima dell'incremento. Perché? Perché devo essere sicuro che tutte le operazioni di carico precedenti siano terminate prima di segnalare. – 0xbadf00d

+0

No, non c'è bisogno di farlo, dovrebbe essere fatto atomicamente. Controlla la mia modifica sulle operazioni atomiche bloccate. –

+0

Ma un'operazione atomica non ha nulla a che fare con il prioer o la memoria e le scritture seguite ?! Controlla questo blog: http://blogs.msdn.com/b/kangsu/archive/2007/07/16/volatile-acquire-release-memory-fences-and-vc2005.aspx – 0xbadf00d

3

No. Dai manuali IA32 (Volume 3A, capitolo 8.2: memoria ordinazione):

legge o scrive non possono essere riordinate con istruzioni di I/O, bloccati istruzioni o serializzare le istruzioni.

Pertanto, un'istruzione di blocco non è necessaria con le istruzioni bloccate.