Helgrind (Valgrind) и OpenMP (C): избежать ложных срабатываний?

Документация для инструмента обнаружения ошибок потока Valgrind, Helgrind, найденаВот

предупреждает, что, если вы используете GCC для компиляции своего кода OpenMP, библиотека времени выполнения OpenMP GCC (libgomp.so) вызовет хаос ложных положительных сообщений о гонках данных из-за использования атомарных машинных инструкций и системных вызовов Linux futex вместо примитивов POSIX pthreads. Он говорит вам, что вы можете решить эту проблему, перекомпилировав GCC с--disable-linux-futex Вариант конфигурации.

Я попробовал это. Я скомпилировал и установил в локальный каталог (~/GCC_Valgrind/gcc_install) новая версия GCC 4.7.0 (последняя на момент написания) с--disable-linux-futex Вариант конфигурации. Затем я создал небольшую тестовую программу OpenMP (test1.c) который не имеет видимых данных о гонках:

/* 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;
}

Я скомпилировал эту программу следующим образом

~/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

Тем не менее, я получил 30 ложных положительных данных о гонках!libgomp код. Я тогда скомпилировалtest1.c без-static флаг, и снова запустил Хелгринд. На этот раз я получил только 9 ложных положительных отчетов о гонках данных, но это все еще слишком много - и без-static флаг, я не могу проследить предполагаемую гонку вlibgomp код.

Кто-нибудь нашел способ уменьшить, если не устранить, количество ложных положительных отчетов о гонках данных от Helgrind, примененных к программе OpenMP, скомпилированной с GCC? Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос