समानांतर वैज्ञानिक संगणना सॉफ्टवेयर विकास भाषा?


18

मैं खरोंच से एक समानांतर वैज्ञानिक संगणना सॉफ्टवेयर विकसित करना चाहता हूं। मैं चाहता हूं कि कुछ विचार किस भाषा पर शुरू हों। कार्यक्रम में फ़ाइलों को txt करने के लिए डेटा पढ़ना / लिखना और समानांतर में भारी गणना करना, कई LU कारक और विरल लीनियर सॉल्वर का उपयोग शामिल है। मैं जो उम्मीदवार समाधान सोच रहा था, वह OpenMP या सह-सरणी, C ++ के साथ Openmp cilk + या TBB, अजगर के साथ Fortran 2003/2008 हैं। कोई अन्य, प्रलेखित, सुझावों का स्वागत है! मैं सी, फोरट्रान और जावा (उस क्रम में) को अच्छी तरह से जानता हूं। मैंने अजगर में कुछ स्क्रिप्टिंग की है, लेकिन बुनियादी चीजें।

मुझे पता है कि फोरट्रान बहुत तेज है, लेकिन, बनाए रखने और समानांतर करने के लिए कठिन है। C ++ को धीमा कहा जाता है जब तक कि आप बाहरी लाइब्रेरियों आदि का उपयोग नहीं करते हैं, जैसे कि पायथन मैं पसंद करता हूं, लेकिन क्या यह पूर्ण पैमाने पर, औद्योगिक स्तर के सॉफ़्टवेयर को लिखने के लिए यथार्थवादी है?

सॉफ्टवेयर को बड़ी मात्रा में डेटा को संभालने और वैज्ञानिक संगणना के साथ प्रभावी होने की आवश्यकता है। प्रदर्शन सार का है।

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

Petros


5
C ++ जीता के रूप में, मैं फोरट्रान को बनाए रखने के लिए कड़ी मेहनत नहीं करूंगा। अधिकांश भाग के लिए रख-रखाव अच्छी प्रथाओं से जुड़ा हुआ है, न कि भाषा की पसंद के लिए। C ++ की सुस्ती ओवरसोल्ड है। इसके अलावा, मेरा सुझाव है कि आप अपने डेटा आकार और समय-समय की आवश्यकताओं का वर्णन करने के लिए इस पोस्ट को बढ़ाएँ। मैंने "बड़ा" 9 या 10 परिमाण के भिन्न-भिन्न क्रमों के आधार पर देखा है, इस पर निर्भर करता है कि मैं किससे बात कर रहा हूँ।
बिल बर्थ

@BillBarth मौजूदा फोरट्रान कोड के साथ समस्या यह है कि तीन लोग विभिन्न प्रथाओं का उपयोग कर शामिल थे। मैं C बैकग्राउंड से आता हूं, F77 बैकग्राउंड का एक लड़का और Matlab का दूसरा लड़का। डेटा आवंटन योग्य नहीं है और आकार में सबसे बड़ी प्रणाली के लिए आकार (मैं हाल ही में शामिल था)। कोड 350s (समय बीतने) में 240s के समय क्षितिज पर 72000 अंतर और 74000 बीजीय समीकरणों के साथ प्रणाली को अनुकरण करने में सक्षम था। मैंने उस समानांतर को खोलने के लिए OpenMP का उपयोग करके 170 के दशक तक घटा दिया। अब मुझे समानांतर (सुरक्षा जांच के लिए स्वीप करने) में कई मामले चलाने होंगे।
इलेक्ट्रिक्क

4
@BillBarth अपने C ++ कौशल को बेचने में बहुत मामूली है, लेकिन वह अपने बयान में बहुत उदार है कि "C ++ की सुस्ती ओवरसोल्ड है"। Scicomp.stackexchange.com में C ++ बनाम फोरट्रान थ्रेड्स की कई संख्याएँ हैं, जिन्होंने इस बहुत ही प्रश्न पर चर्चा की है और सामान्य निष्कर्ष यह था कि यह सही नहीं है कि C ++ की तुलना में लगभग सभी मामलों के लिए यह अधिक धीमी है। मैं व्यक्तिगत रूप से सोचता हूं कि आज इसे शहरी मिथक माना जा सकता है। क्या है बहुत ज्यादा सच है कि अगर आप कोड के कारण रख-रखाव में रखना है, तो फोरट्रान बहुत अच्छी तरह से आज कुछ खास नहीं है।
वुल्फगैंग बंगर्थ

2
@BillBarth और अन्य, यदि आप फोरट्रान, C ++ और अन्य भाषाओं की सामान्य खूबियों पर चर्चा करना जारी रखना चाहते हैं, तो कृपया इसे scicomp चैट रूम में ले जाएं और @ कोई भी जिसे आप विशेष रूप से संबोधित करना चाहते हैं।
एरन अहमदिया

1
@ एरोनहैमिया: आह, आइए, मेरे पास जेद; कहने के लिए बहुत कुछ है; (जेडी; कुछ और समय। हमारे मामले में, विरल मैट्रिस के लिए कोई एसटीएल नहीं है, लेकिन यह अनुकूली मेष संरचना संरचनाओं में बहुत सारे हैं।)
वोल्फगैंग बंगरथ

जवाबों:


19

मुझे अपनी आवश्यकताओं को तोड़ने की कोशिश करें:

  • रख-रखाव
  • पाठ डेटा पढ़ना / लिखना
  • एलयू कारकों के लिए मजबूत इंटरफेस / क्षमता
  • विरल लीनियर सॉल्वर्स
  • बड़े डेटा के लिए प्रदर्शन और मापनीयता

इस सूची से, मैं निम्नलिखित भाषाओं पर विचार करूंगा:

सी, सी ++, फोरट्रान, पायथन, MATLAB, जावा

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

पाठ डेटा पढ़ना / लिखना

यह किसी भी प्रोग्रामिंग भाषा में सही होना आसान है। सुनिश्चित करें कि आप उचित रूप से बफरिंग कर रहे हैं और आपके I / O एक्सेस को सहूलियत दे रहे हैं, और आप उन सभी भाषाओं से अच्छा प्रदर्शन प्राप्त करेंगे, जिन पर आप विचार करते हैं। C ++ में स्ट्रीम ऑब्जेक्ट्स से बचें जब तक कि आप उन्हें प्रदर्शन करने के तरीके का उपयोग करना नहीं जानते।

एलयू कारकों के लिए मजबूत इंटरफेस / क्षमता

यदि आप सघन LU फ़ैक्टर कर रहे हैं, तो आप समानांतर कार्यक्षमता के लिए LAPACK, या ScaLAPACK / Elemental का उपयोग करना चाहेंगे। LAPACK और ScaLAPACK को फोरट्रान में लिखा जाता है, तत्व C ++ में लिखा जाता है। सभी तीन पुस्तकालयों प्रदर्शन कर रहे हैं और अच्छी तरह से समर्थित और प्रलेखित। आप उन भाषाओं में से किसी पर भी विचार कर सकते हैं, जिस पर आपको विचार करना चाहिए।

विरल लीनियर सॉल्वर्स

प्रीमियर स्वतंत्र रूप से उपलब्ध विरल लीनियर सॉल्वर सी में लिखे PETSc के माध्यम से लगभग सभी उपलब्ध हैं , जो अच्छी तरह से प्रलेखित और समर्थित है। आप जिन भाषाओं पर विचार करना चाहते हैं, उनमें से पेट्सक में इंटरफ़ेस कर सकते हैं।

बड़े डेटा के लिए प्रदर्शन और मापनीयता

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

ऑन-नोड प्रदर्शन के संबंध में, यदि आप स्वयं संख्यात्मक दिनचर्या लिख ​​रहे हैं, तो फोरट्रान में अच्छा सीरियल प्रदर्शन प्राप्त करना आसान है। यदि आपके पास C, C ++, या Python का थोड़ा सा अनुभव है, तो आप बहुत तुलनीय प्रदर्शन प्राप्त कर सकते हैं (C और C ++ मृत हैं-यहां तक ​​कि फोरट्रान, पायथन और MATLAB लगभग 25% समय के भीतर बिना किसी प्रयास के ओवरहेड में आते हैं)। MATLAB एक JIT संकलक और बहुत अच्छे रैखिक बीजगणित अभिव्यंजना के माध्यम से ऐसा करता है। आपको पायथन से दावा किए गए प्रदर्शन को प्राप्त करने के लिए साइथॉन, सुपीरियर, numexpr, या संख्यात्मक कर्नेल का उपयोग करने की संभावना होगी। मैं जावा के प्रदर्शन पर टिप्पणी नहीं कर सकता, क्योंकि मैं भाषा को बहुत अच्छी तरह से नहीं जानता, लेकिन मुझे संदेह है कि यह पायथन से दूर नहीं है यदि किसी विशेषज्ञ द्वारा लिखा गया है।

इंटरफेस पर एक नोट

मुझे आशा है कि मैंने आपको आश्वस्त किया है कि आप उन सभी प्रोग्रामिंग भाषाओं में जो आप चाहते हैं, उन सभी में आप कर सकते हैं। यदि आप जावा का उपयोग कर रहे हैं, तो सी इंटरफेस थोड़ा चुनौतीपूर्ण होगा। पायथन में ctypes, Cython और f2py के माध्यम से उत्कृष्ट C और फोरट्रान इंटरफ़ेस समर्थन है। LAPACK पहले से ही लपेटा हुआ है और स्कैपी के माध्यम से उपलब्ध है। MATLAB में आपके सभी मूल पुस्तकालयों में आवश्यक कार्यक्षमता है, लेकिन यह आसानी से स्केलेबल या विशेष रूप से क्लस्टर पर चलाने के लिए आसान नहीं है। जावा के साथ सी और फोरट्रान इंटरफेस का समर्थन कर सकते हैं JNI , लेकिन आमतौर पर समूहों पर और वैज्ञानिक कंप्यूटिंग के लिए समानांतर सॉफ्टवेयर में नहीं पाया जाता।

रख-रखाव

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

सिफ़ारिश करना

मुझे व्यक्तिगत रूप से पायथन के साथ बहुत कुछ मिला है और मैं इसे कई कम्प्यूटेशनल परियोजनाओं के लिए सलाह देता हूं। मुझे लगता है कि आपको अपनी परियोजना के लिए दृढ़ता से विचार करना चाहिए। पायथन और MATLAB संभवतः वैज्ञानिक कंप्यूटिंग के लिए उपलब्ध भाषाओं में से सबसे अधिक अभिव्यंजक हैं। आप पायथन को आसानी से किसी अन्य प्रोग्रामिंग भाषा में इंटरफ़ेस कर सकते हैं, आप अपने वर्तमान फोरट्रान कार्यान्वयन और टुकड़ा-दर-टुकड़ा फिर से लपेटने के लिए f2py का उपयोग कर सकते हैं, जो भी आप पायथन में काम करते हैं, वे यह सत्यापित करते हुए कि आप कार्यक्षमता बनाए रख रहे हैं। इस समय, मैं का एक संयोजन की सिफारिश करेंगे आधिकारिक अजगर 2.7 कार्यान्वयन के साथ scipy । आप बहुत आसानी से इस स्टैक के साथ स्वतंत्र रूप से उपलब्ध उत्साहित पायथन वितरण से शुरू कर सकते हैं ।

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

संबंधित सवाल:


1
एक बहुत अच्छी तरह से प्रलेखित, सभी समावेशी उत्तर। फोरट्रान के तहत मैं बहुत सारे लैपैक का उपयोग करता हूं। मैं अजगर पर एक नज़र डालूंगा और अपने फोरट्रान कोड को शुरू करने की कोशिश करूंगा और धीरे-धीरे पायथन में जाऊंगा। केवल एक चीज जो मुझे डराती है वह है 25% समय ओवरहेड जो मेरे पास हो सकता है। लेकिन अगर यह अधिक अभिव्यंजक कोड और बेहतर समानांतर कंप्यूटिंग हैंडलिंग के लाभ के साथ आता है, तो मैं इसके लिए जाऊंगा। मैंने साझा मेमोरी का केवल इसलिए उल्लेख किया है क्योंकि सॉफ्टवेयर वर्तमान में विंडोज और लिनक्स के तहत यूनी में शोधकर्ताओं के 2,4,8,24,48-कोर साझा कंप्यूटर पर इंटरैक्टिव तरीके से (डेटा और रेरन पर एक बदलाव करता है) चलाता है।
इलेक्ट्रिक्क

3
मुझे नहीं पता कि आप पायथन में लिखे संख्यात्मक कर्नेल के लिए 25% ओवरहेड का दावा कैसे कर सकते हैं। शुद्ध पायथन संख्यात्मक कर्नेल अक्सर सी की तुलना में 100x धीमे क्रम के होते हैं। कुछ भावों के साथ नम्पी और न्यूएक्सप्रैस एक अच्छा काम कर सकते हैं, लेकिन यह शायद ही पायथन में नए संख्यात्मक कर्नेल लिख रहे हैं। साइथन कुछ चीजों को तेजी से बना सकता है, लेकिन आमतौर पर सी के 25% के भीतर नहीं है। पायथन एक अच्छी "गोंद" भाषा है, लेकिन मुझे लगता है कि एरॉन प्रदर्शन-संवेदनशील कार्यों के लिए एक सामान्य उद्देश्य समाधान के रूप में इसकी देखरेख कर रहा है।
जेड ब्राउन

I / O, फोरट्रान का सबसे कमजोर बिंदु है, क्योंकि फोरट्रान को I / O में बहुत अधिक संरचना की आवश्यकता होती है। मेरे लैब में सहकर्मियों के साथ बात करने का मेरा दूसरा अनुभव जो साइथॉन के साथ काम करता है, जो जेथ साइथन के बारे में कहता है; उनमें से कम से कम एक ने प्रदर्शन-गहन कार्यों के लिए साइथन को बदलने के लिए सी-ट्यून हाथ से लिखा है, और फिर मेरा मानना ​​है कि परिणामस्वरूप सी कोड को कॉल करने वाले पायथन का प्रदर्शन एरॉन के दावे के करीब है। इसके अलावा, यदि आप पेट्सक और पायथन का उल्लेख करने जा रहे हैं, तो आप पेट्सकैप का भी उल्लेख कर सकते हैं। अंतिम मैंने देखा (यह कुछ साल पहले था), जावा के लिए कोई अच्छा एमपीआई इंटरफेस नहीं था। क्या वह बदल गया है?
21:39 पर ज्योफ ऑक्सबेरी

@GeoffOxberry: जावा MPI बाइंडिंग मौजूद है, लेकिन लगभग एक दशक में अद्यतन नहीं किया गया है। मैं उनकी स्थिति को संदिग्ध मानता हूं। फोरट्रान में कई आई / ओ विकल्प हैं जो बहुत जल्दी जाने के लिए बनाए जा सकते हैं। मैं समानांतर HDF5 (और HDF5, आम तौर पर) की खोज करने की सलाह दूंगा। यदि I / O वास्तव में प्रभावी है (रन समय के 50% से अधिक), तो अधिक गंभीर उपाय क्रम में हो सकते हैं, लेकिन अन्यथा, और एचडीएफ जैसे इंटरफ़ेस की गुणवत्ता और पोर्टेबिलिटी शायद इसके लायक है।
बिल बर्थ

@BillBarth: मुझे यह देखना होगा। फोरट्रान I / O के बारे में मेरी टिप्पणी किसी के दृष्टिकोण से एक बार अनुशंसा करने के बाद आती है कि मैं फोरट्रान में एक इनपुट फ़ाइल पार्सर लिखता हूं। यह संभव है, संरचना के एक महान सौदे को लागू करके, लेकिन मैंने अभी तक आसानी से और व्यापक रूप से फोर्ट्रान में एक्सजेक्स पार्सर या एक्सएमएल पार्सर पुस्तकालयों का उपयोग नहीं किया है (कुछ उदाहरण देने के लिए)। इसके लिए अच्छा कारण है: हम केवल फोरट्रान का उपयोग करने वाले लोग हैं। शायद हम विभिन्न उपयोग के मामलों के बारे में सोच रहे हैं।
ज्योफ ऑक्सीबेरी

2

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

कहा कि, जो कुछ वहां लिखा गया है, उसके अलावा मुझे कुछ टिप्पणियों को करने दें:

(i) आप अपनी सूची में सह-सरणी फोरट्रान को शामिल करते हैं। मेरे ज्ञान के लिए, संकलक की संख्या जो वास्तव में इसका समर्थन करती है - बहुत कम है और मेरी, वास्तव में, शून्य हो। सबसे व्यापक रूप से उपलब्ध फोरट्रान कम्पाइलर GNU gfortran है, और जबकि वर्तमान विकास स्रोत सह-सरणियों के सबसेट को पार्स करते हैं, मेरा मानना ​​है कि यह वास्तव में इसका कोई समर्थन नहीं करता है (यानी, यह वाक्यविन्यास को स्वीकार करता है लेकिन शब्दार्थों में से कोई भी लागू नहीं करता है) । यह निश्चित रूप से नए फोरट्रान मानकों के बारे में एक सामान्य अवलोकन है: कि लैग जिसके साथ संकलक वास्तव में नए मानकों का समर्थन करते हैं, को कई वर्षों में मापा जाता है - कंपाइलरों ने पिछले कुछ वर्षों में केवल फोरट्रान 2003 को पूरी तरह से लागू किया है, और केवल आंशिक रूप से फोरट्रान 2008 का समर्थन करते हैं। यदि आपको कोई कंपाइलर है जो आपके द्वारा उपयोग किए जाने वाले समर्थन के लिए होता है, तो आपको इसका उपयोग करने से नहीं रोकना चाहिए।

(ii) C ++ / Cilk +: जी के साथ इंटेल निश्चित रूप से सही है, जीसीसी की एक शाखा पर इसे विकसित कर रहा है, लेकिन यह जीसीसी रिलीज और इच्छाशक्ति में से किसी में भी उपलब्ध नहीं है, संभवत: कुछ समय के लिए नहीं। आप यह उम्मीद कर सकते हैं कि आपको कम से कम 2-3 साल लगेंगे, जब तक कि आपको Cilk + नहीं मिलेगा, विशिष्ट लाइनक्स मशीनों पर स्थापित GCC संस्करणों के साथ।

(iii) C ++ / TBB एक अलग कहानी है: TBB कुछ समय के लिए रहा है, एक बहुत ही स्थिर इंटरफ़ेस है और यह किसी भी C ++ कंपाइलर के साथ संकलित है जो पिछले कई सालों से मौजूद है (लिनक्स पर और साथ ही खिड़कियों पर) । हम अच्छे परिणाम के साथ पहले से ही कई वर्षों के लिए सौदा कर रहे हैं। उस पर एक बहुत अच्छी किताब भी है।

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

(v) यदि आप प्रायोगिक हैं, तो आप नई प्रोग्रामिंग भाषाओं पर भी नज़र डाल सकते हैं जो समानांतर प्रोग्रामिंग के लिए डिज़ाइन की गई हैं और विशेष रूप से, आपके द्वारा वर्णित कार्यों जैसे कार्यों के लिए। अनिवार्य रूप से दो हैं जो मैं देखूंगा : X10 और चैपल । मैंने चैपल पर अच्छे ट्यूटोरियल देखे हैं, और यह अच्छी तरह से डिज़ाइन किया गया लगता है, हालांकि दोनों आज निश्चित रूप से साथ ही साथ समाधान भी हैं।


रिकॉर्ड के लिए, इंटेल का दावा है कि एक समांतर (वितरित मेमोरी) सह-सरणी फोरट्रान को उनके वर्तमान संकलक में बनाया गया है। हम इसे TACC में देख रहे हैं, लेकिन मेरे पास अभी तक रिपोर्ट करने के लिए कुछ भी नहीं है। क्रे भी उनके संकलक में एक कार्यान्वयन है, लेकिन यह केवल दुनिया भर में मशीनों की एक छोटी संख्या पर उपलब्ध है। मुझे नहीं लगता कि कोई भी सह-सरणियों के संबंध में पूर्ण फोरट्रान 2008 मानक को लागू करता है, फिर भी, लेकिन कुछ संकलक में नवजात सहायता से अधिक है। Cilk +, बेशक इंटेल कंपाइलर के साथ भी उपलब्ध है, लेकिन भरोसेमंद होना शायद अभी तक बुद्धिमान नहीं है।
बिल बर्थ

फोरट्रान 2008 मानक को 2010 के अंत तक मंजूरी नहीं दी गई थी, इसलिए यह सीएएफ से कुछ साल पहले व्यापक रूप से उपलब्ध होगा। G95 का वास्तव में एक (गैर-मुक्त) कार्यान्वयन था, लेकिन अब विकसित नहीं किया गया है (डेवलपर PathScale में शामिल हो गया था)।
२०:५० पर बासी

G95 में से अधिकांश g95 अंततः समाप्त हो गए हैं, लेकिन यह हो सकता है कि CAF उस का हिस्सा नहीं है।
वोल्फगैंग बैंगर्थ

मेरा मानना ​​है कि इंटेल कंपाइलर सह-सरणी का अच्छा समर्थन प्रदान करता है। उन्होंने इसे mpiexec का उपयोग करके बनाया है। यह मेरी पहली पसंद नहीं होगी। अच्छी बात यह है कि समान कार्यान्वयन साझा और वितरित मेमोरी पर चल सकता है (मैंने कुछ परीक्षण चलाए)। ऑप्टरॉन साझा-मेमोरी प्रोसेसर के साथ वास्तव में उचित मूल्य पर 60-कोर तक पहुंचने के साथ, मैं पहले अपने साझा-मेमोरी विकल्प देखना चाहता हूं।
विद्युत्

2

आम तौर पर, यदि आप इस सॉफ़्टवेयर प्रोजेक्ट के बारे में वास्तव में गंभीर हैं, तो मैं सुझाव दूंगा कि आप जिस भी भाषा में खुद को सबसे अधिक सहज महसूस करते हैं, उसमें फिर से लिखें। ऐसा लगता है कि आप अकेले काम कर रहे हैं, और इसलिए आपको उस भाषा में सबसे अच्छे परिणाम मिलेंगे जो आप घर पर सबसे अधिक महसूस करते हैं।

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

Cilk निश्चित रूप से सही दिशा में एक कदम है, यानी यह आपको एक अंतर्निहित समानांतर सेटअप में आपकी समस्या / समाधान पर फिर से विचार करने के लिए मजबूर करता है। हालांकि मुझे इसके बारे में पसंद नहीं है, लेकिन यह है कि यह अभी तक एक और भाषा है । इसके अलावा, चूंकि यह केवल समानांतर कार्यों के बीच मोटे तौर पर संबंध बना सकता है, अनुसूचक काफी रूढ़िवादी हो सकता है और कुछ समस्याओं के लिए अच्छी तरह से स्केल नहीं कर सकता है।

अच्छी खबर यह है कि, हालांकि, फिर से, यदि आप अपने कार्यान्वयन के बारे में गंभीर हैं, तो आप वह कर सकते हैं, जो Cilk करता है, उदाहरण के लिए, अंतर-निर्भर कार्यों के एक सेट के रूप में अपनी समस्या को फिर से लिखें और उन्हें कई प्रोसेसर पर वितरित करें / कोर, अपने दम पर या तो pthreads का उपयोग कर या प्रक्रियाओं का उपयोग करने के लिए OpenMP का दुरुपयोग। यह कैसे किया जा सकता है इसका एक अच्छा उदाहरण PLASMA लाइब्रेरी में इस्तेमाल किया गया QUARK अनुसूचक है । इसके प्रदर्शन बनाम Cilk की एक अच्छी तुलना यहाँ दी गई है


मैं सुझाए गए लिंक को देखूंगा। तुलना पेपर बहुत अच्छा है! धन्यवाद! मैं pthreads के बारे में सोच रहा हूं लेकिन मैं चाहता हूं कि कार्यक्रम क्रॉस-प्लेटफॉर्म हो। क्या मैं जानता हूँ कि pthreads खिड़कियों के नीचे समस्याएं हैं (गलत?)।
इलेक्ट्रिक्क

@ p3tris: Pthreads में "p" POSIX के लिए है, इसलिए यह जितना हो सके उतना पोर्टेबल है। इस तरह के pthreads-win32या cygwinपरियोजना के भीतर कुछ आज्ञाकारी विंडोज कार्यान्वयन हैं ।
पेड्रो

के आधार पर stackoverflow.com/q/2797690/801468 मैं इसे उपयोग करने के लिए सुलझाने के लिए की जरूरत सामान का एक बहुत देखते हैं देखते हैं। यह देखते हुए कि मैं एक प्रोग्रामर नहीं हूं, मैं कुछ और परीक्षण के साथ रहना पसंद करूंगा।
इलेक्ट्रिक्क

2

उपरोक्त टिप्पणियों में मोटे तौर पर फोरट्रान की बहुत कम चर्चा हुई है। इस समय, और मेरे सीमित ज्ञान के लिए, कंपाइलरों में मोटे समर्थन इस प्रकार हैं:

  • क्रे में एक कंपाइलर है जो कम से कम मूल मोटे फीचर्स का समर्थन करता है। मैंने इसका उपयोग कोड लिखने के लिए किया है जिसका उद्देश्य "शैक्षिक" होना था, लेकिन मैं कहूंगा कि आप मोटे कोडरन में वास्तविक कोड लिख सकते हैं। वाक्यविन्यास और अवधारणाएं ज्यादातर MPI की तुलना में बहुत सरल हैं, लेकिन हमेशा की तरह, लोटे जाल हैं, और जाल MPI से अलग हैं।
  • इंटेल फोरट्रान को उनके एमपीआई लाइब्रेरी के शीर्ष पर निर्मित मोटे सपोर्ट हैं। माना जाता है कि यह उनके सैद्धांतिक शिखर प्रदर्शन को सीमित करता है, लेकिन मैंने कोई मीट्रिक नहीं देखी है।
  • गुरफ्रेन सहवास का समर्थन करता है, लेकिन केवल एक छवि (या एकल रैंक के लिए, एमपीआई में बोलते हैं)। इसलिए, कोई वास्तविक समानांतरकरण उपलब्ध नहीं है जब तक कि गैफरान 4.8 या 4.9 बाहर नहीं है।

आम तौर पर, अगर एक मोटे आधारित कोड को शुरू करना है तो मैं सावधान रहूंगा। सिंटैक्स MPI के साथ फोरट्रान / सी / सी ++ की तुलना में सरल और अधिक सुविधाजनक है, लेकिन फिर, यह पूरी तरह से चित्रित नहीं है। उदाहरण के लिए, MPI बहुत सारे संचालन में कमी आदि का समर्थन करता है जो आपके लिए बहुत सुविधाजनक हो सकता है। यह वास्तव में बहुत अधिक संचार की आपकी आवश्यकता पर निर्भर करेगा। यदि आप एक उदाहरण चाहते हैं, तो मुझे बताएं और मैं आपको कुछ प्रदान कर सकता हूं, अगर मैं फाइलों को खोद सकता हूं।


हां, इस तरह की समस्या के लिए मोटे फोरट्रान की तत्परता के बारे में अधिक जानकारी निश्चित रूप से सहायक होगी। Scicomp में आपका स्वागत है!
एरन अहमदिया

1

स्पार्क पर एक नज़र डालें यह स्मृति में कम्प्यूटेशन के लिए एक वितरित ढांचा है जो कार्यात्मक प्रोग्रामिंग का लाभ उठाता है। स्पार्क में एक प्रोग्राम की संरचना बहुत अलग है जब एमपीआई की तुलना में, मूल रूप से आप सिंगल कंप्यूटर के लिए एक कोड लिखते हैं, जो मेमोरी में स्थित डेटा के कार्यों के रूप में स्वचालित रूप से वितरित किया जाता है। यह स्काला, जावा और पायथन का समर्थन करता है।

लॉजिस्टिक रिग्रेशन (scala):

//load data to distributed memory
val points = spark.textFile(...).map(parsePoint).cache()
var w = Vector.random(D) // current separating plane
for (i <- 1 to ITERATIONS) {
  val gradient = points.map(p =>
    (1 / (1 + exp(-p.y*(w dot p.x))) - 1) * p.y * p.x
  ).reduce(_ + _)
  w -= gradient
}
println("Final separating plane: " + w)

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.