Helgrind(Valgrind)和OpenMP(C):避免误报?
Valgrind线程错误检测工具Helgrind的文档,在这里find
警告说,如果你使用GCC编译你的OpenMP代码,GCC的OpenMP运行时库( libgomp.so )会导致数据争用的错误报告混乱,因为它使用primefaces机器指令和Linux futex系统调用而不是POSIX pthreads基元。 它告诉你可以通过使用--disable-linux-futex
configuration选项重新编译GCC来解决这个问题。
所以我试了一下 我使用--disable-linux-futex
configuration选项编译并安装到本地目录( 〜/ GCC_Valgrind / gcc_install )一个新的GCC版本4.7.0(本文最新版本)。 然后,我创build了一个小的OpenMPtesting程序( 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代码中追踪所谓的竞赛。
有没有人find一种方法来减less(如果不是消除的话)来自Helgrind的误报数据竞争报告的数量应用于用GCC编译的OpenMP程序? 谢谢!
对不起,把它作为一个答案,因为它是更多的评论,但它太长,以适应作为评论,所以在这里:
从您引用的网站
GNU OpenMP运行时支持库(GCC的一部分),至less对于GCC版本4.2和4.3。 GNU OpenMP运行时库(libgomp.so)使用primefaces内存指令和futex系统调用的组合来构造它自己的同步原语,这导致了在Helgrind中的混乱,因为它不能“看见”这些原语。
幸运的是,这可以使用configuration时间选项(对于GCC)来解决。 从源代码重buildGCC,并使用–disable-linux-futex进行configuration。 这使得libgomp.so改为使用标准的POSIX线程原语。 请注意,这是使用GCC 4.2.3进行testing的,并没有使用更新的GCC版本进行重新testing。 我们希望听到有关更新版本的任何成功或失败。
正如你在文章中提到的,这与libgomp.so
,但是这是一个共享对象,所以我不知道如何传递-static标志并仍然使用这个库。 我只是误导了?
将使其工作的步骤:
- 使用
--disable-linux-futex
重新编译gcc(包括libgomp) - 确保在编译程序时使用futex free gcc。
- 确保系统在执行程序时加载无futex的libgomp(该库通常位于
GCC-OBJ-DIR/PLATFORM/libgomp/.libs
)。 例如通过设置LD_LIBRARY_PATH
环境variables:
export LD_LIBRARY_PATH =〜/ gcc-4.8.1-nofutex / x86_64-unknown-linux-gnu / libgomp / .libs: