Helgrind(Valgrind)和OpenMP(C):避免误报?

问题描述 投票:39回答:3

[Valgrind线程错误检测工具Helgrind的文档,找到here

警告,如果您使用GCC编译OpenMP代码,则GCC的OpenMP运行时库(libgomp.so)会导致混乱的数据竞争报告,因为它使用了原子机指令和Linux futex系统调用代替了POSIX pthreads原语。它告诉您可以解决此问题,但是,可以使用--disable-linux-futex配置选项重新编译GCC。

所以我尝试了这个。我使用--disable-linux-futex配置选项将新的GCC版本4.7.0(撰写本文时为最新版本)编译并安装到本地目录(〜/ GCC_Valgrind / gcc_install)。然后,我创建了一个小的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代码中发生。然后,我在没有-static标志的情况下编译了[[test1.c,并再次对其运行了Helgrind。这次,我只有9个错误的肯定数据竞争报告,但是仍然太多了,而且,如果没有-static标志,我就无法在libgomp代码中跟踪假设的竞争。

有没有人找到一种方法来减少甚至消除来自Helgrind的误报数据竞赛报告的数量,该报告适用于使用GCC编译的OpenMP程序?谢谢!
c openmp valgrind race-condition false-positive
3个回答
2
投票

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.