2011-10-13 14 views
5

Vorrei sapere se ci sono strumenti che possonoStrumenti per visualizzare il grafico di chiamata dell'applicazione C + multithread, copertura del codice multithreaded?

  • aiutare a visualizzare grafico delle chiamate di una grande applicazione multi-threaded.
  • In particolare, voglio vedere come più thread si alternano su un core/esegue simultaneamente su più core.
  • Lo strumento identifica idealmente le possibili condizioni di attesa/deadlock/gara.
  • In definitiva voglio fare la copertura del codice in termini di come i thread interagiscono tra loro durante il runtime (strumento di copertura del codice multi-thread-saggio) in modo da trovare potenziali bug multi-thread.

    Mi scuso se non ho spiegato chiaramente la mia domanda e mi piacerebbe fornire tutti i dettagli.

+0

Buona fortuna, starò a guardare per una risposta ragionevole. Penso che tu abbia bisogno di avere una comprensione completa del thread di esecuzione che stai dividendo in multi. Ci sono molti strumenti per profilare e produrre grafici di esecuzione (fav è il profiler delle prestazioni di Redgate, costoso ma fantastico) ma senza le specifiche che stai girando al buio. – Justin

+0

@Justin Ah Ho dimenticato di dire che l'applicazione su cui sto lavorando è in C++. – fantasticsid

+0

@fantasticid: ho modificato il tuo titolo per riflettere il tuo interesse. –

risposta

1

Il VTune Profiler di Intel può fare un po 'di quello che si chiede. Dal sito VTune:

Serrature e Waits: utilizzare le prestazioni Intel® strumenti di profilazione per trovare rapidamente una comune causa di un rallentamento delle prestazioni in programmi paralleli: in attesa troppo a lungo su un blocco, mentre i nuclei sono sottoutilizzate durante l'attesa.

Timeline visualizza Comportamento Discussione: Vedere quando i thread sono in esecuzione e in attesa, e quando si verificano le transizioni.

Se stavi cercando qualcosa che sia open source/gratuito, allora Valgrind ha uno strumento sperimentale chiamato Helgrind che presumibilmente trova razze nei programmi multi-thread. Non posso commentare, non l'ho usato.

Devo notare che non sono riuscito a utilizzare questi o altri profiler per il debugging e le ottimizzazioni multi-thread e invece ho sviluppato le mie tecniche.

Per identificare la contesa del blocco, la mia tecnica preferita è l'utilizzo di una classe Mutex estesa che registra tutte le operazioni eseguite su ciascuna istanza. Lo faccio in un modo molto leggero, in modo che le prestazioni dell'applicazione non cambino in modo significativo.

Per identificare le condizioni di gara, trovo l'approccio della forza bruta il migliore. Ho appena progettato un test che può essere eseguito per un lungo periodo di tempo, a volte questo è ore o giorni, a seconda dei casi. E faccio sempre il mio test su almeno due piattaforme diverse (più se posso), dal momento che diversi sistemi operativi utilizzano diversi scheduler e questo offre una copertura migliore.

1

Anche se non posso aiutarti (ancora!) Sulla maggior parte dei tuoi problemi, penso che il nostro strumento C++ Test Coverage possa fornire facilmente dati di copertura di prova multithread.

Questo strumento indica il codice sorgente; lo compili e lo fai funzionare. Si finisce con (economici) sonde di strumenti nel codice che rappresentano vari blocchi. La strumentazione registra quali parti del programma vengono eseguite, nominalmente come bit vettoriale con un bit per sonda di strumentazione. Alla fine dell'esecuzione (o quando vuoi), questo vettore bit viene scaricato e un visualizzatore lo mostrerà sovrapposto al codice.

Il trucco per ottenere una copertura di test con multihreading è sapere che forniamo il controllo completo per definire come funzionano le sonde dello strumento; sono macro. Quindi, piuttosto che utilizzando la macro di default essenzialmente

probe[n]=true; 

su un array booleano, è possibile invece implementare

probe[n]|=1<<threadid; 

su un array di int (o qualcosa di più economico abilmente da precomputing questo valore). Questo probabilmente richiede solo poche righe di codice da implementare.

La gente potrebbe notare che questo ha tecnicamente problemi di sincronizzazione. Questo è vero, ma al massimo perde un po 'di dati di copertura e le probabilità contro di esso sono piuttosto elevate. La maggior parte delle persone sono felici con dati "piuttosto buoni" piuttosto che perfetti. Se insisti con lo alla perfezione, pagherai un alto prezzo di sinconizzazione usando alcune istruzioni di aggiornamento atomico .

Forniamo inoltre il controllo della logica di scarico della sonda; è possibile rivederlo per scrivere i dati di copertura specifici del thread (in decine di righe dell'intervallo di codici personalizzato). Il visualizzatore dati di copertura del test ti consentirà di visualizzare la copertura specifica per thread (scegli il vettore di copertura corretto); ha anche una funzione incorporata per facilmente calcolo/visualizzazione intersezione/unione/diff sui vettori di copertura, che ti dà esattamente la tua relazione di copertura per thread.

Problemi correlati