2009-09-12 18 views
35

Microsoft offre la funzione InterlockedCompareExchange per l'esecuzione di operazioni di confronto e scambio atomiche. C'è anche un _InterlockedCompareExchangeintrinseco.requisiti di allineamento per le istruzioni atomiche x86

Su x86 questi sono implementati utilizzando l'istruzione cmpxchg.

Tuttavia, leggendo la documentazione su questi tre approcci, non sembrano concordare i requisiti di allineamento.

Intel reference manual non dice nulla circa l'allineamento (diverso da quello di controllo se allineamento è attivata e un riferimento di memoria non allineato è fatto, viene generata un'eccezione)

Ho anche guardato il prefisso lock, in cui si afferma espressamente che

l'integrità del prefisso serratura è non influenzata dall'allineamento del campo di memoria.

(sottolineatura mia)

Così Intel sembra dire che l'allineamento è irrilevante. L'operazione sarà atomica, non importa quale.

La documentazione intrinseca _InterlockedCompareExchange dice anche nulla di allineamento, tuttavia la funzione InterlockedCompareExchange afferma che

I parametri per questa funzione devono essere allineati su un limite di 32 bit; in caso contrario, la funzione si comporterà in modo imprevedibile sui sistemi x86 multiprocessore e su tutti i sistemi non x86.

Quindi cosa dà? I requisiti di allineamento per InterlockedCompareExchange servono solo per assicurarsi che la funzione funzioni anche su CPU pre-486 in cui l'istruzione cmpxchg non è disponibile? Sembra probabile sulla base delle informazioni di cui sopra, ma mi piacerebbe essere sicuro prima di fare affidamento su di esso. :)

Oppure l'allineamento richiesto dall'ISA per garantire l'atomicità, e sto solo cercando i posti sbagliati nei manuali di riferimento di Intel?

risposta

9

Il PDF you are quoting from è del 1999 e CHIARAMENTE obsoleto.

up-to-date Intel documentation, in particolare Volume-3A racconta una storia diversa.

Ad esempio, su un processore Core-i7, ANCORA devi assicurarti che i tuoi dati non si estendano oltre le linee della cache, altrimenti l'operazione NON è garantita per essere atomica.

Su 3A Volume, la programmazione del sistema, per x86/x64 Intel afferma chiaramente:

8.1.1 garantito Operazioni atomiche

Il processore Intel486 (e processori più recenti da allora) garantisce che il seguente base operazioni di memoria saranno sempre effettuati in modo atomico:

  • lettura o la scrittura di un byte
  • Re ADing o scrivere una parola allineate su un 16-bit di confine
  • lettura o scrittura di una doppia parola allineate su un 32-bit di confine

Il processore Pentium (e nuovi processori dal) garantisce che le seguenti operazioni di memoria aggiuntive sarà sempre effettuata atomicamente:

  • lettura o scrittura di un quadword allineato su un limite di 64 bit
  • 16 bit accede a locazioni di memoria non memorizzati nella cache che si adattano all'interno di un bus dati a 32 bit
  • 0.123.516,410617 millions

I processori della famiglia P6 (e trasformatori filtrate dal) garantiscono che il seguente funzionamento della memoria supplementare sarà sempre effettuata atomicamente:

  • Unaligned 16, 32, e 64 bit accede alla cache la memoria che si adattano all'interno di una cache linea

Accessi alla memoria cacheable che sono divisi attraverso le linee di cache e confini di pagina non sono garantiti per essere atomica da parte del processore Intel core 2 Duo, Intel® Atom ™, Intel core Processori Duo, Pentium M, Pentium 4, Intel Xeon, P6, Pentium e Intel486. Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, e processori della famiglia P6 forniscono segnali di controllo bus che consentono ai sottosistemi di memoria esterna di effettuare accessi split atomici; tuttavia, i dati non allineato accede saranno seriamente compromettere le prestazioni del processore e deve essere evitato

+1

Il testo che cito sopra è tratto dai manuali Intel e indica chiaramente i diversi requisiti di allineamento per famiglia di processori. Probabilmente avrei dovuto usare una formulazione diversa per esprimere che le informazioni aggiornate di Intel sono molto chiare, immagino ciò che ottieni leggendo un file .pdf del 1999. – damageboy

+7

-1: Hai ottenuto la sezione sbagliata dal manuale giusto. Le operazioni di memoria di base e le operazioni atomiche bloccate sono cose diverse. –

+3

@damageboy -1: come giustamente osserva MackieMesser, la tua citazione parla di * operazioni di memoria di base * e non * operazioni atomiche *, cioè operazioni precedute da un 'LOCK', che era ciò che l'OP chiedeva, dato che' LOCK' è ciò che è usato in caso di operazioni atomiche x86. –

5

Vedere this SO question: l'allineamento naturale è importante per le prestazioni ed è richiesto per l'architettura x64 (quindi non sono solo i sistemi PRE-x86, ma anche quelli POST-x86 - x64 può ancora essere un po 'un caso di nicchia ma dopotutto sta crescendo in popolarità ;-); questo potrebbe essere il motivo per cui Microsoft lo documenta come richiesto (difficile trovare documenti sulla decisione di MS di forzare il problema dell'allineamento abilitando il controllo dell'allineamento - che può variare a seconda della versione di Windows, sostenendo nei documenti che l'allineamento è richiesto, MS mantiene il libertà di forzarlo in alcune versioni di Windows anche se non lo hanno forzato su altri).

+1

Grazie. E beh, certo qualcun altro l'aveva già chiesto prima. Non dovrei essere sorpreso ...: p Informazioni su x64, richiede l'allineamento per * tutte * le istruzioni atomiche, anche quelle che non lo richiedevano in modalità a 32 bit? Non che io non ti creda, ma sembra un po 'sorprendente se stanno rompendo la retrocompatibilità come quella. Hai una fonte per questo? – jalf

+1

Non ho informazioni sui problemi di allineamento di x64 tranne Microsoft (vedi anche http://forum.winimage.com/viewtopic.php?t=137 per altre discussioni e indicazioni sull'allineamento x64, oltre l'atomicità). A proposito, quale retrocompatibilità? x64 è una nuova architettura (i chip che eseguono eseguono anche x86 per il vecchio codice a 32 bit) quindi non c'è alcun "backwards" - il codice macchina eseguito in x64 (piuttosto che in modalità legacy x86) deve essere stato scritto/compilato/generato specificamente per questo, non per x86! -) –

+1

Quel link sembra dire che l'allineamento è * solo * richiesto su Itanium, non x64, che è quello che mi aspetterei. Ovviamente ha ancora un (maggiore) impatto sulle prestazioni, ma sarebbe strano se x64 avesse improvvisamente richiesto l'allineamento per le istruzioni che non lo richiedevano in x86. E non importa la retrocompatibilità. Era mezzo brainfart e mezzo irrilevante per la domanda. ;) (Il set di istruzioni è praticamente lo stesso, per quanto ne so. Le modifiche riguardano principalmente l'aggiunta di nuove istruzioni e l'aggiunta di un altro byte di prefisso opzionale per consentire di specificare uno dei nuovi registri) – jalf

3

Le API interbloccate di Microsoft si applicano anche a ia64 (mentre ancora esisteva). Non c'era alcun prefisso di blocco su ia64, solo le istruzioni cmpxchg.acq e cmpxchg.rel (o fetchadd e altre bestie simili), e tutte queste richieste richiedevano allineamento se ricordo correttamente.

+0

ia86 esiste ancora e Windows continua a funzionare, per quanto ne so. Ad ogni modo, la mia domanda riguardava specificamente x86. :) – jalf

+2

re: ia64. Sono abbastanza sicuro che Windows abbia smesso di spedire un sistema operativo per ia64 dopo che Intel ha rilasciato la sua versione di amd64 (x86-64), e nessuna vista né win7 per ia64. Ora ci sono solo le versioni x86 e x86-64 del sistema operativo. Per quanto mi riguarda, uccide effettivamente ia64 (a meno che non si contenga HPUX IPF). re: interbloccato e x86. È un mio ricordo che abbiamo iniziato a vedere le API interbloccate quando Microsoft ha rilasciato la versione ia64 dell'SDK della piattaforma. Se ciò è accurato, probabilmente spiegherebbe perché la documentazione Interlocked non si basa sulla semantica del prefisso LOCK di x86. –

+0

IA64 Windows esisteva fino a Server 2008 R2, che è stato rilasciato appena prima del commento precedente. –

10

x86 fa non richiedono allineamento per l'istruzione cmpxchg. Tuttavia, l'allineamento è consigliato per le prestazioni. Ciò non dovrebbe sorprendere, la compatibilità con le versioni precedenti significa che il software scritto con un manuale di 14 anni fa continuerà ad essere eseguito sui processori di oggi.

Perché esattamente Microsoft richiede l'allineamento non è chiaro dalla loro documentazione. Potrebbe essere per le prestazioni o per supportare architetture RISC o entrambi.

Intel® 64 e IA-32 Architetture dello sviluppatore di software Manuale
Volume 3 (3A): Guida alla programmazione del sistema
gennaio 2013

8.1.2.2 software controllato Bus Blocco

indicare esplicitamente la semantica di LOCK, il software può utilizzare il prefisso LOCK con le seguenti istruzioni quando vengono utilizzate per modificare un percorso di memoria. [...]

• Le istruzioni di scambio (XADD, CMPXCHG e CMPXCHG8B).
• Il prefisso LOCK viene automaticamente assunto per l'istruzione XCHG.
• [...]

[...] L'integrità di un blocco del bus non è influenzata dall'allineamento del campo di memoria . La semantica LOCK viene seguita per tutti i cicli bus , se necessario, per aggiornare l'intero operando. Tuttavia, è consigliabile che gli accessi bloccati siano allineati sui loro confini naturali per prestazioni migliori del sistema :

• Qualsiasi limite per un accesso a 8 bit (bloccato o meno).
• Limite a 16 bit per accesso parola bloccato.
• Limite a 32 bit per gli accessi bloccati di doppia parola.
• Limite a 64 bit per gli accessi bloccati alle parole.

Problemi correlati