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

问题描述 投票:1回答:1

我试图在给定的代码片段(在ok.c文件中)使用threadsanitizer:

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

这样可以正常工作,并且没有检测到数据争用,但是当我尝试向清理程序提供-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)


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);
            }

问题:使用线程消毒剂时是否需要-fopenmp标志?谢谢。

gcc clang openmp thread-sanitizer data-race
1个回答
1
投票

除非你担心误报(编译器在没有数据竞争时诊断数据竞赛),否则我发现问题(因为它已发布)应该被颠倒过来。应该是:我应该使用线程清理程序来进行openmp程序吗?

如果您的目标是检测可能因使用openmp结构而导致的数据争用,那么您绝对应该将线程清理程序与此类程序一起使用。

如果你的问题是关于在使用线程清理程序和openmp程序时避免误报,那么this post就会介绍这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.