Helgrind (Valgrind) e OpenMP (C): evitando falsos positivos?
A documentação para a ferramenta de detecção de erros de thread Valgrind, Helgrind, encontradaAqui
avisa que, se você usar o GCC para compilar seu código OpenMP, a biblioteca de tempo de execução OpenMP do GCC (libgomp.so) causará um caos de relatórios falsos positivos de corridas de dados, devido ao seu uso de instruções de máquina atômica e chamadas de sistema futex do Linux em vez de primitivas POSIX pthreads. Ele diz que você pode resolver esse problema, entretanto, recompilando o GCC com o--disable-linux-futex
opção de configuração.
Então eu tentei isso. Eu compilei e instalei em um diretório local (~ / GCC_Valgrind / gcc_install) uma nova versão do GCC 4.7.0 (a última versão até o momento da redação deste--disable-linux-futex
opção de configuração. Eu então criei um pequeno programa de teste OpenMP (test1.c) que não tem corridas de dados visíveis:
/* 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;
}
Eu compilei este programa da seguinte forma
~/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
No entanto, recebi 30 relatórios de corridas de dados falso-positivos - todos ocorrendo emlibgomp código. Eu então compileitest1.c sem o-static
flag, e correu Helgrind sobre ele novamente. Desta vez, recebi apenas 9 relatórios de corridas de dados falso-positivos, mas ainda são muitos - e, sem o-static
bandeira, eu não posso rastrear a suposta raça nolibgomp código.
Alguém encontrou uma maneira de reduzir, se não eliminar, o número de relatórios de corrida de dados falso-positivos do Helgrind aplicado a um programa OpenMP compilado com o GCC? Obrigado!