2009-08-19 14 views
24

मेरे पास ओपनएमपी का उपयोग कर एक सी ++ प्रोग्राम है, जो कई मशीनों पर चलाएगा जिनके पास ओपनएमपी स्थापित हो या नहीं हो।मशीन पर ओपनएमपी को अनदेखा करें जिसमें

मैं अपने कार्यक्रम जानते हैं कि एक मशीन नहीं OpenMP है और उन #include <omp.h>, OpenMP निर्देशों (जैसे #pragma omp parallel ...) और/या पुस्तकालय कार्यों (जैसे tid = omp_get_thread_num();) की उपेक्षा कर सकता है?

+1

कृपया एंड्रयू का जवाब देखें। सबसे अच्छा मैं बता सकता हूं, वह अकेला ही है जिसने वास्तव में प्रश्न का उत्तर दिया (और यह सही ढंग से किया)। यह भी देखें [क्या प्रीप्रोसेसर परिभाषित करता है -फॉपेंम्प प्रदान करता है?] (Http://stackoverflow.com/q/30803126) – jww

उत्तर

1

ओपनएमपी एक कंपाइलर रनटाइम चीज है और प्लेटफ़ॉर्म चीज़ नहीं है।

यानी। यदि आप विजुअल स्टूडियो 2005 या उच्चतर का उपयोग करके अपने ऐप को संकलित करते हैं, तो आपके पास हमेशा ओपनएमपी उपलब्ध है क्योंकि रनटाइम इसका समर्थन करता है। (और यदि एंड-यूज़र में विजुअल स्टूडियो सी रनटाइम स्थापित नहीं है, तो आपका ऐप बिल्कुल काम नहीं करेगा)।

तो, यदि आप इसका उपयोग कर सकते हैं, तो आपको चिंता करने की आवश्यकता नहीं है, यह हमेशा strcmp जैसे कार्यों की तरह होगा। यह सुनिश्चित करने के लिए कि उनके पास सीआरटी है, तो आप विजुअल स्टूडियो को पुनर्वितरण योग्य स्थापित कर सकते हैं।

संपादित करें:

ठीक है, लेकिन जीसीसी 4.1, अपने OpenMP एप्लिकेशन को संकलित करने के इसलिए इस मुद्दे को लक्ष्य मशीन नहीं है में सक्षम नहीं होगा, लेकिन लक्ष्य संकलक। चूंकि सभी कंपाइलर्स में पूर्व-परिभाषित मैक्रोज़ अपना संस्करण देते हैं, तो अपने ओपनएमपी कॉल को #ifdef ब्लॉक के साथ लपेटें। उदाहरण के लिए, जीसीसी संकलक संस्करण की पहचान करने के लिए 3 मैक्रोज़ का उपयोग करता है, __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

मेरी समस्या यह है कि मैं उन मशीनों पर बहु-थ्रेडिंग के बिना प्रोग्राम को चलाने के लिए चाहता हूं, जिनके पास यह नहीं है। संस्करण 4.2.x के नीचे जीसीसी ओपनएमपी का समर्थन नहीं करता है। इसलिए मैं अपना मेकफ़ाइल इसे बताने में सक्षम होना चाहता हूं और संकलन में विफल होने के बजाय अपने प्रोग्राम में ओपनएमपी भाग को अनदेखा करने के लिए g ++ से पूछना चाहता हूं। कोई उपाय? – Tim

+3

-1: कंपाइलर संस्करण पूरी तरह से अपर्याप्त है। दोनों कंपाइलर और रनटाइम को openmp _and_ का समर्थन करना होगा, इसे _enabled_ भी होना चाहिए। एक ही कंपाइलर संस्करण एक कंप्यूटर पर openmp का समर्थन कर सकता है और इसे किसी अन्य पर समर्थन नहीं दे सकता है। '# Pragma' अर्थपूर्ण के लिए –

19

कंपाइलर्स को #pragma निर्देशों को अनदेखा करना चाहिए जिन्हें वे समझ में नहीं आते हैं; यह वाक्यविन्यास का पूरा बिंदु है। और openmp.h में परिभाषित कार्यों में गैर-समानांतर प्रणाली पर सरल अच्छी तरह से परिभाषित अर्थ हैं - विशेष रूप से, हेडर फ़ाइल जांच करेगी कि कंपाइलर ENABLE_OPENMP को परिभाषित करता है और यदि यह सक्षम नहीं है, तो सही फ़ॉलबैक प्रदान करें।

तो, आपको बस लिंक करने के लिए openmp.h की एक प्रति है। यहां एक है: http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html

#if defined(ENABLE_OPENMP) 
#include <omp.h> 
#else 
typedef int omp_int_t; 
inline omp_int_t omp_get_thread_num() { return 0;} 
inline omp_int_t omp_get_max_threads() { return 1;} 
#endif 

पर सबसे खराब है, तो आप सिर्फ उन तीन लाइनों लेते हैं और उन्हें एक डमी openmp.h फाइल में रख सकते हैं, और कहा कि का उपयोग करें:

कोड के संबंधित भाग, हालांकि, सिर्फ इस है। बाकी बस काम करेंगे।

+11

+1। -1 'ENABLE_OPENMP' के लिए, जो मानक अनुपालन नहीं है। इसके बजाय '_OPENMP' का उपयोग करें। – YvesgereY

+0

* "... हेडर फ़ाइल जांच करेगी कि क्या कंपाइलर ENABLE_OPENMP परिभाषित करता है" * - मुझे नहीं लगता कि यह सच है।क्या आप 'ENABLE_OPENMP' के लिए संदर्भ प्रदान कर सकते हैं? मैं इसे प्रीप्रोसेसर परिभाषित नहीं कर सका। देखें [क्या प्रीप्रोसेसर परिभाषित करता है -फॉपेंम्प प्रदान करता है?] (Http://stackoverflow.com/q/30803126) – jww

+0

मैं क्लैंग 3.6.2 और 'क्लैंग ++ -fopenmp' के साथ संकलित कर रहा हूं मुझे बताता है _OPENMP परिभाषित नहीं है। इस विषय पर – Arne

48

OpenMP संकलन पूर्वप्रक्रमक परिभाषा "_OPENMP" कहते हैं, तो आप कर सकते हैं:

#if defined(_OPENMP) 
    #pragma omp ... 
#endif 

कुछ उदाहरणों के लिए, http://bisqwit.iki.fi/story/howto/openmp/#Discussion और कोड जो इस प्रकार है।

+5

#pragma omp की रक्षा करने के लिए यह अनावश्यक है, क्योंकि इस तरह की प्रगति घुसपैठ नहीं कर रही है (ओपनएमडी सक्रिय नहीं होने पर सुरक्षित रूप से छोड़ा गया है)। – YvesgereY

+9

सच है, अगर कोई भी चेतावनी के बिना संकलित करना पसंद करता है - तब भी एक "कंकाल: अज्ञात प्रगति अनदेखा" जैसे एक कंपाइलर संदेश परेशान होगा। –

+2

संकलन चेतावनी के बारे में, मैं इस कारण से '-वनो-अज्ञात-प्रगति' के साथ संकलित करने के लिए उपयोग करता हूं। समस्या: परियोजना में अन्य प्रगति को प्रभावित कर सकते हैं और उपयोगी चेतावनियों को हटा सकते हैं। –

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