2011-06-15 5 views
21

OpenMP के लिए, करने के लिए OpenMP निर्दिष्ट करें मेरी कोड काम करता है, अपने निर्देशों (जैसे #pragma omp उन ... के रूप में) का उपयोग किए बिना (, omp_get_thread_num() उदाहरण के लिए) अपने एपीआई में उपयोग कर रहा है जबजीसीसी

  1. क्यों बजाय -fopenmp का उपयोग कर काम नहीं करता है की जीसीसी, के लिए सीधे निर्दिष्ट करने libgomp.a

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello 
    

    जैसे अद्यतन: मैं बस में पाया गया कि libgomp.a को जोड़ने काम नहीं करता है, लेकिन को जोड़ने libgomp.so काम करता है। क्या इसका मतलब है कि ओपनएमपी स्थिर लिंक नहीं हो सकता है?

  2. -fopenmp केवल क्यों काम करता है बिना पुस्तकालय फ़ाइलें

    को निर्दिष्ट
    gcc hello.c -fopenmp -o hello 
    

    अद्यतन: दूसरे शब्दों में, जब -fopenmp का उपयोग कर, क्यों स्पष्ट libgomp.so को जोड़ने की आवश्यकता नहीं है?

  3. क्यों यह भी संकलित करता है:

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello 
    

    इस कोड में उपेक्षा करेंगे OpenMP निर्देशों अगर वहाँ किसी भी?

धन्यवाद और सम्मान!

+0

जीसीसी दस्तावेज़ीकरण से: -फॉपेंम्प ध्वज ओपनएमपी रनटाइम लाइब्रेरी के स्वचालित लिंकिंग के लिए भी व्यवस्थित करता है। यहां देखें: http://gcc.gnu.org/onlinedocs/libgomp/Enabling-OpenMP।एचटीएमएल # सक्षम-ओपनएमपी – 465544

उत्तर

22

सामान्य रूप से, ध्यान रखें कि निर्देश और कार्य अलग-अलग चीजें हैं; पूर्व को -fopenmp द्वारा नियंत्रित किया जाता है और बाद वाले को ओपनएमपी लाइब्रेरी से लिंक करके नियंत्रित किया जाता है।

  1. (टिप्पणियां शामिल करने के लिए अपडेट किया गया) -fopenmp और -static विकल्पों का उपयोग कर स्थिर OpenMP से जोड़ने के लिए प्रयास करें। चूंकि यह -lgomp -lrt का तात्पर्य है, तो निम्न आदेश सही ढंग से संकलित नहीं होगा जबतक कि आप librt.a का स्थान भी निर्दिष्ट नहीं करते हैं।

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello 
    
  2. मैं कल्पना है कि निम्न आदेश सही ढंग से संकलन है, क्योंकि OpenMP पुस्तकालय अपने पुस्तकालय रास्ते में पहले से ही है और अपने सिस्टम के गतिशील लिंकर स्वचालित रूप से libgomp.so के साथ जोड़ने है (टिप्पणी शामिल करने के लिए अद्यतन किया गया)।

    gcc hello.c -fopenmp -o hello 
    
  3. निम्न आदेश शायद ठीक से संकलन है, क्योंकि यह OpenMP (libgomp.so) के लिए साझा वस्तु लेकर जाती है। ध्यान दें कि -static विकल्प उपयोग नहीं किया गया है।

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello 
    

    आप -fopenmp विकल्प निर्दिष्ट नहीं करते हैं, तो OpenMP निर्देशों पर ध्यान नहीं दिया जाना चाहिए।

+0

धन्यवाद! मैं एपीआई और निर्देशों के बिना कोड पर विचार कर रहा हूं। (1) मैंने पाया कि libgomp.a से लिंक करना काम नहीं करता है, लेकिन libgomp.so से लिंक करता है। क्या इसका मतलब है कि ओपनएमपी स्थिर लिंक नहीं हो सकता है? (2) -fopenmp का उपयोग करते समय, libgomp.so के लिए स्पष्ट लिंक क्यों आवश्यक नहीं है? – Tim

+3

(1) आप "-fopenmp -static" का उपयोग कर ओपनएमपी को स्थिर रूप से लिंक कर सकते हैं। आपको क्या मिलेगा कि जब यह निर्दिष्ट किया जाता है तो यह "-lgomp -lrt" का उपयोग करता है। (2) यदि सिस्टम गतिशील लिंकर का समर्थन करता है तो इसका उपयोग किया जाता है और जब आप निर्दिष्ट करते हैं- fopenmp यह libgomp.so से लिंक होगा। – ejd

+0

ऐसा लगता है कि संकलक और लिंकर दोनों को '-fopenmp' ध्वज की आवश्यकता होती है। – Royi