2012-05-17 33 views
39

的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誤報數據爭報告的數量?謝謝!

+1

只是一個狂猜 - 可能是你的重新編譯的** gcc **鏈接對** libgomp **的重新編譯版本,但動態鏈接器仍然加載提供的系統** libgomp **在運行時?嘗試用'-Wl,-rpath,/ path/to/recompiled/lib'重新編譯。 –

+1

就在方評論 - 給甲骨文的Solaris Studio中嘗試線程分析器工具用於Linux,而工具集仍然是免費的:) –

+4

你看着添加錯誤鎮壓? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

回答

2

對不起,把這個作爲一個答案,因爲它更是一個評論的,但它是太長,不適合作爲一個評論,所以這裏有雲:

從您提到的網站。用於GNU的OpenMP(GCC的一部分),至少對於GCC 4.2和4.3 版本

運行時支持庫。在GNU OpenMP運行時庫(libgomp.so)使用futex的系統調用的 原子存儲器中的指令的組合和構造 其自己的同步原語,這將導致總 混亂,因爲在Helgrind因爲它不能「看到」的那些。

幸運的是,這可以使用一個配置時間選項( GCC)來解決。從源代碼重建GCC,並使用 --disable-linux-futex進行配置。這使得libgomp.so改爲使用標準的POSIX線程原語。請注意,這已使用GCC 4.2.3進行了測試,並未使用更新的GCC版本進行重新測試。我們希望聽到有關最新版本更多的成功或失敗。

如您在您的文章中提到,這與libgomp.so做的,但是這是一個共享對象,所以我看不出你如何能傳遞-static標誌,並且仍然使用該庫。我只是誤導了?

0

步驟,這將使其工作:

  1. 重新編譯GCC使用--disable-linux-futex
  2. 確保您的程序編譯時使用futex的免費的GCC(包括libgomp)。
  3. 確保執行程序(庫通常是GCC-OBJ-DIR/PLATFORM/libgomp/.libs)時,系統會加載futex的免費libgomp。例如通過設置LD_LIBRARY_PATH環境變量:

出口LD_LIBRARY_PATH =〜/ GCC-4.8.1-nofutex/x86_64的未知-Linux的GNU/libgomp /的.libs: