programming languages वजन बहु-कोर और संगामिति-भाषाएं, पुस्तकालय और विकास तकनीक




सार्वजनिक पुस्तकालय जयपुर राजस्थान (13)

मैं .NET और समानांतर LINQ के लिए समानांतर एक्सटेंशन पर एक करीबी नजर रखता हूं।

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

क्या भाषाओं, पुस्तकालयों और विकास तकनीकों को आप इस बात से अवगत हैं कि समवर्ती अनुप्रयोग बनाने की पारंपरिक चुनौतियों को कम करते हैं? मैं स्पष्ट रूप से समस्याओं के बारे में सोच रहा हूं जैसे डेडलॉक और रेस परिस्थितियों डिजाइन तकनीकों, पुस्तकालयों, उपकरण, आदि भी दिलचस्प हैं जो वास्तव में लाभ उठाने में मदद करते हैं और यह सुनिश्चित करते हैं कि उपलब्ध संसाधनों का उपयोग किया जा रहा है - बस एक सुरक्षित, मजबूत थ्रेडेड एप्लिकेशन लिखना यह सुनिश्चित नहीं करता है कि यह सभी उपलब्ध कोर का उपयोग कर रहा है

मैंने अभी तक क्या देखा है:

  • एर्लंग : प्रक्रिया आधारित, आईपीसी के पास संदेश, 'संगीता के अभिनेता के मॉडल
  • नाटक : रूबी और पायथन के लिए अभिनेता मॉडल लाइब्रेरी
  • स्काला : कुछ जोड़ा संगामिति समर्थन के साथ जेवीएम के लिए कार्यात्मक प्रोग्रामिंग भाषा
  • क्लोज़र : एक अभिनेता पुस्तकालय के साथ जेवीएम के लिए कार्यात्मक प्रोग्रामिंग भाषा
  • दीमेट : एरलांग की प्रक्रिया दृष्टिकोण और योजना के लिए संदेश भेजने का एक बंदरगाह

आप और क्या जानते हैं, आपके लिए क्या काम किया है और आपको क्या लगता है कि देखने के लिए दिलचस्प है?


मैं। नेट समानांतर एक्सटेंशन के साथ शुरू हुआ। हालांकि, यह एक सीटीपी है और यह प्रत्येक नए realase में बदल रहा है। अब, मैं सी # को ThreadPool, BackgroundWorker और Thread इंस्टेंस के साथ प्रयोग कर रहा हूँ। मैं एक मध्यम आकार के आवेदन में कुछ महत्वपूर्ण प्रक्रियाओं को पुनः लोड कर रहा हूँ। मुझे नहीं पता था कि कहां से शुरू हो हालांकि, मैंने "सी # 2008 और 2005 थ्रेडेड प्रोग्रामिंग" पुस्तक के ई-बुक संस्करण को गैस्टन सी हिलेर - पैकेट पब्लिशिंग द्वारा खरीदा - http://www.packtpub.com/beginners-guide-for-c-sharp- 2008-और-2005-थ्रेड-प्रोग्रामिंग / पुस्तक , 7 दिन पहले मैंने प्रकाशकों से ई-पुस्तक खरीदी, लेकिन अब यह किताब अमेज़ॅन.कॉम पर उपलब्ध है। सी # प्रोग्रामर के लिए अत्यधिक अनुशंसित मैंने कोड डाउनलोड किया और मैंने अभ्यास का पालन करना शुरू कर दिया। अभ्यास करने के लिए बहुत सी कोड के साथ पुस्तक एक अच्छी मार्गदर्शिका है मैंने पहले 6 अध्याय पढ़ा यह कहानियों को बताता है, जबकि यह सबसे कठिन अवधारणाओं को बताती है। अच्छी बात है। पढ़ना अच्छा है मैं अपने कोर 2 क्वाड Q6700 को सीपीयू में 98% सीपीयू उपयोग प्रोग्रामिंग को देख सकता / सकती हूं # 4 समवर्ती धागे का उपयोग कर !! यह मैंने सोचा था जितना आसान है मैं उन परिणामों से प्रभावित हूं जो आप एक ही समय में कई कोर का उपयोग कर प्राप्त कर सकते हैं। मैं उन लोगों को किताब सुझाता हूं जो मल्टिकोर या सी # का उपयोग करके थ्रेडेड प्रोग्रामिंग के साथ शुरुआत में रुचि रखते हैं।


मैंने अजगर के लिए प्रसंस्करण का उपयोग किया है यह थ्रेडिंग मॉड्यूल के एपीआई को मिमिक्स करता है और इस प्रकार उपयोग करने में काफी आसान है।

यदि आप map/imap या जनरेटर / सूची समझ का उपयोग करते हैं, तो आपके कोड को processing का उपयोग करने के लिए सीधा है:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

के साथ समानांतर किया जा सकता है

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

जो आपके द्वारा परिणाम की गणना करने के लिए कई प्रोसेसर का उपयोग करेगा। वहां भी आलसी ( Pool.imap ) और एसिंक्रोनस वेरिएंट ( Pool.imap ) हैं।

एक कतार वर्ग है जो कतार का कार्यान्वयन करता है। Queue.Queue , और कार्यकर्ता जो थ्रेड्स के समान हैं

gotchas

processing fork() पर आधारित है, जिसे विंडोज पर एम्यूलेट किया जाना है ऑब्जेक्ट्स को pickle / pickle माध्यम से स्थानांतरित किया जाता है, इसलिए आपको यह सुनिश्चित करना होगा कि यह काम करता है। संसाधनों का अधिग्रहण करने वाली एक प्रक्रिया को फोर्चना पहले से हो सकता है कि आप जो चाहते हैं (डेटाबेस कनेक्शन नहीं), लेकिन सामान्य तौर पर यह काम करता है। यह इतनी अच्छी तरह से काम करता है कि इसे फास्ट ट्रैक (cf. PEP-317 ) पर पायथन 2.6 में जोड़ दिया गया है।



ओपनएमपी

यह आपके लिए थ्रेड्स संभालता है, इसलिए आप केवल चिंता करते हैं कि समानांतर में आपके सी ++ एप्लिकेशन के किन भाग आप चलाना चाहते हैं।

जैसे।

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

उपरोक्त कोड लूप के लिए कई थ्रेड्स पर चलाएगा जैसा कि आपने openmp रनटाइम को उपयोग करने के लिए कहा है, इसलिए यदि आकार 100 है, और आपके पास एक ट्रैक्टर-कोर बॉक्स है, तो लूप के लिए प्रत्येक कोर पर 25 आइटम चलेंगे।

विभिन्न भाषाओं के लिए कुछ अन्य समानांतर एक्सटेंशन हैं, लेकिन जिन लोगों में मुझे सबसे ज्यादा दिलचस्पी है, वे हैं जो आपके ग्राफिक्स कार्ड पर चलते हैं। यही वास्तविक समानांतर प्रसंस्करण है (उदाहरण: जीपीयू ++ और लिबश )


multiprocessing एक अजगर पुस्तकालय है जो मल्टी-कोर प्रोग्रामिंग को सरल करता है, जैसा कि एक अन्य उत्तर में उल्लेख किया गया है।

अजगर के multiprocessing साथ लिखे गए कार्यक्रम को आसानी से स्थानीय कोर के बजाय क्लाउड पर काम करने के लिए संशोधित किया जा सकता है। piCloud उस पर बादल, बड़े पर मांग प्रसंस्करण शक्ति प्रदान करने का लाभ उठाता है: आपको बस अपने कोड की दो पंक्तियों को संशोधित करने की ज़रूरत है

इसलिए, यहां पर ले जाना है: बहु-कोर के लिए एक पुस्तकालय का चयन करते समय, एक यह पूछ सकता है कि क्या बादल दृष्टिकोण भी समझ जाएगा।


मैं रीआ के बारे में जानता हूं - एक भाषा जो एर्लंग पर आधारित है लेकिन पायथन / रूबी की तरह दिखती है


मैं दो प्रतिमान बदलावों का सुझाव देता हूं:

सॉफ्टवेयर लेनदेन संबंधी मेमोरी

आप सॉफ्टवेयर लेनदेन मेमरी (एसटीएम) की अवधारणा को देख सकते हैं। विचार आशावादी संगामिति का उपयोग करना है : किसी अन्य ऑपरेशन जो दूसरे के समानांतर चलता है, एक अलग लेनदेन में अपना काम पूरा करने की कोशिश करता है; अगर कुछ बिंदु पर एक और लेनदेन किया गया है जो उस लेन-देन को अमान्य करता है जिस पर यह लेन-देन काम कर रहा है, तो लेन-देन का काम फेंक दिया जाता है और लेन-देन फिर से चला जाता है

मुझे लगता है कि विचार के पहले व्यापक रूप से ज्ञात कार्यान्वयन (अगर प्रूफ ऑफ अवधारणा और पहले एक नहीं) हैस्केल में एक है: हाक्सेल में पेपर और ट्रांसेक्शनल मेमोरी के बारे में प्रस्तुतीकरण कई अन्य कार्यान्वयन विकिपीडिया के एसटीएम लेख पर सूचीबद्ध किए गए हैं।

इवेंट लूप और वादे

संगामिति से निपटने का एक और बहुत अलग तरीका [ई प्रोग्रामिंग भाषा] ( http://en.wikipedia.org/wiki/E_(programming_language%29) में लागू किया गया है।

ध्यान दें कि संगामिति के साथ-साथ भाषा डिजाइन के अन्य भागों के साथ व्यवहार करने का उनका तरीका, अभिनेता मॉडल पर भारी रूप से आधारित है।


आपने जावा का उल्लेख किया है, लेकिन आप केवल धागे का उल्लेख करते हैं। क्या आपने जावा की समवर्ती पुस्तकालय को देखा है? यह जावा 5 और इसके बाद के संस्करण के साथ बंडल आता है

यह एक बहुत अच्छी लाइब्रेरी है जिसमें थ्रेडपूल, कॉपी ओन्राइट क्लीक्शन्स का नाम बहुत कुछ है। जावा ट्यूटोरियल पर दस्तावेज़ीकरण देखें। या यदि आप चाहें, तो जावा डॉक्स


मैं लगभग 20 वर्षों के लिए एडीए में समवर्ती प्रोग्रामिंग कर रहा हूं।

भाषा (कुछ पुस्तकालय पर हमला नहीं करते हैं) थ्रेडिंग ("कार्य"), एकाधिक शेड्यूलिंग मॉडल, और एकाधिक सिंक्रनाइज़ेशन पैराडाइम्स का समर्थन करते हैं। आप अपने स्वयं के सिंक्रनाइज़ेशन स्कीमों को प्रीइमिटिव में निर्मित कर सकते हैं।

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


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



में कहना चाहूंगा:

मॉडलः थ्रेड + साझा राज्य, अभिनेता + संदेश पासिंग, लेन-देन मेमोरी, मैप / कम? भाषाएँ: एर्लंग, आईओ, स्कला, क्लोज़र, रीया पुस्तकालय: रिटलैंग, जेटलांग, किलीम, सील्क ++, फोर्क / जॉइन, एमपीआई, कैमेलीिया, टेराकोटा

मैं इस तरह से सामग्री (एर्लंग, स्कला, जावा थ्रेडींग, अभिनेता मॉडल, आदि) के बारे में एक संगामिति लिंक ब्लॉग बनाए रखता हूं और एक जोड़े को एक दिन जोड़ता हूं:

http://concurrency.tumblr.com