在clang或gcc中使用线程清洗剂时是否需要使用-fopenmp

在clang或gcc中使用线程清洗剂时是否需要使用-fopenmp,gcc,clang,openmp,thread-sanitizer,data-race,Gcc,Clang,Openmp,Thread Sanitizer,Data Race,我试图在给定代码段(在ok.c文件中)上使用ThreadSanitarizer,如下所示: 这很好,并且没有检测到数据竞争,但是当我尝试给sanitizer提供-fopenmp选项时,它会在循环中转储可能存在数据竞争位置的终端 clang -fsanitize=thread -fopenmp ok.c -w -I../runtime Terminal output: $ WARNING: ThreadSanitizer: data race (pid=7980) Atomic read o

我试图在给定代码段(在ok.c文件中)上使用ThreadSanitarizer,如下所示:

这很好,并且没有检测到数据竞争,但是当我尝试给sanitizer提供-fopenmp选项时,它会在循环中转储可能存在数据竞争位置的终端

clang -fsanitize=thread -fopenmp ok.c -w -I../runtime

Terminal output:
$
WARNING: ThreadSanitizer: data race (pid=7980)
  Atomic read of size 1 at 0x7d680001f700 by thread T2:
    #0 pthread_mutex_lock <null> (a.out+0x000000439b00)
    #1 __kmp_reap_worker <null> (libomp.so.5+0x0000000477a2)


clang-fsanize=thread-fopenmp ok.c-w-I../runtime
终端输出:
$
警告:ThreadSanitizer:数据争用(pid=7980)
线程T2在0x7D68001F700处读取大小为1的原子:
#0 pthread_mutex_lock(a.out+0x000000439b00)
#1名kmp收割工人(libomp.so.5+0x0000000477a2)
intl_3438[10]//共享
int i;
#pragma-omp并行
对于(i=0;i<10;i++){
l_3438[i]=(-10L);
}
我还尝试使用共享和私有属性来让事情变得更清楚

int l_3438[10]; //shared 
int i;
            #pragma omp parallel for shared(l_3438) private(i)
            for (i = 0; i < 10; i++){
                l_3438[i] = (-10L);
            }

intl_3438[10]//共享
int i;
#共享(l_3438)专用(i)的pragma omp并行
对于(i=0;i<10;i++){
l_3438[i]=(-10L);
}
问题:使用线程消毒剂时是否需要-fopenmp标志?
谢谢。

除非您担心误报(编译器在没有数据争用的情况下诊断数据争用),否则我认为这个问题(如文章所述)应该是相反的。应该是:我应该为openmp程序使用线程消毒剂吗

如果您的目标是检测使用openmp构造可能导致的数据争用,那么您肯定应该在此类程序中使用线程消毒剂


如果您的问题真的是关于在openmp程序中使用线程清理器时避免误报,这将在中介绍

您是否担心会因为误报而导致编译器错误?我不知道它是否给出了误报。任何关于如何检查误报的建议您考虑过了吗。顺便问一下,如何识别误报?在这种情况下,误报是指编译器在出现错误时检测到数据竞争没有数据竞争。我链接到的帖子包含了一个这样的例子。一些线程检查器在OpenMP运行时启动并行区域时识别竞争条件。从主线程到其工作线程之间通常存在一些不受保护的数据交换,这不是真正的竞争,因为OpenMP运行时知道这一点,并且经过精心设计以确保正确。@SameeranJoshi:这是否回答了您的问题?@SameeranJoshi:文章不错。顺便说一句,你可以接受这个答案。看见
int l_3438[10]; //shared 
int i;
            #pragma omp parallel for
            for (i = 0; i < 10; i++){
                l_3438[i] = (-10L);
            }

int l_3438[10]; //shared 
int i;
            #pragma omp parallel for shared(l_3438) private(i)
            for (i = 0; i < 10; i++){
                l_3438[i] = (-10L);
            }