Документация для инструмент обнаружения ошибок потока 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? Спасибо!