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!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage