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

39

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

Error: User Rate Limit Exceeded Hristo Iliev
Error: User Rate Limit ExceededtidError: User Rate Limit Exceeded user1202136
Error: User Rate Limit Exceeded autistic
Error: User Rate Limit ExceededgccError: User Rate Limit ExceededlibgompError: User Rate Limit ExceededlibgompError: User Rate Limit Exceeded-Wl,-rpath,/path/to/recompiled/lib. Hristo Iliev
Error: User Rate Limit Exceededvalgrind.org/docs/manual/manual-core.html#manual-core.suppress johlo

Ваш Ответ

2   ответа
2

Runtime support library for GNU OpenMP (part of GCC), at least for GCC versions 4.2 and 4.3. The GNU OpenMP runtime library (libgomp.so) constructs its own synchronisation primitives using combinations of atomic memory instructions and the futex syscall, which causes total chaos since in Helgrind since it cannot "see" those.

Fortunately, this can be solved using a configuration-time option (for GCC). Rebuild GCC from source, and configure using --disable-linux-futex. This makes libgomp.so use the standard POSIX threading primitives instead. Note that this was tested using GCC 4.2.3 and has not been re-tested using more recent GCC versions. We would appreciate hearing about any successes or failures with more recent versions.

libgomp.so

0

Recompile gcc (including libgomp) using --disable-linux-futex Make sure you use the futex free gcc when compiling your program. Make sure the system will load the futex free libgomp when executing your program (the library is usually in GCC-OBJ-DIR/PLATFORM/libgomp/.libs). For example by setting the LD_LIBRARY_PATH environment variable:

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

Похожие вопросы