2014-06-15 16 views
9

Le funzioni pthread di glibc di Linux su x86_64 fungono da recinzioni per accessi di memoria debolmente ordinati? (pthread_mutex_lock/unlock sono le funzioni esatte a cui sono interessato).pthreads v. SSE debole ordine di memoria

SSE2 fornisce alcune istruzioni con ordini di memoria deboli (negozi non temporali come movnt in particolare). Se stai usando queste istruzioni e vuoi garantire che un altro thread/core veda un ordinamento, allora capisco che hai bisogno di una recinzione esplicita per questo, ad es. Un'istruzione di sfence.

Normalmente ci si aspetta che l'API pthread funga da recinzione in modo appropriato. Tuttavia, sospetto che il normale codice C su x86 non generi accessi di memoria debolmente ordinati, quindi non sono sicuro che i pthreads debbano agire come una barriera per accessi debolmente ordinati.

Leggendo attraverso il codice sorgente plyread di glibc, un mutex viene alla fine implementato usando "lock cmpxchgl", almeno sul percorso non indirizzato. Quindi immagino che quello che ho bisogno di sapere è che le istruzioni fungono da recinto per gli accessi debolmente ordinati SSE2?

+0

Beh, nessuno ha risposto così mi sono rimboccato le maniche e ho scritto un programma di test. Progressi finora: ------ * Con gli spinlock pthread, posso facilmente dimostrare che non sono recinzioni. * Non sono riuscito a produrre mutex pthread che non agiscono da recinzioni. ------ Non sono sicuro che l'errore sia dovuto al fatto che i mutex sono recinti o perché sono stato fortunato. Il mio codice di prova è https://gist.github.com/rcls/c855e3e782253e58e046 – user1998586

risposta

4

I magazzini non temporali necessitano dell'ordinazione sfence da ordinare correttamente.

Tuttavia, l'implementazione a livello utente efficiente di un mutex semplice presuppone che venga rilasciata da una semplice scrittura che non implica il flush dei buffer di scrittura, al contrario delle operazioni di lettura-modifica-scrittura atomiche come lock cmpxchg che implicano la memoria piena recinzione.

Quindi si ha una situazione in cui il unlock non ha effetto della semantica store-with-release applicata per i negozi non temporali. Pertanto, questi archivi SSE possono essere riordinati dopo lo sblocco e dopo un altro thread acquisisce il mutex.

+0

Grazie, avevo pensato solo all'operazione di blocco e mi sono persa che la semantica degli ordini dello sblocco dopo il negozio debolmente ordinato è ciò che è fondamentale . – user1998586

+0

E rileggendo il codice sorgente di glibc, questo è coerente con i risultati dei miei test. pthread_mutex_unlock, che sembra agire come una recinzione, utilizza un'istruzione bloccata (via lowlevellock). pthread_spin_unlock utilizza un negozio normale. [Anche se l'altra differenza è che pthread_spin_unlock è più veloce - presumibilmente qualsiasi operazione sufficientemente lenta in pratica dovrebbe comportare una barriera qui, anche se la descrizione architettonica non lo garantisce.] – user1998586