40

Valgrind スレッド エラー検出ツール Helgrind のドキュメントは、こちらにあります。

GCC を使用して OpenMP コードをコンパイルする場合、GCC の OpenMP ランタイム ライブラリ ( libgomp.so ) は、POSIX の代わりにアトミック マシン命令と Linux futex システム コールを使用するため、データ競合の偽陽性レポートの混乱を引き起こすことを警告します。 pthreads プリミティブ。--disable-linux-futexただし、構成オプションを使用して GCC を再コンパイルすることで、この問題を解決できることが示されています。

だから私はこれを試しました。ローカル ディレクトリ ( ~/GCC_Valgrind/gcc_install ) に新しい GCC バージョン 4.7.0 (この記事の執筆時点での最新リリース) を--disable-linux-futex構成オプション付きでコンパイルしてインストールしました。次に、目に見えるデータ競合のない小さな OpenMP テスト プログラム ( test1.c ) を作成しました。

/* test1.c */

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#define NUM_THREADS 2

int a[NUM_THREADS];

int main(void) {
        int i;
#pragma omp parallel num_threads(NUM_THREADS)
        {
                int tid = omp_get_thread_num();
                a[tid] = tid + 1;
        }
        for (i = 0; i < NUM_THREADS; i++)
                printf("%d ", a[i]);
        printf("\n");
        return EXIT_SUCCESS;
}

このプログラムを次のようにコンパイルしました

~/GCC_Valgrind/gcc_install/bin/gcc -Wall -fopenmp  -static -L~/GCC_Valgrind/gcc_install/lib64 -L~/GCC_Valgrind/gcc_install/lib -o test1 test1.c

しかし、私は 30 の偽陽性のデータ競合レポートを受け取りました! -- すべてlibgompコードで発生しています。次に、フラグなしでtest1.c-staticをコンパイルし、Helgrindを再度実行しました。今回、偽陽性のデータ競合レポートは 9 件しか得られませんでしたが、それでも多すぎます。フラグがないと、 libgompコード-staticで想定される競合を追跡できません。

GCC でコンパイルされた OpenMP プログラムに適用される Helgrind からの偽陽性のデータ競合レポートの数を、なくすことはできないにしても減らす方法を見つけた人はいますか? ありがとう!

4

3 に答える 3

0

それを機能させる手順:

  1. を使用してgcc(libgompを含む)を再コンパイルします--disable-linux-futex
  2. プログラムをコンパイルするときは、必ず futex フリー gcc を使用してください。
  3. プログラムを実行するときに、システムが futex フリーの libgomp をロードすることを確認してください (ライブラリは通常 にありますGCC-OBJ-DIR/PLATFORM/libgomp/.libs)。たとえば、LD_LIBRARY_PATH環境変数を次のように設定します。

export LD_LIBRARY_PATH=~/gcc-4.8.1-nofutex/x86_64-unknown-linux-gnu/libgomp/.libs:

于 2013-10-14T11:27:00.143 に答える