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!

questionAnswers(2)

yourAnswerToTheQuestion