【发布时间】:2012-05-25 09:34:25
【问题描述】:
Valgrind 线程错误检测工具 Helgrind 的文档,找到 here
警告说,如果您使用 GCC 编译您的 OpenMP 代码,GCC 的 OpenMP 运行时库 (libgomp.so) 将导致数据争用的误报报告的混乱,因为它使用原子机器指令和 Linux futex 系统调用,而不是 POSIX pthreads 原语。它告诉您,您可以通过使用 --disable-linux-futex 配置选项重新编译 GCC 来解决此问题。
所以我尝试了这个。我使用 --disable-linux-futex 配置选项编译并安装到本地目录 (~/GCC_Valgrind/gcc_install) 新的 GCC 版本 4.7.0(撰写本文时的最新版本)。然后我创建了一个没有可见数据竞争的小型 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 代码中追踪假定的竞争。 p>
是否有人找到了一种方法来减少(如果不能消除)来自 Helgrind 的误报数据竞争报告的数量,该报告应用于使用 GCC 编译的 OpenMP 程序?谢谢!
【问题讨论】:
-
只是一个疯狂的猜测 - 可能是您重新编译的 gcc 链接到重新编译的 libgomp 版本,但动态链接器仍然加载提供的系统libgomp 在运行时?尝试使用
-Wl,-rpath,/path/to/recompiled/lib重新编译。 -
只是附注 - 在工具集仍然免费的情况下尝试使用 Oracle Solaris Studio for Linux 中的线程分析器工具 :)
-
只是为了确定,你能把
tid标记为私人吗? -
@user1202136 你是怎么做到的?
标签: c openmp valgrind race-condition false-positive