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

时间:2019-04-29 06:42:07

标签: gcc clang openmp thread-sanitizer data-race

我正在尝试在给定的一段代码(在ok.c文件中)上使用threadanitizer:

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

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

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标志? 谢谢。

1 个答案:

答案 0 :(得分:1)

除非您担心误报(当没有数据时,编译器会诊断数据竞争),我认为这个问题(在发布时)应该颠倒。应该是:我应该为openmp程序使用线程清理器吗?

如果您的目的是检测使用openmp构造可能导致的数据争用,那么您绝对应该在此类程序中使用线程清理程序。

如果您的问题确实是关于在openmp程序中使用线程清理程序时如何避免误报,请参见this post