2012-05-17 15 views
39

Die Dokumentation für die Helgrind Erkennungs-Tool Valgrind Fadenfehler, hereHelgrind (Valgrind) und OpenMP (C): Vermeidung von Fehlalarmen?

gefunden warnt davor, dass, wenn Sie GCC verwenden Ihre OpenMP-Code, GCC OpenMP Laufzeitbibliothek (libgomp.so) ein Chaos von falsch-positiven verursacht zu kompilieren Berichte von Datenrennen, wegen seiner Verwendung von atomaren Maschinenbefehlen und Linux-Futex-Systemaufrufen anstelle von POSIX-pThreads-Primitiven. Es besagt jedoch, dass Sie dieses Problem lösen können, indem Sie GCC mit der Konfigurationsoption --disable-linux-futex erneut kompilieren.

Also habe ich das versucht. Ich kompilierte und installierte in einem lokalen Verzeichnis (~/GCC_Valgrind/gcc_install) eine neue GCC-Version 4.7.0 (die neueste Version zum jetzigen Zeitpunkt) mit der Konfigurationsoption --disable-linux-futex. Ich habe dann ein kleines OpenMP Testprogramm (test1.c), die keine sichtbaren Daten Rennen hat:

/* 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; 
} 

ich dieses Programm zusammengestellt wie folgt

~/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 

aber ich habe 30 falsch positive Daten Rennberichte! - alle vorkommend in libgomp code. Ich kompilierte dann test1.c ohne die -static Flagge, und lief Helgrind wieder darauf. Dieses Mal bekam ich nur 9 falsch positive Datenrennberichte, aber das ist immer noch zu viel - und ohne die -static Flagge kann ich das angebliche Rennen im libgomp Code nicht verfolgen.

Hat jemand einen Weg gefunden, die Anzahl falscher positiver Datenrennberichte von Helgrind, die auf ein mit GCC erstelltes OpenMP-Programm angewendet wurden, zu reduzieren, wenn nicht zu eliminieren? Vielen Dank!

+1

Nur wilde Vermutung - könnte es sein, dass Ihre neu kompilierten ** gcc ** -Links gegen die neu kompilierte Version von ** libgomp **, aber der dynamische Linker lädt immer noch das mitgelieferte System ** libgomp ** zur Laufzeit? Versuchen Sie, mit '-Wl, -rpath,/path/to/rekompiliert/lib 'neu zu kompilieren. –

+1

Nur eine Nebenbemerkung - Probieren Sie das Tool Thread Analyzer von Oracle Solaris Studio für Linux aus, während das Toolset noch frei ist :) –

+4

Haben Sie sich das Hinzufügen von Fehlerunterdrückungen angesehen? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

Antwort

2

Leider dies als Antwort zu setzen, da es eher ein Kommentar ist, aber es ist zu lange als Kommentar zu passen, geht so hier:

Von der Website, die Sie verweisen.

Laufzeit-Support-Bibliothek für GNU OpenMP (Teil von GCC), zumindest für GCC Versionen 4.2 und 4.3. Die GNU OpenMP-Laufzeitbibliothek (libgomp.so) konstruiert ihre eigenen Synchronisationsgrundelemente unter Verwendung von atomaren Speicherbefehlen und dem Futex-Syscall, was insgesamt seit Chaos in Helgrind verursacht, da es diese nicht "sehen" kann.

Glücklicherweise kann dies mit einer Konfigurationszeitoption (für GCC) gelöst werden. Erstellen Sie GCC aus der Quelle neu, und konfigurieren Sie mithilfe von --disable-linux-futex. Dies führt dazu, dass libgomp.so stattdessen die standardmäßigen POSIX-Threads verwendet. Beachten Sie, dass dies mit GCC 4.2.3 getestet wurde und nicht mit neueren GCC-Versionen erneut getestet wurde. Wir würden uns über irgendwelche Erfolge oder Misserfolge mit mehr aktuellen Versionen freuen.

, wie Sie in Ihrem Beitrag erwähnt, hat dies mit libgomp.so zu tun, aber das ist ein gemeinsam genutztes Objekt, so dass ich sehe nicht, wie Sie die -static Flagge passieren kann und immer noch diese Bibliothek verwenden. Bin ich nur falsch informiert?

0

Schritte, die wird es funktioniert:

  1. Recompile gcc (einschließlich libgomp) mit --disable-linux-futex
  2. Stellen Sie sicher, dass die futex kostenlos gcc verwenden, wenn Ihr Programm kompilieren.
  3. Stellen Sie sicher, dass das System den futex free libgomp lädt, wenn Sie Ihr Programm ausführen (die Bibliothek befindet sich normalerweise in GCC-OBJ-DIR/PLATFORM/libgomp/.libs). Zum Beispiel durch die LD_LIBRARY_PATH Umgebungsvariable:

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