在 clang 或 gcc 中使用线程清理器时是否需要使用 -fopenmp
Is using -fopenmp necessary when using thread sanitizers in clang or gcc
我正在尝试对给定的代码段(在 ok.c 文件中)使用 threadansanitizer,如:
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 标志?
谢谢
除非您担心误报(编译器在存在 none 时诊断数据竞争),否则我发现问题(如发布的那样)应该被推翻。应该是:我应该为 openmp 程序使用线程清理器吗?
如果您的目标是检测使用 openmp 结构可能导致的数据竞争,那么您绝对应该对此类程序使用线程清理器。
如果您的问题真的是关于在将线程清理程序与 openmp 程序一起使用时避免误报, 中对此进行了介绍。
我正在尝试对给定的代码段(在 ok.c 文件中)使用 threadansanitizer,如:
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 标志? 谢谢
除非您担心误报(编译器在存在 none 时诊断数据竞争),否则我发现问题(如发布的那样)应该被推翻。应该是:我应该为 openmp 程序使用线程清理器吗?
如果您的目标是检测使用 openmp 结构可能导致的数据竞争,那么您绝对应该对此类程序使用线程清理器。
如果您的问题真的是关于在将线程清理程序与 openmp 程序一起使用时避免误报,