11

次の例を検討してください。

#include <iostream> 

int main () {
    int i = 0;
    #pragma omp parallel
    {
        #pragma omp critical
        {
            ++i;
        }
    }
    std::cout << i;
}

yieldsでコンパイルしg++ -fopenmp -fsanitize=threadて実行する

WARNING: ThreadSanitizer: data race (pid=9576)
Read of size 4 at 0x7ffdc170f600 by thread T1:
#0 main._omp_fn.0 (a.out+0x000000400d20)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0 /libgomp/team.c:118 (libgomp.so.1+0x00000000f42d)

スレッド T2 による 0x7ffdc170f600 でのサイズ 4 の以前の書き込み:
#0 main._omp_fn.0 (a.out+0x000000400d35)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:118 (libgomp .so.1+0x00000000f42d)

場所はメインスレッドのスタックです。

メインスレッドによって作成されたスレッド T1 (tid=9578、実行中):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so.0+0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1+0x00000000f98f)
#2 __libc_start_main (libc.so.6+0x00000002060f)

メインスレッドによって作成されたスレッド T2 (tid=9579、実行中):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so.0+0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1+0x00000000f98f)
#2 __libc_start_main (libc.so.6+0x00000002060f)

概要: ThreadSanitizer: データ競合 ??:0 main._omp_fn.0

私が見る限り、これは偽陽性です。これを回避する方法はありますか?

(clang と libomp で動作するものでも問題ありません。)

4

2 に答える 2

4

Tsan が理解できない同期メカニズムがランタイム内にあるため、抑制しても OpenMP ランタイムで誤検知が発生します。

Tsan にこの同期ポイントを認識させ、すべての誤検出を排除するために、OpenMP ランタイムに取り組みました。

このプロジェクトを見てください:

https://github.com/PRUNER/archer

さらにサポートが必要な場合はお知らせください。

一番、

シモーネ

于 2016-02-25T06:14:49.693 に答える