对于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误报数据争报告的数量? 谢谢!