C++ 我可以为OpenMP程序使用线程消毒剂吗?

C++ 我可以为OpenMP程序使用线程消毒剂吗?,c++,c,gcc,thread-sanitizer,C++,C,Gcc,Thread Sanitizer,考虑以下示例: #include <iostream> int main () { int i = 0; #pragma omp parallel { #pragma omp critical { ++i; } } std::cout << i; } #包括 int main(){ int i=0; #pragma-omp并行 { #pragma-omp-

考虑以下示例:

#include <iostream> 

int main () {
    int i = 0;
    #pragma omp parallel
    {
        #pragma omp critical
        {
            ++i;
        }
    }
    std::cout << i;
}
#包括
int main(){
int i=0;
#pragma-omp并行
{
#pragma-omp-critical
{
++一,;
}
}

std::cout即使使用抑制,您仍然会在OpenMP运行时上获得误报,因为运行时中存在Tsan无法理解的某些同步机制

我们在OpenMP运行时工作,以使Tsan了解此同步点并消除所有误报

看看这个项目:

如果你需要更多的帮助,请告诉我

最好的


Simone

是的,至少使用Clang这是相对容易的。您需要使用ThreadSanitarizer支持构建libomp(Clang使用libgomp而不是libgomp)。这不会花那么长时间:

git clone https://github.com/llvm/llvm-project
cd llvm-project
mkdir build
cd build
cmake -DLIBOMP_TSAN_SUPPORT=1 ../openmp
sudo cmake --build . --target install
sudo
--target install
是可选的,如果您将路径调整为下面的
libomp.so

现在,如果您使用此
libomp,那么运行您的示例时不会出现任何错误。因此
而不是系统版:

clang++ -fsanitize=thread -fopenmp main.cpp
env LD_PRELOAD=/usr/local/lib/libomp.so ./a.out

如果你想分析代码,你也需要用TSAN构建OpenMP运行库;否则就添加一个抑制?@KerrekSB我担心这是唯一的答案。在我的Ubuntu 12.04工作机器上构建现代的东西并让它工作不是很有趣。@KerrekSB你能详细说明抑制的东西吗?我需要这样做吗在我们的生产代码中,有很多错误,如果我必须“手工”检查所有错误,消毒剂就会失去它的意义。我认为你应该能够通过代码位置进行抑制。我从来没有这样做过(我写的上一个抑制集是为Valgrind编写的),但请查看wiki:谢谢,我会在有机会的时候查看。可能有点,我现在正在做其他事情,一位同事正在做消毒液的工作。显然,这只适用于64位Intel CPU的Linux。CMake脚本检查
(${CMake_SYSTEM_NAME})是否与“Linux”和${INTEL64}匹配
INTEL64
将为AMD CPU(或其他x86_64 CPU)设置。请参阅llvm projectSure的根CMakeLists.txt。但对我来说,重要的一点是引导Linux,不幸的是,这在macOS上不起作用。我认为这是相关的信息,可以添加到答案中。一旦我上了Linux,这非常有效!非常感谢!