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)

Перекомпилируйте gcc (включая libgomp), используя--disable-linux-futex Убедитесь, что при компиляции программы вы используете gcc, свободный от futex. Убедитесь, что система загрузит бесплатную библиотеку futex при выполнении вашей программы (библиотека обычно находится вGCC-OBJ-DIR/PLATFORM/libgomp/.libs). Например, установивLD_LIBRARY_PATH переменная окружения:

export LD_LIBRARY_PATH = ~ / gcc-4.8.1-nofutex / x86_64-unknown-linux-gnu / libgomp / .libs:

что это ответ, так как это скорее комментарий, но он слишком длинный, чтобы его можно было использовать в качестве комментари

С сайта, на который вы ссылались.

иблиотека поддержки @Runtime для GNU OpenMP (часть GCC), по крайней мере для версий GCC 4.2 и 4.3. Библиотека времени выполнения GNU OpenMP (libgomp.so) создает свои собственные примитивы синхронизации, используя комбинации атомарных инструкций памяти и системного вызова futex, что вызывает полный хаос, поскольку в Helgrind они не могут их «увидеть».

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

как вы упомянули в своем посте, это связано сlibgomp.so, но это общий объект, поэтому я не вижу, как вы можете передать флаг -static и все еще использовать эту библиотеку. Я просто дезинформирован?

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