Ami*_*ram 39 c valgrind openmp race-condition false-positive
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;
}
Run Code Online (Sandbox Code Playgroud)
我编译了这个程序如下
~/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
Run Code Online (Sandbox Code Playgroud)
但是,我得到了30个误报数据竞赛报告! - 所有这些都发生在libgomp代码中.然后我编译test1.c没有-static
标志,并重新开启它跑Helgrind.这次,我只获得了9个误报数据竞赛报告,但这仍然太多了 - 而且,如果没有-static
标志,我无法追踪libgomp代码中的假设种族.
有没有人找到一种方法来减少(如果不能消除)Helgrind应用于使用GCC编译的OpenMP程序的误报数据竞争报告的数量?谢谢!
很抱歉将其作为答案,因为它更多的是评论,但它太长,无法作为评论,所以这里是:
来自您引用的网站。
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 标志并仍然使用该库。我只是被误导了吗?
归档时间: |
|
查看次数: |
3597 次 |
最近记录: |