Helgrind (Valgrind) und OpenMP (C): Fehlalarme vermeiden?
Die Dokumentation zum Valgrind Thread Error Detection Tool Helgrind, gefundenHier
warnt davor, dass, wenn Sie GCC zum Kompilieren Ihres OpenMP-Codes verwenden, die OpenMP-Laufzeitbibliothek von GCC (libgomp.so) wird aufgrund der Verwendung von Atomic-Machine-Anweisungen und Linux-Futex-Systemaufrufen anstelle von POSIX-pthreads-Primitiven ein Chaos von falsch-positiven Berichten über Datenrennen verursachen. Sie können dieses Problem jedoch lösen, indem Sie GCC mit dem Befehl neu kompilieren--disable-linux-futex
Konfigurationsoption.
Also habe ich es versucht. Ich kompilierte und installierte in ein lokales Verzeichnis (~ / GCC_Valgrind / gcc_install) eine neue GCC - Version 4.7.0 (die neueste Version zum Zeitpunkt dieses Schreibens) mit der--disable-linux-futex
Konfigurationsoption. Ich habe dann ein kleines OpenMP-Testprogramm erstellt (test1.c), die keine sichtbaren Datenrennen 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 habe dieses Programm wie folgt kompiliert
~/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
Ich habe jedoch 30 falsch positive Daten-Rennberichte erhalten!libgomp Code. Ich habe dann zusammengestellttest1.c ohne das-static
Fahne, und lief Helgrind wieder drauf. Dieses Mal habe ich nur 9 falsch positive Daten erhalten, aber das sind immer noch zu viele - und das ohne die-static
Flagge, ich kann die angebliche Rasse in der nicht verfolgenlibgomp Code.
Hat jemand einen Weg gefunden, um die Anzahl der falsch-positiven Daten-Rennberichte von Helgrind, die auf ein mit GCC kompiliertes OpenMP-Programm angewendet wurden, zu reduzieren oder sogar zu eliminieren? Vielen Dank!