Can I use Thread Sanitizer for OpenMP programs?

前端 未结 2 329
不思量自难忘°
不思量自难忘° 2020-12-16 18:58

Consider the following example:

#include  

int main () {
    int i = 0;
    #pragma omp parallel
    {
        #pragma omp critical
                 


        
相关标签:
2条回答
  • 2020-12-16 19:47

    Yes, at least with Clang this is relatively easy. You'll need to build libomp (which Clang uses instead of libgomp) with ThreadSanitizer support. This doesn't take that long:

    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 and --target install is optional if you adjust the path to libomp.so below)

    Now running your example works without any errors if you use this libomp.so instead of the system one:

    clang++ -fsanitize=thread -fopenmp main.cpp
    env LD_PRELOAD=/usr/local/lib/libomp.so ./a.out
    
    0 讨论(0)
  • 2020-12-16 19:56

    even with the suppression you will still get false positives on the OpenMP runtime because there are some synchronization mechanism within the runtime that Tsan is not able to understand.

    We worked on the OpenMP runtime to make Tsan understand this synchronization points and remove all the false positives.

    Take a look to this project:

    https://github.com/PRUNER/archer

    Let me know if you need more help.

    Best,

    Simone

    0 讨论(0)
提交回复
热议问题