的Valgrind的線程錯誤檢測工具的文檔Helgrind,發現hereHelgrind(Valgrind)和OpenMP(C):避免誤報?
警告說,如果你使用GCC編譯你的OpenMP代碼,GCC的OpenMP運行時庫(libgomp.so)會造成假陽性的混亂報告數據競爭,因爲它使用原子機器指令和Linux futex系統調用而不是POSIX pthreads基元。它告訴你可以通過重新編譯GCC和--disable-linux-futex
配置選項來解決這個問題。
所以我試了這個。我編譯和安裝到本地目錄(〜/ 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誤報數據爭的報道,但仍然太多 - 而且,沒有-static
標誌,我找不到在libgomp代碼應該比賽。
有沒有人找到了一種方法來減少,如果不消除,適用於使用GCC編譯OpenMP程序從Helgrind誤報數據爭報告的數量?謝謝!
只是一個狂猜 - 可能是你的重新編譯的** gcc **鏈接對** libgomp **的重新編譯版本,但動態鏈接器仍然加載提供的系統** libgomp **在運行時?嘗試用'-Wl,-rpath,/ path/to/recompiled/lib'重新編譯。 –
就在方評論 - 給甲骨文的Solaris Studio中嘗試線程分析器工具用於Linux,而工具集仍然是免費的:) –
你看着添加錯誤鎮壓? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo