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