2012-05-17 26 views
39

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!

+1

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'. –

+1

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 :) –

+4

Czy przyjrzałeś się dodawaniu błędów? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

Odpowiedz

2

Niestety umieścić to jako odpowiedź, ponieważ jest to bardziej z komentarzem, ale to jest zbyt długa, by zmieścić się w komentarzu, tak tu idzie:

Z witryny odwołanie.

wykonawcza biblioteki obsługi GNU OpenMP (część GCC), co najmniej GCC wersji 4.2 i 4.3. Biblioteka runtime GNU OpenMP (libgomp.so) konstruuje własne prymitywy synchronizacji za pomocą kombinacji instrukcji pamięci atomowej i futex syscall, co powoduje całkowity chaos od , ponieważ w Helgrind nie może tego "zobaczyć".

Na szczęście można to rozwiązać za pomocą opcji czasu konfiguracji (dla GCC). Przebuduj GCC ze źródła i skonfiguruj używając --disable-linux-futex. To sprawia, że ​​libgomp.so używa zamiast tego standardowych operacji gwintowania POSIX. Należy zauważyć, że zostało to przetestowane przy użyciu GCC 4.2.3 i nie zostało ponownie przetestowane przy użyciu nowszych wersji GCC. Będziemy wdzięczni za informacje o wszelkich sukcesach lub awariach z najnowszymi wersjami .

jak wspomniałeś w swoim poście, to ma do czynienia z libgomp.so, ale to wspólny przedmiot, więc nie widzę w jaki sposób można przekazać -static flagę i nadal korzystać z tej biblioteki. Czy jestem po prostu wprowadzony w błąd?

0

kroki, które sprawią, że to działa:

  1. Przekompiluj gcc (w tym libgomp) używając --disable-linux-futex
  2. Upewnij użyć futex wolnego gcc podczas kompilacji programu.
  3. Upewnij się, że system uruchomi darmową bibliotekę futif podczas wykonywania programu (biblioteka zwykle znajduje się pod numerem GCC-OBJ-DIR/PLATFORM/libgomp/.libs). Na przykład poprzez ustawienie zmiennej LD_LIBRARY_PATH środowiska:

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