我正在尝试在给定的一段代码(在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标志? 谢谢。
答案 0 :(得分:1)
除非您担心误报(当没有数据时,编译器会诊断数据竞争),我认为这个问题(在发布时)应该颠倒。应该是:我应该为openmp程序使用线程清理器吗?
如果您的目的是检测使用openmp构造可能导致的数据争用,那么您绝对应该在此类程序中使用线程清理程序。
如果您的问题确实是关于在openmp程序中使用线程清理程序时如何避免误报,请参见this post。