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 からの偽陽性のデータ競合レポートの数を、なくすことはできないにしても減らす方法を見つけた人はいますか? ありがとう!