Valgrind 线程错误检测工具 Helgrind 的文档,可在此处找到
警告说,如果你使用 GCC 编译你的 OpenMP 代码,GCC 的 OpenMP 运行时库 ( libgomp.so ) 将导致数据竞争的误报报告的混乱,因为它使用原子机器指令和 Linux futex 系统调用而不是 POSIX pthreads 原语。但是,它告诉您可以通过使用--disable-linux-futex
配置选项重新编译 GCC 来解决此问题。
所以我尝试了这个。我使用配置选项编译并安装到本地目录(~/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代码中追踪假定的竞争。
有没有人找到一种方法来减少(如果不是消除)来自 Helgrind 的误报数据竞争报告的数量,该报告应用于使用 GCC 编译的 OpenMP 程序?谢谢!