Dokumentacja narzędzie wykrywania błędów wątek Valgrind Helgrind, uznał hereHelgrind (Valgrind) i OpenMP (C): unikanie fałszywych trafień?
ostrzega, że jeśli używasz GCC do kompilacji kodu, OpenMP OpenMP runtime library GCC (libgomp.so) spowoduje chaos fałszywy alarm raporty z wyścigów danych, ze względu na użycie instrukcji maszyn atomowych i wywołania systemu Linux futex zamiast POSIX pthreads. Mówi ci, że możesz rozwiązać ten problem, rekompilując GCC z opcją konfiguracji --disable-linux-futex
.
Próbowałem tego. Skompilowałem i zainstalowałem do lokalnego katalogu (~/GCC_Valgrind/gcc_install) nową wersję GCC 4.7.0 (najnowsza wersja tego pisma) z opcją konfiguracji --disable-linux-futex
. Potem stworzył program mały test OpenMP (test1.c), że nie ma widocznych wyścigi danych:
/* 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;
}
skompilowany program następująco
~/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
Jednak mam 30 fałszywie dodatnie dane raporty o wyścigach - wszystkie występujące w kodzie libgomp. Następnie skompilowałem test1.c bez flagi i ponownie uruchomiłem Helgrind. Tym razem dostałem tylko 9 fałszywych pozytywnych raportów o wyścigach danych, ale jest ich wciąż za dużo - i bez flagi nie mogę śledzić rzekomej rasy w kodzie libgomp.
Czy ktoś znalazł sposób na zmniejszenie, jeśli nie wyeliminowanie, liczby fałszywych pozytywnych raportów wyścigów danych z Helgrind zastosowanych do programu OpenMP skompilowanego z GCC? Dzięki!
Tylko dzikie domysły - czy to możliwe, że twoje przekompilowane ** gcc ** łączy się z przekompilowaną wersją ** libgomp **, ale dynamiczny linker nadal ładuje dostarczony system ** libgomp ** w czasie działania? Spróbuj przekompilować z '-Wl, -rpath,/path/to/recompiled/lib'. –
Po prostu komentarz boczny - wypróbuj narzędzie do analizy wątków z Oracle Solaris Studio dla Linuksa, gdy zestaw narzędzi jest wciąż wolny :) –
Czy przyjrzałeś się dodawaniu błędów? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo