我们正在使用GCC和英特尔OpenMP。
我知道GCC和GCC OpenMP的组合需要一个特殊的OpenMP构建(使用pthread接口,而不是直接使用futex系统调用)。
是否可以使用线程清理器和GCC +英特尔OpenMP?显然,我不能简单地重新编译英特尔OpenMP库。
我已经开始了一个测试,我得到了这样的错误
WARNING: ThreadSanitizer: data race (pid=15551)
Atomic read of size 1 at 0x7fffec302980 by thread T4:
#0 pthread_mutex_lock ../../../../libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:4250 (libtsan.so.0+0x52d1a)
#1 __kmp_resume_64 <null> (libiomp5.so+0xb7ae3)
Previous write of size 1 at 0x7fffec302980 by thread T7:
#0 pthread_mutex_init ../../../../libsanitizer/tsan/tsan_interceptors_posix.cpp:1227 (libtsan.so.0+0x4c343)
#1 __kmp_suspend_64 <null> (libiomp5.so+0xb587b)
Thread T4 (tid=15590, running) created by main thread at:
#0 pthread_create ../../../../libsanitizer/tsan/tsan_interceptors_posix.cpp:969 (libtsan.so.0+0x5ec85)
#1 __kmp_create_worker <null> (libiomp5.so+0xb1a34)
字符串
我假设任何带有__kmp
前缀的东西都应该是安全的,这个错误是因为Thread Sanitizer没有封装任何__kmp
函数。
1条答案
按热度按时间uqcuzwp81#
首先,TSan本身并不了解OpenMP同步,例如障碍或任务依赖性。我们开发了libarcher作为LLVM的一部分,以将此信息提供给TSan。如果你用
clang -fopenmp -fsanitize=thread
编译一段代码,libarcher会自动加载并支持TSan。(通过导出export ARCHER_OPTIONS=verbose=true
验证加载是否成功)。libarcher需要OpenMP运行时中的OMPT支持,libgomp尚未提供该支持。libarcher还可通过将其作为OMPT工具显式加载,与更新的英特尔OpenMP运行时(2020+)配合使用:
export OMP_TOOL_LIBRARIES=<path-to>/libarcher.so
要获得libarcher,您可以从源代码构建。源代码包含在LLVM/OpenMP项目中:https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.6/openmp-16.0.6.src.tar.xz字符串
我应该将代码安装到openmp-16.0.6/build/install/,所以libarcher应该在openmp-16.0.6/build/install/lib/libarcher.so中
其次,对于OpenMP运行时代码的错误报告问题,我建议
型
这将禁用对由非检测代码导致的任何数据争用的检测。因此,如果链接到其他未插入指令的库(例如,BLAS)也将被忽略。TSan从这些库中获得的图片仅限于拦截的libc函数。