Helgrind (Valgrind) i OpenMP (C): unikanie fałszywych alarmów?
Znaleziono dokumentację narzędzia wykrywania błędów wątku Valgrind Helgrindtutaj
ostrzega, że jeśli użyjesz GCC do skompilowania kodu OpenMP, biblioteka wykonawcza OpenMP GCC (libgomp.so) spowoduje chaos fałszywych pozytywnych raportów o wyścigach danych, z powodu użycia atomowych instrukcji maszynowych i wywołań systemowych futex Linuksa zamiast prymitywów pthreads POSIX. Mówi ci, że możesz rozwiązać ten problem, rekompilując GCC za pomocą--disable-linux-futex
opcja konfiguracji.
Więc spróbowałem tego. Skompilowałem i zainstalowałem w lokalnym katalogu (~ / GCC_Valgrind / gcc_install) nowa wersja GCC 4.7.0 (najnowsza wersja tego pisma) z--disable-linux-futex
opcja konfiguracji. Następnie stworzyłem mały program testowy OpenMP (test1.c), który nie ma widocznych wyścigów 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;
}
Skompilowałem ten program w następujący sposób
~/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
Mam jednak 30 fałszywych raportów z wyścigów danych!libgomp kod. Potem skompilowałemtest1.c bez-static
flagę i ponownie uruchomiłem Helgrinda. Tym razem dostałem tylko 9 fałszywych raportów z wyścigów, ale wciąż jest ich zbyt wiele - i bez-static
flag, nie mogę prześledzić rzekomej rasy wlibgomp kod.
Czy ktoś znalazł sposób na zmniejszenie, jeśli nie wyeliminowanie, liczby fałszywych raportów z wyścigów danych od Helgrind zastosowanych do programu OpenMP skompilowanego z GCC? Dzięki!