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!
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. –
Nur eine Nebenbemerkung - Probieren Sie das Tool Thread Analyzer von Oracle Solaris Studio für Linux aus, während das Toolset noch frei ist :) –
Haben Sie sich das Hinzufügen von Fehlerunterdrückungen angesehen? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo