Come testare e confrontare le implementazioni di mutex


12

Come dice il titolo: Come testare e confrontare correttamente diverse implementazioni di mutex in c ++?

In sostanza, ho scritto la mia classe simile a std :: mutex per un progetto in esecuzione su un 2 core, armv7 con l'obiettivo di ridurre al minimo l'overhead nel caso non contestato. Ora sto pensando di usare detto mutex in più luoghi e anche in architetture diverse, ma prima di farlo vorrei accertarmene

  • è effettivamente corretto
  • non ci sono casi patologici in cui si comporta molto peggio di uno standard std :: mutex.

Ovviamente, ho scritto alcuni unit test di base e micro-benchmark e tutto sembra funzionare, ma nel codice multi-thread "sembra funzionare" non mi dà molto conforto.

  • Quindi, ci sono tecniche di analisi statiche o dinamiche stabilite?
  • Quali sono le insidie ​​comuni quando si scrivono unit test per le classi mutex?
  • Quali sono i casi limite tipici che dovresti cercare (dal punto di vista delle prestazioni)?

Sto solo usando tipi di libreria standard per l'implementazione, che include operazioni di caricamento e memorizzazione non sequenziali su atomica. Tuttavia, sono principalmente interessato alla consulenza agnostica di implementazione, poiché mi piacerebbe utilizzare lo stesso cablaggio di test anche per altre implementazioni.


2
So che non è necessario ma apprezzerei se i downvoter commentassero quale sia il problema con questa domanda. Sono nuovo di SE e non completamente familiare con le specifiche di questo sito.
MikeMB,

3
Non il votante verso il basso, ma dirò che questo sito è particolarmente negativo per i voti anonimi verso il basso su domande perfettamente valide. Mi sembra che molte persone votino verso il basso in base a quelle che definirei ragioni "religiose". Detto questo, una possibilità è che tu stia chiedendo consigli sugli strumenti, che credo sia disapprovato qui. Ma è solo una supposizione. E molte persone hanno discusso di tali strumenti in altre domande, quindi fai di quello che vuoi.
user1118321

4
In effetti, dai un'occhiata a questo meta post intitolato "Downvoting perché non siamo d'accordo con l'approccio o la logica di Asker".
user1118321

@ user1118321: quel meta post non si adatta a questa domanda poiché IMHO non ha ipotesi imperfette in questa domanda. Tuttavia, due dei 3 voti ravvicinati che vedo attualmente utilizzano il motivo di chiusura predefinito "richiesta di risorse di terze parti". MikeMB, puoi provare a modificare la tua domanda e rimuovere quelle parti da essa, tuttavia nella forma attuale, immagino che la community potrebbe anche chiuderla per essere troppo ampia. Se restringi il focus della domanda e chiedi specificamente cosa vuoi testare e cosa hai provato finora, potresti aumentare le possibilità di sopravvivenza della tua domanda.
Doc Brown,

Un problema con questa domanda è che "Le domande che ci chiedono di trovare o raccomandare strumenti, biblioteche, linguaggi di programmazione, risorse (inclusi libri, blog, tutorial ed esempi) o progetti da intraprendere sono fuori tema qui poiché attraggono risposte supposte che non avrà valore duraturo per gli altri ".
David Hammen,

Risposte:


1

Il problema è complesso:

Alcune fonti di complessità includono:

  • Quanti switch di contesto sono in corso: questo è molto importante a seconda della piattaforma su cui vengono eseguiti questi test. Alcune piattaforme lo gestiscono meglio di altre
  • Sono le funzioni in cui i mutex sono testati in linea o no. cioè il mutex funziona bene solo con un codice ben ottimizzato o ottimizzabile.
  • Questi mutex sono progettati per la localizzazione della cache. Gli errori nella cache riducono significativamente le prestazioni o causano più cambi di contesto. prima e dopo l'inserimento del mutex.
  • Il mutex stesso causerà la perdita della localizzazione della cache. cioè i dati sullo stato mutex sono allocati dinamicamente.
  • Questi mutex funzioneranno bene laddove all'interno del mutex sono presenti gli switch di contesto. cioè io, malloc ecc.
  • Il mutex funzionerà bene se il tempo del kernel è contenuto nell'allocazione e nella dislocazione dinamica della memoria mutex.ie.
  • Le prestazioni sono valide quando si esegue all'interno di VM
  • La distruzione o la costruzione del mutex sono costose, ovvero i dati sullo stato si trovano nella memoria dinamica

1
Non sono sicuro di essere d'accordo con la parte relativa alla costruzione / distruzione. Se un programma crea e distrugge i tuoi mutex continuamente, c'è (imho) qualcosa di sbagliato nel design del design. Ma altrimenti grazie per i suggerimenti.
MikeMB,

-1

La tua idea è molto interessante: un benchmark di conformità rispetto al quale è possibile testare un'implementazione di mutex.

Sfortunatamente, per quanto ho potuto vedere, non esiste un benchmark di conformità ampiamente noto per le implementazioni di mutex. Quindi, immagino che tu abbia tra le mani il problema molto interessante di creare una proposta per tale benchmark di conformità.

E, dal momento che sei stato coinvolto nella creazione di un'implementazione di benchmark, sei il ragazzo.

Se mi permetti un suggerimento, forse potresti iniziare questa ricerca con lo standard POSIX per i thread su un lato e alcuni studi sulla letteratura teorica dell'elaborazione simultanea, come CSP o Communicating Sequential Processes. Questo tipo di articoli di solito affronta i classici problemi contemporanei, come i filosofi da pranzo.

Una loro implementazione potrebbe essere una parte interessante del tuo benchmark di conformità, immagino.


3
Non ti ho sottovalutato, ma questo non sembra rispondere a nessuna delle mie domande.
MikeMB,

Grazie per non aver effettuato il downgrade. E scusami per non aver risposto alle tue domande. Ti dispiacerebbe se ti chiedessi se stai pensando di creare un benchmark di conformità per i mutex?
Hilton Fernandes,

Improbabile. E anche se, l'unico standard a cui tengo è lo standard c ++ (anche se potrebbe essere lo stesso di posix per quanto riguarda i mutex)
MikeMB,

Per qualificare la mia precedente affermazione: se dovessi trovare una buona suite di test per il mio mutex molto probabilmente lo renderò open source, ma dubito molto che avrà la qualità o sarà abbastanza completo da diventare un vero e proprio benchmark di "conformità", che potrebbe essere comunque meglio gestito dall'analisi statica.
MikeMB,

Concordo con te sul fatto che non esiste una buona suite di test per i primitivi mutex. Suppongo che dovrebbe provenire da tre fonti distinte: la teoria dell'elaborazione simultanea, la specifica di un mutex POSIX e gli algoritmi simultanei espressi usando i mutex. Sei d'accordo con questo ?
Hilton Fernandes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.