[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代码中跟踪假设的竞争。