Domanda

Microsoft offre InterlockedCompareExchange per eseguire operazioni atomiche di confronto e scambio. Esiste anche un _InterlockedCompareExchange intrinseca .

Su x86 questi sono implementati usando l'istruzione cmpxchg .

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

Il manuale di riferimento di Intel non dice nulla sull'allineamento (diverso da quello se il controllo dell'allineamento è abilitato e viene creato un riferimento di memoria non allineato, viene generata un'eccezione)

Ho anche cercato il prefisso lock , che afferma specificamente che

  

L'integrità del prefisso LOCK è non influenzata dall'allineamento del campo di memoria.

(sottolineatura mia)

Quindi Intel sembra dire che l'allineamento è irrilevante. L'operazione sarà atomica, qualunque cosa accada.

Anche la documentazione intrinseca _InterlockedCompareExchange non dice nulla sull'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 su sistemi x86 multiprocessore e qualsiasi sistema non x86.

Quindi cosa dà? I requisiti di allineamento per InterlockedCompareExchange sono solo per assicurarsi che la funzione funzioni anche su CPU pre-486 in cui l'istruzione cmpxchg non è disponibile? Ciò sembra probabilmente basato sulle informazioni di cui sopra, ma vorrei esserne sicuro prima di fare affidamento su di esse. :)

O l'ISA richiede l'allineamento per garantire l'atomicità e sto solo cercando i posti sbagliati nei manuali di riferimento di Intel?

È stato utile?

Soluzione

Il PDF da cui stai citando è del 1999 e CHIARAMENTE obsoleto.

La documentazione Intel aggiornata , in particolare Volume-3A racconta una storia diversa.

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

Su Volume 3A, Programmazione di sistema, Per Intel x86 / x64 indica chiaramente:

  

8.1.1 Operazioni atomiche garantite

     

Il processore Intel486 (e processori più recenti da allora) garantisce quanto segue   le operazioni di memoria di base verranno sempre eseguite atomicamente:

     
      
  • Lettura o scrittura di un byte
  •   
  • Lettura o scrittura di una parola allineata su un limite di 16 bit
  •   
  • Lettura o scrittura di una doppia parola allineata su un limite di 32 bit
  •   
     

Il processore Pentium (e processori più recenti da allora) garantisce quanto segue   ulteriori operazioni di memoria verranno sempre eseguite atomicamente:

     
      
  • Lettura o scrittura di una quadword allineata su un limite di 64 bit
  •   
  • Accesso a 16 bit a posizioni di memoria non memorizzate che si inseriscono in un bus dati a 32 bit
  •   
     

I processori della famiglia P6 (e processori più recenti da allora) garantiscono quanto segue   l'operazione di memoria aggiuntiva verrà sempre eseguita atomicamente:

     
      
  • Accesso non allineato a 16, 32 e 64 bit alla memoria cache inserita in una cache   riga
  •   
     

Accesso alla memoria memorizzabile nella cache che è suddivisa tra le righe della cache e i confini della pagina   non sono garantiti atomici da 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 i processori della famiglia P6 forniscono segnali di controllo del bus che consentono la memoria esterna   sottosistemi per rendere atomici gli accessi divisi; tuttavia, gli accessi ai dati non allineati lo faranno   incide gravemente sulle prestazioni del processore e dovrebbe essere evitato

Altri suggerimenti

x86 non non richiede l'allineamento per l'istruzione cmpxchg . Tuttavia, si consiglia l'allineamento per le prestazioni. Ciò non dovrebbe sorprendere, la retrocompatibilità significa che il software scritto con un manuale di 14 anni fa funzionerà ancora sui processori di oggi.

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

  

Manuale per gli sviluppatori del software per architetture Intel® 64 e IA-32
  Volume 3 (3A): Guida alla programmazione del sistema
  Gennaio 2013

     

8.1.2.2 Blocco del bus controllato dal software

     

Per forzare esplicitamente la semantica LOCK, il software può utilizzare il prefisso LOCK con le seguenti istruzioni quando vengono utilizzati per modificare una posizione di memoria. [...]

     

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

     

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

     

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

Vedi questa domanda SO : l'allineamento naturale è importante per le prestazioni ed è richiesto sul architettura x64 (quindi non sono solo i sistemi PRE-x86, ma anche quelli POST-x86 - x64 potrebbe essere ancora un po 'un caso di nicchia ma dopo tutto sta diventando sempre più popolare ;-); questo potrebbe essere il motivo per cui Microsoft lo documenta come richiesto (difficile trovare documenti sul fatto che MS abbia deciso di FORZARE il problema dell'allineamento abilitando il controllo dell'allineamento - che può variare a seconda della versione di Windows; sostenendo nei documenti che è necessario l'allineamento, MS mantiene il libertà di forzarlo in alcune versioni di Windows anche se non lo hanno forzato su altri).

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

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