मैं पिछले कुछ दिनों में एक अजीब समस्या का सामना कर रहा हूं। हम जीसीसी 4.8 का उपयोग करके कुछ पुस्तकालय बनाते हैं जो उनकी कुछ निर्भरताओं को स्थिर रूप से लिंक करते हैं - उदाहरण के लिए। log4cplus या बढ़ावा। इन पुस्तकालयों के लिए हमने बूथ-पायथन का उपयोग करके पाइथन बाइंडिंग बनाई हैं।ओपनएमपी को जोड़ने के बीच अंतर- fopenmp और -lgomp
हर बार ऐसी लाइब्रेरी टीएलएस का उपयोग करती है (जैसे log4cplus इसके स्थिर प्रारंभ में होता है या stdlibC++ अपवाद फेंकने पर करता है - न केवल प्रारंभिक चरण के दौरान) पूरी चीज एक segfault में दुर्घटनाग्रस्त हो जाती है - और हर बार स्थानीय थ्रेड का पता परिवर्तनीय 0.
मैंने पुन: संयोजन की तरह सब कुछ करने की कोशिश की, सुनिश्चित करने के लिए -एफपीआईसी का उपयोग किया जाता है, सुनिश्चित करने के लिए -tls-model = वैश्विक-गतिशील उपयोग किया जाता है, आदि कोई सफलता नहीं। फिर आज मुझे पता चला कि इन दुर्घटनाओं का कारण ओपनएमपी को जोड़ने का हमारा तरीका रहा है। हमने इसे "-fopenmp" का उपयोग करने के बजाय "-lgomp" का उपयोग करके किया था। चूंकि मैंने यह सब बदल दिया है ठीक है - कोई दुर्घटना नहीं, कुछ भी नहीं। ठीक!
लेकिन मैं वास्तव में जानना चाहता हूं कि समस्या का कारण क्या था। तो ओपनएमपी में जोड़ने के लिए इन दो संभावनाओं के बीच क्या अंतर है?
हमारे पास एक सेंटोस 5 मशीन है जहां हमने एक जीसीसी -4.8/ऑप्ट/लोकल/जीसीसी 48 में स्थापित किया है और हम यह भी सुनिश्चित कर रहे हैं कि/opt/local/gcc48 से आने वाले libgomp का उपयोग किया गया था साथ ही libstdC++ वहां से (DL_DEBUG प्रयुक्त)।
कोई विचार? Google पर कुछ भी नहीं मिला - या मैंने गलत कीवर्ड का उपयोग किया :)
-pthread या -lpthread वहां – duselbaer
'-v' के साथ संकलित किया गया था और आउटपुट की तुलना करें ... –
लिंकर विकल्प के रूप में -v जोड़ना दिखाता है कि -फॉपेंम्प अंत में एक -lgomp जोड़ता है। बाकी सब कुछ वही रहता है। बिना -fopenp मेरे पास है "-lstdC++ -lm -lgcc_s -lpthread -lc -lgcc_s" और -fopenmp यह हो जाता है "-lstdC++ -lm -lgomp -lgcc_s -lpthread -lc -lgcc_s" के साथ। मैं अभी भी दुर्घटनाओं का कारण नहीं दिख रहा है क्योंकि इन पुस्तकालयों के सभी जुड़े हुए हैं गतिशील :( – duselbaer