-->

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

2019-06-24 13:43发布

对于Valgrind的线程错误检测工具Helgrind,发现该文档在这里

警告说,如果使用GCC编译你的OpenMP代码,GCC的OpenMP运行时库(libgomp.so)会导致数据争的假阳性报告,因为它的使用原子机器指令和Linux futex的系统,混沌调用,而不是POSIX并行线程原语。 它告诉你,你可以解决这个问题,但是,通过与重新编译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代码假定比赛。

有没有人找到了一种方法来减少,如果不消除,适用于使用GCC编译OpenMP程序从Helgrind误报数据争报告的数量? 谢谢!

Answer 1:

对不起,把这个作为一个答案,因为它更是一个评论的,但它是太长,不适合作为一个评论,所以这里有云:

从网站引用你。

用于GNU的OpenMP(GCC的一部分),至少对于GCC版本4.2和4.3的运行时支持库。 在GNU OpenMP运行时库(libgomp.so)构建体使用的原子存储器中的指令和系统调用futex的,这将导致总的混乱,因为在Helgrind因为它不能“看到”的那些组合其自己的同步原语。

幸运的是,这可以使用配置时间选项(GCC)来解决。 从源代码重建GCC,并配置使用--disable-Linux的futex的。 这使得libgomp.so使用标准的POSIX线程,而不是原语。 请注意,这是使用GCC 4.2.3测试,尚未使用较新版本的GCC重新测试。 我们将不胜感激听到任何的成功或失败与较新版本。

如您在您的文章中提到,这与做libgomp.so ,但是这是一个共享对象,所以我看不出你如何能传递-static标志,并且仍然使用该库。 我只是误传?



Answer 2:

步骤,这将使其工作:

  1. 使用重新编译GCC(包括libgomp) --disable-linux-futex
  2. 确保你编译程序时使用futex的免费的GCC。
  3. 确保执行程序(库通常是当系统会加载futex的自由libgomp GCC-OBJ-DIR/PLATFORM/libgomp/.libs )。 例如通过设置LD_LIBRARY_PATH环境变量:

出口LD_LIBRARY_PATH =〜/ GCC-4.8.1-nofutex / x86_64的未知-Linux的GNU / libgomp /的.libs:



文章来源: Helgrind (Valgrind) and OpenMP (C): avoiding false positives?