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の偽陽性データレースレポートの数を減らすことはできますか?ありがとう!
ジャストA野生の推測 - 再コンパイルされた** gcc **が** libgomp **の再コンパイルされたバージョンとリンクしている可能性がありますが、動的リンカは実行時に** libgomp **を提供するシステムをまだロードしていますか? '-Wl、-rpath、/ path/to/recompiled/lib'を使って再コンパイルしてみてください。 –
ちょっとしたコメント - ツールセットがまだフリーの間に、Linux用Oracle Solaris Studioのスレッドアナライザーツールを試してみてください:) –
エラー抑制を追加しましたか? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo