Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Извините, что поставил это как ответ, так как это больше комментарий, но он слишком длинный, чтобы вписаться в комментарий, поэтому здесь идет:

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

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

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

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

Ответ 2

Шаги, которые заставят его работать:

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

экспортировать LD_LIBRARY_PATH = ~/gcc-4.8.1-nofutex/x86_64-unknown-linux-gnu/libgomp/.libs: