2012-05-17 16 views
39

वेलग्रिंड धागा त्रुटि का पता लगाने उपकरण के लिए दस्तावेज़ Helgrind, पाया hereहेल्ग्रिंड (वालग्रिंड) और ओपनएमपी (सी): झूठी सकारात्मक से परहेज?

चेतावनी दी है कि, आप अपने OpenMP कोड, जीसीसी के OpenMP क्रम पुस्तकालय ( libgomp.so) संकलित करने के लिए जीसीसी का उपयोग करता है, तो झूठी सकारात्मक की अराजकता का कारण होगा डेटा रेस की रिपोर्ट, परमाणु मशीन निर्देशों के उपयोग और लिनक्स फूटेक्स सिस्टम कॉल्स के बजाय लिनक्स फूटेक्स सिस्टम कॉल के कारण। यह आपको बताता है कि आप इस समस्या को हल कर सकते हैं, हालांकि, --disable-linux-futex कॉन्फ़िगरेशन विकल्प के साथ जीसीसी को दोबारा जोड़कर।

तो मैंने कोशिश की। मैंने एक स्थानीय निर्देशिका (~/GCC_Valgrind/gcc_install) को संकलित और स्थापित किया है --disable-linux-futex कॉन्फ़िगरेशन विकल्प के साथ एक नया जीसीसी संस्करण 4.7.0 (इस लेखन के रूप में नवीनतम रिलीज)। मैं तो एक छोटा सा 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 ध्वज के बिना संकलित किया, और फिर से हेल्ग्रिंड चलाया। इस बार, मुझे केवल 9 झूठी सकारात्मक डेटा रेस रिपोर्ट मिलीं, लेकिन यह अभी भी बहुत अधिक है - और, -static ध्वज के बिना, मैं libgomp कोड में अनुमानित दौड़ का पता नहीं लगा सकता।

क्या किसी को भी कम करने का कोई तरीका नहीं मिला है, अगर खत्म नहीं होता है, तो हेल्ग्रिंड से झूठी सकारात्मक डेटा रेस रिपोर्टों की संख्या जीसीसी के साथ संकलित ओपनएमपी प्रोग्राम पर लागू होती है? धन्यवाद!

+1

बस एक जंगली अनुमान - क्या यह हो सकता है कि आपके recompiled ** gcc ** ** libgomp ** के recompiled संस्करण के खिलाफ लिंक है लेकिन गतिशील लिंकर अभी भी रनटाइम पर ** libgomp ** आपूर्ति की गई प्रणाली लोड करता है? '-Wl, -rpath,/path/to/recompiled/lib' के साथ पुन: संकलित करने का प्रयास करें। –

+1

बस एक तरफ टिप्पणी - लिनक्स के लिए ओरेकल सोलारिस स्टूडियो से थ्रेड विश्लेषक उपकरण को आज़माएं, जबकि टूलसेट अभी भी मुफ़्त है :) –

+4

क्या आपने त्रुटि दमन जोड़ने को देखा है? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo

उत्तर

2

क्षमा करें, क्योंकि यह एक टिप्पणी की और भी है एक जवाब के रूप में यह डाल करने के लिए है, लेकिन यह एक टिप्पणी के रूप में फिट करने के लिए बहुत लंबा है, इसलिए यहाँ जाता है:

साइट पर आप संदर्भित से।

जीएनयू ओपनएमपी (जीसीसी का हिस्सा) के लिए रनटाइम समर्थन लाइब्रेरी, कम से कम जीसीसी संस्करण 4.2 और 4.3 के लिए। जीएनयू ओपनएमपी रनटाइम लाइब्रेरी (libgomp.so) परमाणु स्मृति निर्देशों और फ्यूटेक्स सिस्कल के संयोजनों का उपयोग करके अपने स्वयं के सिंक्रनाइज़ेशन प्राइमेटिव का निर्माण करता है, जो हेल्ग्रिंड में कुल अराजकता का कारण बनता है क्योंकि यह उनको "देख" नहीं सकता है।

सौभाग्य से, इसे कॉन्फ़िगरेशन-टाइम विकल्प ( जीसीसी के लिए) का उपयोग करके हल किया जा सकता है। स्रोत से जीसीसी को पुनर्निर्माण करें, और - डिज़ाइन-लिनक्स-फ़्यूटेक्स का उपयोग करके कॉन्फ़िगर करें। यह libgomp.so मानक पॉज़िक्स थ्रेडिंग प्राइमेटिव का उपयोग करता है। ध्यान दें कि जीसीसी 4.2.3 का उपयोग करके इसका परीक्षण किया गया था और हाल ही में जीसीसी संस्करणों का उपयोग करके पुनः परीक्षण नहीं किया गया है। हम हाल के संस्करणों के साथ किसी भी सफलता या असफलताओं के बारे में सुनवाई की सराहना करेंगे।

के रूप में आप अपनी पोस्ट में उल्लेख किया है, इस libgomp.so से कोई लेना देना नहीं है, लेकिन एक साझा वस्तु है, तो मैं नहीं दिख रहा है कि कैसे आप स्थैतिक ध्वज पारित कर सकते हैं और अभी भी है कि पुस्तकालय का उपयोग करें। क्या मैं सिर्फ गलत जानकारी प्राप्त कर रहा हूं?

0

कदम जो यह काम कर देगा:

  1. पुनः संकलित (libgomp सहित) का उपयोग कर --disable-linux-futex
  2. जब अपने कार्यक्रम संकलन आप futex मुक्त जीसीसी का उपयोग सुनिश्चित करें कि जीसीसी।
  3. सुनिश्चित करें कि आपके प्रोग्राम को निष्पादित करते समय सिस्टम फ़्यूटेक्स मुक्त libgomp लोड करेगा (लाइब्रेरी आमतौर पर GCC-OBJ-DIR/PLATFORM/libgomp/.libs में है)।

निर्यात LD_LIBRARY_PATH = ~/जीसीसी-4.8.1-nofutex/x86_64-अज्ञात-linux-जीएनयू/libgomp/.libs: LD_LIBRARY_PATH वातावरण चर सेट करके उदाहरण के लिए

संबंधित मुद्दे