2012-05-17 17 views
39

La documentazione per lo strumento di rilevamento degli errori filo Valgrind Helgrind, trovato hereHelgrind (Valgrind) e OpenMP (C): evitare falsi positivi?

avverte che, se si utilizza GCC per compilare il codice OpenMP, libreria di runtime OpenMP del GCC (libgomp.so) causerà un caos di falso positivo rapporti di gare di dati, a causa del suo uso di istruzioni di macchine atomiche e chiamate di sistemi futex Linux invece di primitive pthreads POSIX. Ti dice che puoi risolvere questo problema, comunque, ricompilando GCC con l'opzione di configurazione --disable-linux-futex.

Così ho provato questo. Ho compilato e installato in una directory locale (~/GCC_Valgrind/gcc_install) una nuova versione di GCC 4.7.0 (l'ultima release stesura di questo documento), con l'opzione di configurazione --disable-linux-futex. Poi ho creato un programma piccolo test OpenMP (test1.c) che non ha gare di dati visibili:

/* test1.c */ 

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define NUM_THREADS 2 

int a[NUM_THREADS]; 

int main(void) { 
     int i; 
#pragma omp parallel num_threads(NUM_THREADS) 
     { 
       int tid = omp_get_thread_num(); 
       a[tid] = tid + 1; 
     } 
     for (i = 0; i < NUM_THREADS; i++) 
       printf("%d ", a[i]); 
     printf("\n"); 
     return EXIT_SUCCESS; 
} 

ho compilato questo programma come segue

~/GCC_Valgrind/gcc_install/bin/gcc -Wall -fopenmp -static -L~/GCC_Valgrind/gcc_install/lib64 -L~/GCC_Valgrind/gcc_install/lib -o test1 test1.c 

Tuttavia, ho ottenuto 30 dei dati falsi positivi Rapporti di razza! - tutti che si verificano nel codice libgomp. Poi ho compilato test1.c senza la bandiera -static, e corse Helgrind nuovo su di esso. Questa volta, ho avuto solo 9 rapporti di falsi positivi da corsa di dati, ma che è ancora troppi - e, senza la bandiera -static, non riesco a rintracciare il presunto gara nel codice libgomp.

Qualcuno ha trovato un modo per ridurre, se non eliminare, il numero di segnalazioni di corsa dati positivi falsi da Helgrind applicato ad un programma di OpenMP compilato con GCC? Grazie!

+1

Solo un wild guess - potrebbe essere che i link ** gcc ** ricompilati contro la versione ricompilata di ** libgomp ** ma il linker dinamico carichi ancora il sistema fornito ** libgomp ** in fase di runtime? Prova a ricompilare con '-Wl, -rpath,/percorso/per/ricompilare/lib'. –

+1

Solo un commento a parte: provate lo strumento Thread Analyzer di Oracle Solaris Studio per Linux mentre il set di strumenti è ancora libero :) –

+4

Avete visto l'aggiunta di soppressioni di errori? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

risposta

2

Spiacente di mettere questo in come una risposta dal momento che è più di un commento, ma è troppo lungo per essere come un commento, quindi ecco qui:

Dal sito si fa riferimento.

Libreria di supporto di runtime per GNU OpenMP (parte di GCC), almeno per GCC versioni 4.2 e 4.3. La libreria di runtime GNU OpenMP (libgomp.so) costruisce le proprie primitive di sincronizzazione usando combinazioni di istruzioni di memoria atomica e il syscall del futex, che causa il totale del caos poiché in Helgrind poiché non è in grado di "vederle".

Fortunatamente, questo può essere risolto utilizzando un'opzione di configurazione-tempo (per GCC). Ricostruisci GCC dal sorgente e configura usando --disable-linux-futex. Questo fa sì che libgomp.so usi invece le primitive di threading POSIX standard. Si noti che questo è stato testato utilizzando GCC 4.2.3 e non è stato nuovamente testato utilizzando versioni GCC più recenti. Apprezzeremmo sentir parlare di eventuali successi o guasti con più versioni recenti di .

come lei ha ricordato nel tuo post, questo ha a che fare con libgomp.so, ma questo è un oggetto condiviso, quindi non vedo come si può passare il flag -static e ancora usare questa libreria. Sono appena disinformato?

0

passaggi che renderanno il lavoro:

  1. Ricompilate gcc (compresi libgomp) utilizzando --disable-linux-futex
  2. Assicurarsi di utilizzare il gcc libera futex durante la compilazione del programma.
  3. Assicurarsi che il sistema carichi la libgomp futex gratuita quando si esegue il programma (la libreria di solito è in GCC-OBJ-DIR/PLATFORM/libgomp/.libs). Per esempio impostando la variabile LD_LIBRARY_PATH ambiente:

export LD_LIBRARY_PATH = ~/gcc-4.8.1-nofutex/x86_64-unknown-linux-gnu/libgomp/.libs:

Problemi correlati