【问题标题】:Is using -fopenmp necessary when using thread sanitizers in clang or gcc在 clang 或 gcc 中使用线程清理器时是否需要使用 -fopenmp
【发布时间】:2019-09-17 18:32:36
【问题描述】:

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

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

【问题讨论】:

  • 您是否担心会因为误报而导致编译器错误?
  • 我不知道它是否给出误报。任何建议如何检查误报
  • 你考虑过这个closely related answer

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


【解决方案1】:

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

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

如果您的问题确实是关于在使用带有 openmp 程序的线程清理程序时避免误报,this post 对此进行了介绍。

【讨论】:

  • 如何识别误报 BTW?
  • 这种情况下的误报是编译器在没有数据竞争的情况下检测到存在数据竞争。我链接到的帖子包含一个这样的例子。
  • 一些线程检查器会在 OpenMP 运行时启动并行区域时识别竞争条件。通常存在一些从主线程到其工作线程的不受保护的数据交换,这不是真正的竞争,因为 OpenMP 运行时知道这一点并且经过精心设计以确保正确。
  • @SameeranJoshi:这能回答你的问题吗?
  • @SameeranJoshi:好文章。顺便说一句,您可以接受/赞成这个答案。见stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2020-12-08
  • 1970-01-01
相关资源
最近更新 更多