2009-06-01 19 views
41

वैज्ञानिक कंप्यूटिंग में अधिकांश लोग ओपनएमपी को अर्ध-मानक के रूप में उपयोग करते हैं जब साझा स्मृति समांतरता की बात आती है।समांतरता: pthreads या ओपनएमपी?

क्या ओपनएमपी का उपयोग pthreads पर करने के लिए कोई कारण है (पठनीयता के अलावा)? उत्तरार्द्ध अधिक बुनियादी लगता है और मुझे संदेह है कि यह अनुकूलित करने के लिए तेज़ और आसान हो सकता है।

उत्तर

37

यह मूल रूप से आपके समांतरता पर आप किस स्तर पर नियंत्रण चाहते हैं, इस पर उबाल जाता है। ओपनएमपी बहुत अच्छा है अगर आप जो कुछ करना चाहते हैं वह कुछ #pragma स्टेटमेंट्स जोड़ना है और आपके कोड का समांतर संस्करण बहुत तेज़ी से है। यदि आप एमआईएमडी कोडिंग या जटिल क्यूइंग के साथ वास्तव में दिलचस्प चीजें करना चाहते हैं, तो आप अभी भी ओपनएमपी के साथ यह सब कर सकते हैं, लेकिन शायद उस मामले में थ्रेडिंग का उपयोग करने के लिए यह बहुत अधिक सरल है। ओपनएमपी में पोर्टेबिलिटी में भी इसी तरह के फायदे हैं कि विभिन्न प्लेटफार्मों के लिए बहुत से कंपाइलर्स अब इसे समर्थन देते हैं, जैसे कि पर्थ्रेड के साथ।

तो आप बिल्कुल सही हैं - अगर आपको अपने समांतरता पर सुदृढ़ नियंत्रण की आवश्यकता है, तो pthreads का उपयोग करें। यदि आप जितना संभव हो उतना कम काम करना चाहते हैं, तो OpenMP का उपयोग करें।

आप जिस भी तरह से जाने का फैसला करते हैं, शुभकामनाएं!

20

एक अन्य कारण: ओपनएमपी कार्य-आधारित है, पर्थ्रेड थ्रेड आधारित है। इसका मतलब है कि ओपनएमपी कोर की संख्या के रूप में समान संख्या में थ्रेड आवंटित करेगा। तो आपको स्केलेबल समाधान मिलेगा। कच्चे धागे का उपयोग करके इसे करना इतना आसान काम नहीं है।

दूसरी राय: ओपनएमपी कमी सुविधाओं को प्रदान करता है: जब आपको आंशिक परिणामों की गणना थ्रेड में गणना करने और उन्हें गठबंधन करने की आवश्यकता होती है। आप कोड की एकल पंक्ति का उपयोग करके इसे कार्यान्वित कर सकते हैं। लेकिन कच्चे धागे का उपयोग करके आपको और नौकरी करना चाहिए।

बस अपनी आवश्यकताओं के बारे में सोचें और समझने की कोशिश करें: क्या आपके लिए ओपनएमपी पर्याप्त है? आप बहुत समय बचाएंगे।

+0

कृपया पर विस्तृत समाधान scalability। क्या स्केलेबिलिटी केवल संकलन समय पर लागू होती है या यह रनटाइम पर निर्धारित होती है? या रनटाइम स्केलेबिलिटी केवल धागे के साथ किया जा सकता है? – awiebe

+1

आप या तो संकलन या रनटाइम पर बनाए गए धागे की संख्या सेट कर सकते हैं। यदि आप रनटाइम पर नंबर सेट करना चुनते हैं, तो आप थ्रेड की संख्या को पर्यावरण परिवर्तनीय numthreads के माध्यम से सेट कर सकते हैं, जैसे कि इसे आसानी से किसी भी आर्किटेक्चर पर चलने वाले उचित नंबर पर सेट किया जा सकता है। –

+0

यह उत्तर कोई मतलब नहीं है। ओपनएमपी पॉज़िक्स धागे की तरह एक थ्रेडिंग मॉडल है। ओपनएमपी के पहले कुछ संस्करणों के लिए भी काम नहीं था। – Jeff

6

ओपनएमपी को एक कंपाइलर की आवश्यकता होती है जो इसका समर्थन करता है, और pragmas के साथ काम करता है। इसका लाभ यह है कि ओपनएमपी-समर्थन के बिना संकलन करते समय (जैसे पीसीसी या क्लैंग/एलएलवीएम अब तक), कोड अभी भी संकलित होगा। इसके अलावा, what Charles Leiserson wrote about DIY multithreading पर एक नज़र डालें।

लाइब्रेरी पुस्तकालयों के लिए एक पॉज़िक्स मानक (IEEE POSIX 1003.1c) है, जबकि OpenMP specifications कंपेलरों पर लागू किया जाना है; कहा जा रहा है कि, विभिन्न प्रकार के पाथ्रेड कार्यान्वयन (जैसे ओपनबीएसडी रेथ्रेड, एनपीटीएल), और कई कंपाइलर्स हैं जो ओपनएमपी का समर्थन करते हैं (उदाहरण के लिए जीएफसी -फॉपेंम ध्वज, एमएसवीसी ++ 2008)।

पाथ्रेड केवल समानांतरता के लिए प्रभावी होते हैं जब एकाधिक प्रोसेसर उपलब्ध होते हैं, और तभी जब कोड प्रोसेसर की संख्या के लिए अनुकूलित किया जाता है। ओपनएमपी के लिए कोड परिणामस्वरूप अधिक आसानी से मापनीय है। आप कोड को मिश्रित कर सकते हैं जो पीडीड्रेड का उपयोग करके कोड के साथ ओपनएमपी के साथ संकलित करता है।

+1

इस उत्तर का अंतिम अनुच्छेद सभी प्रकार के गलत है। – Jeff

2

आप सवाल हैं "क्या मैं प्रोग्राम सी या असेंबली" प्रश्न के समान है, सी ओपनएमपी और असेंबली पीढ़ी है।

pthreads के साथ आप बहुत बेहतर समांतरता कर सकते हैं, बेहतर अर्थ यह है कि आपके एल्गोरिदम और हार्डवेयर को बहुत कसकर समायोजित किया जाता है। यद्यपि यह बहुत काम करेगा।

pthreads के साथ खराब समांतर कोड का उत्पादन करना भी बहुत आसान है। जब आप समानांतर में एक ही कार्य (जो एक से अधिक डेटा पर, है), SIMD मशीन का एक प्रकार (एकल अनुदेश बहु-डेटा) करने की आवश्यकता

+0

यह मानता है कि ओपनएमपी को पर्थ्रेड का उपयोग करके लागू किया गया है। यह आवश्यक नहीं है, हालांकि आम तौर पर सच है। यदि ओपनएमपी को एक विशेष वास्तुकला पर नंगे धातु में लागू किया गया था, तो यह पर्थ्रेड से तेज हो सकता है। – Jeff

+0

@ जेफ मैं यह नहीं मान रहा हूं कि मेरा जवाब कार्यान्वयन विवरणों से अनिवार्य है। ओपनएमपी और सी pthreads ans असेंबली से अधिक "उच्च स्तरीय" हैं। यही कारण है कि मेरा मानना ​​है कि मेरे दोनों कथन सत्य हैं, इससे कोई फर्क नहीं पड़ता कि कैसे सी और ओपनएमपी लागू किए जाते हैं। – steffen

+0

ऐसा लगता है कि आप ओपनएमपी की सिंटैक्टिक सादगी को रनटाइम पर अर्थपूर्ण बोझ के साथ उलझन में डाल रहे हैं। क्या आपने [POSIX थ्रेड विनिर्देश] की तुलना की है (http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread.h.html) [ओपनएमपी 4 विनिर्देश] के साथ (http://www.openmp.org/ mp-दस्तावेज/OpenMP4.0.0.pdf)? विशेष रूप से, क्या आपने सोचा है कि 'pthread_create()' बनाम 'pragma omp समानांतर {} 'के लिए क्या आवश्यक है? – Jeff

0

OpenMP आदर्श है।

जब आप समानांतर में (काफी अलग) कार्यों को निष्पादित करना चाहते हैं, उदाहरण के लिए, एक थ्रेड में डेटा पढ़ना और किसी अन्य थ्रेड में उपयोगकर्ता के साथ बातचीत करना चाहते हैं तो पर्थ्रेड की आवश्यकता होती है।

http://berenger.eu/blog/c-cpp-openmp-vs-pthread-openmp-or-posix-thread/

+0

ओपनएमपी हमेशा डेटा समांतरता से अधिक समर्थित है। क्या आप वास्तव में ओपनएमपी को समझते हैं? – Jeff

0

तो ऐसा कोई कारण (पठनीयता के अलावा अन्य) pthreads से अधिक OpenMP उपयोग करने के लिए है:

यह पेज देखते हैं?

माइक तरह का इस पर भी चर्चा:

OpenMP भी है कि में पोर्टेबिलिटी में इसी तरह के फायदे हैं विभिन्न प्लेटफार्मों के लिए compilers का एक बहुत है, अब इसे समर्थन pthreads

Crypto++ है के साथ के रूप में क्रॉस-प्लेटफार्म, जिसका मतलब विंडोज, लिनक्स, ओएस एक्स और बीएसडी पर चलता है। यह उन स्थानों पर थ्रेडिंग समर्थन के लिए ओपनएमपी का उपयोग करता है जहां ऑपरेशन महंगा हो सकता है, जैसे मॉड्यूलर एक्सपोनेंटिएशन और मॉड्यूलर गुणा (और जहां समवर्ती ऑपरेशन किया जा सकता है)।

विंडोज़ pthreads का समर्थन नहीं करता है, लेकिन आधुनिक विंडोज कंपाइलर्स OpenMP का समर्थन करते हैं। तो यदि आप गैर-* निक्स के लिए पोर्टेबिलिटी चाहते हैं, तो ओपनएमपी अक्सर एक अच्छा विकल्प होता है।


और माइक के रूप में यह भी कहा:

OpenMP महान अगर सभी आप क्या करना चाहते कुछ #pragma बयान जोड़ सकते हैं और बहुत जल्दी अपने कोड का एक समानांतर संस्करण है है।

नीचे क्रिप्टो की ++ के रूप में RSA signatures and Rabin-Williams signatures... में बर्नस्टीन द्वारा वर्णित भी बदलाव जड़ें का उपयोग कर राबिन विलियम्स हस्ताक्षर में इस्तेमाल मूल्यों precomputing एक उदाहरण है:

void InvertibleRWFunction::Precompute(unsigned int /*unused*/) 
{ 
    ModularArithmetic modp(m_p), modq(m_q); 

    #pragma omp parallel sections 
    { 
     #pragma omp section 
      m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); 
     #pragma omp section 
      m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); 
     #pragma omp section 
      m_pre_q_p = modp.Exponentiate(m_q, m_p - 2); 
    } 
} 

यह माइक अवलोकन के साथ फिट बैठता है - ठीक अनाज नियंत्रण और तुल्यकालन था वास्तव में जरूरत नहीं है। समांतरता का उपयोग निष्पादन को तेज करने के लिए किया गया था, और स्रोत कोड में सिंक्रनाइज़ेशन की कोई कीमत नहीं थी।

और अगर OpenMP उपलब्ध नहीं है, कोड को कम कर देता है:

m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); 
m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); 
m_pre_q_p = modp.Exponentiate(m_q, m_p - 2); 
संबंधित मुद्दे