我可以将Thread Sanitizer用于OpenMP程序吗?

Bau*_*gen 8 c c++ gcc thread-sanitizer

考虑以下示例:

#include <iostream> 

int main () {
    int i = 0;
    #pragma omp parallel
    {
        #pragma omp critical
        {
            ++i;
        }
    }
    std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)

编译g++ -fopenmp -fsanitize=thread并运行收益

警告:ThreadSanitizer:数据竞争(pid = 9576)
通过线程T1在0x7ffdc170f600处读取大小4:
#0 main._omp_fn.0(a.out + 0x000000400d20)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0 /libgomp/team.c:118(libgomp.so.1 + 0x00000000f42d)

先前通过线程T2在0x7ffdc170f600大小为4的写入:
#0 main._omp_fn.0(a.out + 0x000000400d35)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:118(libgomp .so.1 + 0x00000000f42d)

位置是主线程的堆栈。

主线程在以下位置创建线程T1(tid = 9578,正在运行):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895(libtsan.so.0 + 0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796(libgomp.so.1 + 0x00000000f98f)
#2 __libc_start_main(libc.so.6 + 0x00000002060f)

主线程在以下位置创建线程T2(tid = 9579,正在运行):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895(libtsan.so.0 + 0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796(libgomp.so.1 + 0x00000000f98f)
#2 __libc_start_main(libc.so.6 + 0x00000002060f)

摘要:ThreadSanitizer:数据争用??:0 main._omp_fn.0

据我所知,这是一个误报。有办法避免这种情况吗?

(使用clang和libomp的东西也可以。)

jha*_*sse 6

是的,至少对于Clang而言,这相对容易。您需要在ThreadSanitizer支持下构建libomp(Clang使用它而不是libgomp)。这不会花那么长时间:

git clone https://github.com/llvm/llvm-project
cd llvm-project
mkdir build
cd build
cmake -DLIBOMP_TSAN_SUPPORT=1 ../openmp
sudo cmake --build . --target install
Run Code Online (Sandbox Code Playgroud)

sudo并且--target install是可选的,如果您将路径调整到libomp.so下面)

现在,如果您使用此示例libomp.so而不是系统示例,则可以运行示例,而不会出现任何错误:

clang++ -fsanitize=thread -fopenmp main.cpp
env LD_PRELOAD=/usr/local/lib/libomp.so ./a.out
Run Code Online (Sandbox Code Playgroud)


小智 5

即使进行了抑制,您仍然会在 OpenMP 运行时上得到误报,因为运行时内存在一些 Tsan 无法理解的同步机制。

我们致力于 OpenMP 运行时,以使 Tsan 了解此同步点并消除所有误报。

看看这个项目:

https://github.com/PRUNER/archer

如果您需要更多帮助,请告诉我。

最好的,

西蒙娜