40

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 程序?谢谢!

4

3 回答 3

2

很抱歉将其作为答案,因为它更像是评论,但是作为评论太长了,所以这里是:

从您引用的网站。

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 标志并仍然使用该库。我只是被误导了吗?

于 2013-05-31T18:10:09.133 回答
0

使其工作的步骤:

  1. 使用重新编译 gcc(包括 libgomp)--disable-linux-futex
  2. 确保在编译程序时使用 futex free gcc。
  3. 确保系统在执行程序时会加载 futex free libgomp(该库通常位于GCC-OBJ-DIR/PLATFORM/libgomp/.libs. 例如通过设置LD_LIBRARY_PATH环境变量:

导出 LD_LIBRARY_PATH=~/gcc-4.8.1-nofutex/x86_64-unknown-linux-gnu/libgomp/.libs:

于 2013-10-14T11:27:00.143 回答
0

另请注意,如果omp_set_lock在代码中使用,则omp.h必须替换路径,因为锁结构大小不同。见https://xrunhprof.wordpress.com/2018/08/27/tsan-with-openmp/

于 2020-06-01T13:40:12.990 回答