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!
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'. –
Solo un commento a parte: provate lo strumento Thread Analyzer di Oracle Solaris Studio per Linux mentre il set di strumenti è ancora libero :) –
Avete visto l'aggiunta di soppressioni di errori? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo