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

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

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

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

/* test1.c */

#include 
#include 
#include 

#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и снова запустил на нем Helgrind. На этот раз я получил только 9 ложноположительных сообщений о гонках данных, но это все равно слишком много, и без флага -staticя не могу отследить предполагаемую гонку в libgomp. код.

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

39
задан Chris 22 May 2013 в 14:03
поделиться