वेलग्रिंड धागा त्रुटि का पता लगाने उपकरण के लिए दस्तावेज़ 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 कोड में अनुमानित दौड़ का पता नहीं लगा सकता।
क्या किसी को भी कम करने का कोई तरीका नहीं मिला है, अगर खत्म नहीं होता है, तो हेल्ग्रिंड से झूठी सकारात्मक डेटा रेस रिपोर्टों की संख्या जीसीसी के साथ संकलित ओपनएमपी प्रोग्राम पर लागू होती है? धन्यवाद!
बस एक जंगली अनुमान - क्या यह हो सकता है कि आपके recompiled ** gcc ** ** libgomp ** के recompiled संस्करण के खिलाफ लिंक है लेकिन गतिशील लिंकर अभी भी रनटाइम पर ** libgomp ** आपूर्ति की गई प्रणाली लोड करता है? '-Wl, -rpath,/path/to/recompiled/lib' के साथ पुन: संकलित करने का प्रयास करें। –
बस एक तरफ टिप्पणी - लिनक्स के लिए ओरेकल सोलारिस स्टूडियो से थ्रेड विश्लेषक उपकरण को आज़माएं, जबकि टूलसेट अभी भी मुफ़्त है :) –
क्या आपने त्रुटि दमन जोड़ने को देखा है? http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress – johlo