2012-05-17 25 views
39

Valgrindのスレッドエラー検出ツールHelgrindのためのドキュメントは、hereHelgrind(Valgrind)とOpenMP(C):誤認を避ける?

は、あなたのOpenMPコードをコンパイルするためにGCCを使用する場合、GCCのOpenMPランタイム・ライブラリー( libgomp.so )は偽陽性の混乱を引き起こすだろう、と警告しましたPOSIX pthreadsプリミティブの代わりに原子機械命令とLinux futexシステムコールを使用しているため、データ競合の報告がありました。しかし、GCCを--disable-linux-futex設定オプションで再コンパイルすることで、この問題を解決できることがわかります。

だから私はこれを試しました。 --disable-linux-futex設定オプションを使用して、ローカルディレクトリ(〜/ GCC_Valgrind/gcc_install)に新しいGCCバージョン4.7.0(この執筆時点での最新リリース)をコンパイルしてインストールしました。私は30偽陽性のデータを得た、しかし

~/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 

を次のように私はこのプログラムをコンパイル

/* 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; 
} 

:私は、目に見えるデータ競合を持たない小さなOpenMPのテストプログラム(Test1.cに)を作成しましたレースレポート! - すべてはlibgompコードにあります。私はtest1.c-staticフラグなしでコンパイルし、もう一度Helgrindを実行しました。今回は、偽陽性のデータレースレポートが9件しかありませんが、まだそれは多すぎます。-staticフラグがなければ、libgompコードで予定されているレースをトレースすることはできません。

GCCでコンパイルされたOpenMPプログラムに適用されたHelgrindの偽陽性データレースレポートの数を減らすことはできますか?ありがとう!

+1

ジャストA野生の推測 - 再コンパイルされた** gcc **が** libgomp **の再コンパイルされたバージョンとリンクしている可能性がありますが、動的リンカは実行時に** libgomp **を提供するシステムをまだロードしていますか? '-Wl、-rpath、/ path/to/recompiled/lib'を使って再コンパイルしてみてください。 –

+1

ちょっとしたコメント - ツールセットがまだフリーの間に、Linux用Oracle Solaris Studioのスレッドアナライザーツールを試してみてください:) –

+4

エラー抑制を追加しましたか? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

答えて

2

それはコメントのより多くのだが、それはので、ここでコメントとして入りきらないのです行くので、答えとしてこれを入れるために申し訳ありません:

あなたは、参照サイトから。

少なくともGCC バージョン4.2および4.3のGNU OpenMP(GCCの一部)のランタイムサポートライブラリ。 GNU OpenMPランタイムライブラリ(libgomp.so) は、 アトミックメモリ命令とfutexシステムコールの組み合わせを使用して独自の同期プリミティブを構築します。これは、Helgrindでは「見る」ことができないため合計で カオスになります。

幸いにも、これは構成時オプション( GCC用)を使用して解決できます。ソースからGCCを再構築し、 --disable-linux-futexを使って設定してください。これにより、libgomp.soは標準のPOSIXスレッディングプリミティブを代わりに使用します。これはGCC 4.2.3を使用してテストされており、最新のGCCバージョンを使用して再テストされていないことに注意してください。最近のバージョンの があれば、どのような成果や失敗についても感謝します。

あなたの記事で述べたように、これはlibgomp.soに関係していますが、それは共有オブジェクトなので、私はあなたが-staticフラグを渡し、まだそのライブラリを使用することができますどのように表示されません。私はちょうど誤報ですか?それを動作させるだろう

0

ステップ:

  1. (libgompを含む)を再コンパイルするgccの--disable-linux-futex
  2. を使用してプログラムをコンパイルするとき、あなたがのfutex無料のgccを使うことを確認してください。
  3. プログラムを実行するときにfutexフリーのlibgompをロードするようにしてください(ライブラリは通常GCC-OBJ-DIR/PLATFORM/libgomp/.libsです)。

輸出LD_LIBRARY_PATH =〜/ GCC-4.8.1-nofutex/x86_64の-未知のlinux-gnuの/ libgomp/.LIBS:LD_LIBRARY_PATH環境変数を設定することにより、例えば

関連する問題