2010-10-16 10 views
40

मैं लिनक्स का उपयोग कर सी में एक बहु थ्रेडेड एप्लिकेशन बना रहा हूं।Pthreads बनाम OpenMP

मुझे यकीन है कि मुझे पॉज़िक्स थ्रेड एपीआई या ओपनएमपी एपीआई का उपयोग करना चाहिए या नहीं।

पेशेवरों का उपयोग करने के लिए & विपक्ष क्या हैं?

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

कोई स्पष्ट किया जा सका है कि क्या दोनों एपीआई कर्नेल-स्तर या उपयोगकर्ता के स्तर धागे बनाने?

+0

पुन: आपका संपादन (कर्नेल- या उपयोगकर्ता-स्तर?) - यह कार्यान्वयन पर निर्भर करता है! एक एपीआई बस यही है - एक ** इंटरफ़ेस **। ओपनएमपी कार्यान्वयन नहीं है - [लेकिन ये कुछ कार्यान्वयन हैं] (http://en.wikipedia.org/wiki/OpenMP#Implementations)। (इस विकिपीडिया लेख में भी कुछ जानकारी है [http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library))। –

+0

असल में, यदि आप ओपनएमपी में जो चाहते हैं वह कर सकते हैं, तो आपको इसे ओपनएमपी में करना चाहिए। –

+0

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

उत्तर

50

pthreads और OpenMP दो पूरी तरह से अलग बहु मानदंड प्रतिनिधित्व करते हैं।

Pthreads धागे के साथ काम करने के लिए एक बहुत कम स्तर वाला एपीआई है। इस प्रकार, आपके पास थ्रेड प्रबंधन (निर्माण/शामिल/आदि), म्यूटेक्स आदि पर अत्यधिक सुदृढ़ नियंत्रण है। यह काफी नंगे हड्डियों है।

दूसरी ओर, OpenMP, ज्यादा उच्च स्तर है अधिक पोर्टेबल है और सी यह भी और अधिक आसानी से pthreads से बढ़ाया का उपयोग कर के लिए आप को सीमित नहीं करता। इसका एक विशिष्ट उदाहरण ओपनएमपी की वर्क-शेयरिंग संरचना है, जो आपको सापेक्ष आसानी से कई धागे में काम विभाजित करने देता है। (यह भी विकिपीडिया के pros and cons list देखें।)

जिसके अनुसार, तुम सच में विशेष कार्यक्रम आप लागू कर रहे हैं, या आप इसे कैसे उपयोग करने की योजना के बारे में कोई विस्तार प्रदान की है, तो यह एक दूसरे के ऊपर एपीआई सिफारिश करने के लिए काफी असंभव है।

17

यदि आप ओपनएमपी का उपयोग करते हैं, तो एक ही प्रागमा जोड़ने के समान सरल हो सकता है, और आप रैखिक गति के साथ सही ढंग से बहुप्रचारित कोड के 90% तरीके होंगे। Pthreads के साथ एक ही प्रदर्शन बढ़ावा पाने के लिए बहुत अधिक काम लेता है।

लेकिन हमेशा की तरह, आप pthreads साथ और अधिक लचीलापन मिलता है।

असल में, यह क्या आपके आवेदन है पर निर्भर करता है। क्या आपके पास एक मामूली-समानांतर एल्गोरिदम है? या क्या आपके पास अभी भी कई मनमाने ढंग से कार्य हैं जिन्हें आप एक साथ करना चाहते हैं? कार्यों को एक-दूसरे से बात करने की ज़रूरत है? कितना सिंक्रनाइज़ेशन आवश्यक है?

+2

प्रश्नों के साथ सवालों का जवाब देने के डुप्लिकेट ... tsk;) यह अच्छा होगा अगर आपने स्पष्ट किया कि उन प्रश्नों के उत्तर वास्तव में निर्णय को कैसे प्रभावित करते हैं ओपनएमपी बनाम pthreads का उपयोग करने के लिए। –

7

OpenMP जा रहा है क्रॉस प्लेटफॉर्म के फायदे, और कुछ कार्यों के लिए सरल। यह एक अलग ढंग से सूत्रण, जबकि इसमें आप इस तरह के रूप में इस तरह छोरों के साथ में चलाना के रूप में उच्च स्तर सूत्रण विकल्प,, देता संभालता है:

#pragma omp parallel for 
for (i = 0; i < 500; i++) 
    arr[i] = 2 * i; 

इस अपनी रुचि है, और अगर सी ++ एक विकल्प है, मैं भी चाहते हैं तो Threading Building Blocks की अनुशंसा करें।

पाथ्रेड्स थ्रेड और सिंक्रनाइज़ेशन को स्पष्ट रूप से उत्पन्न करने के लिए निम्न स्तर API है। उस संबंध में, यह अधिक नियंत्रण प्रदान करता है।

+5

POSIX धागे, POSIX मानक का हिस्सा होने के नाते, क्रॉस-प्लेटफ़ॉर्म हैं। ओपनएमपी, किसी भी ऑपरेटिंग सिस्टम या सी भाषा मानक में मौजूद नहीं है, जो मुझे पता है, क्रॉस-प्लेटफ़ॉर्म नहीं है, जब तक कि आपके पास क्रॉस-प्लेटफ़ॉर्म का अर्थ वास्तव में अजीब विचार न हो। –

+4

@ आर। - ओपनएमपी वास्तव में क्रॉस-प्लेटफार्म है, भले ही औपचारिक रूप से मानकीकृत न हो, सी ++ और सी एपीआई दोनों के साथ। सीएफ सी ++ दुनिया में बढ़ावा दें - एक डी ज्यूर मानक नहीं, बल्कि एक वास्तविक तथ्य है। –

+0

@ आर ..: मुझे यकीन नहीं है कि आपका क्या मतलब है, ओपनएमपी सी एपीआई मानक इस स्पेक में उपलब्ध है (http://www.openmp.org/mp-documents/cspec20.pdf)। जब तक आप का मतलब नहीं है, आईईईई/एएनएसआई/आईएसओ द्वारा मानकीकृत नहीं है? – TechZilla

3

यह 2 बातें अपने कोड बेस पर निर्भर करता है और यह के भीतर अपनी जगह। मुख्य प्रश्न हैं- 1) "क्या आप कोड के आधार पर धागे, थ्रेडपूल और नियंत्रण प्राइमेटिव (ताले, घटनाएं इत्यादि) हैं और 2)" क्या आप पुन: प्रयोज्य पुस्तकालयों या सामान्य ऐप्स विकसित कर रहे हैं? "

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

इसके विपरीत, यदि आप समय के लिए दबाए जाते हैं या केवल तीसरे पक्ष के औजारों से कुछ ऐप्स या कुछ विकसित करते हैं, तो OpenMP का उपयोग करें। आप इसे कुछ मैक्रोज़ में लपेट सकते हैं और आपको आवश्यक मूल समांतरता प्राप्त कर सकते हैं।

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

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