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

4

1 回答 1

1

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

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

如果您的问题真的是在将线程清理程序与 openmp 程序一起使用时避免误报,这篇文章将对此进行介绍。

于 2019-04-29T07:09:29.447 回答