एचपीसी के लिए सी ++ बनाम फोरट्रान


56

मेरे कम्प्यूटेशनल विज्ञान पीएचडी कार्यक्रम में, हम लगभग विशेष रूप से सी ++ और फोरट्रान में काम कर रहे हैं। ऐसा लगता है कि कुछ प्रोफेसर एक दूसरे को पसंद करते हैं। मैं सोच रहा हूं कि कौन सी 'बेहतर' है या एक निश्चित परिस्थिति में दूसरे से बेहतर है।


12
उच्च और निम्न स्तर की भाषा का मिश्रण विशेष रूप से या तो मेरे विचार से उपयोग करने से बेहतर है। जैसे मैं पायथन + सी ++ का उपयोग करता हूं।
फहीम मीठा

2
इस प्रश्न के उत्तर लगभग विशुद्ध रूप से व्यक्तिपरक होंगे और इस प्रकार मुझे यकीन नहीं है कि यह प्रश्न उचित है।
जेफ

जवाबों:


61

जैसा कि अक्सर होता है, विकल्प (1) उस समस्या पर निर्भर करता है जिसे आप हल करने की कोशिश कर रहे हैं, (2) आपके पास जो कौशल है, और (3) जिन लोगों के साथ आप काम करते हैं (जब तक कि यह एक एकल परियोजना नहीं है)। मैं इस समय के लिए (3) को अलग छोड़ दूंगा क्योंकि यह हर किसी की व्यक्तिगत स्थिति पर निर्भर करता है।

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

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

हालांकि, केवल फोरट्रान और सी ++ की तुलना में प्रोग्रामिंग में अधिक है। मैं किसी को कम्प्यूटेशनल विज्ञान में जाने की सलाह दूंगा जैसे कि पायथन जैसे गतिशील उच्च स्तरीय भाषा के साथ शुरू करना। हमेशा याद रखें कि आपका समय सीपीयू समय से अधिक मूल्यवान है!


17
"हमेशा याद रखें कि आपका समय सीपीयू समय से अधिक मूल्यवान है!" जैसे कोई व्यक्ति जो एचपीसी में काम करता है, मैं उस हिस्से से असहमत हूं; बाकी सब कुछ हाजिर है।
लेवी मॉरिसन

19
"हमेशा याद रखें कि आपका समय सीपीयू समय की तुलना में अधिक मूल्यवान है!" जैसा कि कोई व्यक्ति जो वैज्ञानिक अनुसंधान में काम करता है, मैं उस हिस्से से अधिक सहमत नहीं हो सकता।
डिकवेला

3
"हमेशा याद रखें कि आपका समय सीपीयू समय से अधिक मूल्यवान है!" - मैं अपने 2 सेंट में फेंकना चाहूंगा - कई सौ नोड्स का उपयोग करना, प्रत्येक 10+ कोर के साथ कई हफ्तों तक कुछ कार्यक्रम चलाने के लिए सबसे कीमती संसाधन के भयानक कचरे के रूप में माना जा सकता है, अगर एक जोड़े को अधिक सप्ताह का उत्पादन हो सकता है कोड जो केवल कुछ दिनों में चलता है। उन एचपीसी क्लस्टर एक दुर्लभ और महंगे आम संसाधन हैं।
दानी_

"हमेशा याद रखें कि आपका समय सीपीयू समय की तुलना में अधिक मूल्यवान है!", एक सप्ताह के लिए कोड लेकिन एक महीने के लिए चलाएं, यह काफी सामान्य है सर!
फ्रंट

6
"हमेशा याद रखें कि आपका समय CPU समय की तुलना में अधिक मूल्यवान है!", मैं एक महीने के लिए कोड और एक सप्ताह में चलाऊंगा! - कोड लिखे जाने के बाद अधिक किया जा सकता है और दूसरों को वह कोड मिल जाएगा जिसे आप अधिक उपयोगी भी लिखते हैं।
चार्ल्स

37

मुझे लगता है कि C ++ और फोरट्रान दोनों ही काफी अच्छे हैं और अच्छी तरह से काम करते हैं।

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

C ++ एक सामान्य उद्देश्य वाली भाषा है, इसलिए कोई भी इसमें कोई भी एल्गोरिथ्म व्यक्त कर सकता है, और यह निश्चित रूप से एल्गोरिदम के लिए बेहतर है जो कि एचपीसी क्षेत्र से एरे का उपयोग करके व्यक्त नहीं किया जा सकता है, शायद कुछ रेखांकन, मेष जनरेटर, प्रतीकात्मक हेरफेर और इतने पर।

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

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


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

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

6
बिल, क्या आपने आधुनिक फोरट्रान (90 और बाद के परिवर्धन?) का उपयोग किया। यह बहुत महत्वपूर्ण है (मुझे इस बारे में अपने उत्तर में अधिक स्पष्ट होना चाहिए)। बेशक, "फोरट्रान की 20.000 लाइनें", या f77 आमतौर पर अच्छी तरह से लिखित सी ++ से बेहतर नहीं है।
ओदनीज íertík

1
@ Ond thinkejČertík: मुझे लगता है कि यदि आप मानते हैं कि आधुनिक परिमित तत्व प्रोग्राम "सरल" डेटा संरचनाओं का उपयोग करते हैं, तो आपने हाल ही में उनमें से किसी को भी नहीं देखा है। अनुकूली परिमित तत्वों, एचपी विधियों, या सरल डेटा संरचनाओं का उपयोग करते हुए असंरक्षित जाल पर मल्टीग्रिड को लागू करने का प्रयास करें। बिल चालू है और मुझे विश्वास है कि मैं उसके लिए यह कह सकता हूं कि "आधुनिक फोरट्रान" का उपयोग करना शायद ही एक छोटे से अंतर से अधिक हो।
वोल्फगैंग बैंगर्थ

6
@WolfgangBangerth, उदाहरण के लिए Phaml ( math.nist.gov/phaml ) देखें जो आपके द्वारा बताई गई हर चीज का फोरट्रान कार्यान्वयन है।
Ond 22ej Čertík

31

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

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

सबसे पहले, फोरट्रान / सी के बेहतर संकलक होने की कोई भी चर्चा मूट है। समर्पित सी / फोरट्रान संकलक अतीत की बात है। Gcc / gfortran और icc / ifc दोनों एक ही बैक-एंड के लिए अलग-अलग फ्रंट-एंड हैं, अर्थात आपका प्रोग्राम फ्रंट-एंड द्वारा एक अमूर्त विवरण में बदल जाएगा और फिर बैक-एंड द्वारा अनुकूलित और असेंबल किया जाएगा। यदि आप लिखते हैं, शब्दार्थ, फोरट्रान में या सी में एक ही कोड, संकलक, दोनों ही मामलों में, एक ही विधानसभा का उत्पादन करेगा जो बस के रूप में तेजी से चलेगा।

यह अब मेरे दूसरे बिंदु की ओर जाता है: हम अभी भी मतभेद क्यों देखते हैं? समस्या यह है कि अधिकांश तुलनाओं को फोरट्रान प्रोग्रामर द्वारा सी या इसके विपरीत कुछ करने की कोशिश की जाती है। कभी ध्यान दें कि अधिकांश लेखक या कवि अपनी मूल भाषाओं में कैसे लिखना पसंद करते हैं? क्या आप ऐसी भाषा में कविता लिखना चाहते हैं जिसमें आप पूरी तरह से आश्वस्त नहीं हैं या घर पर नहीं हैं? बिल्कुल नहीं ... मैं खुद सी को अपनी "मूल" प्रोग्रामिंग भाषा मानता हूं। हालाँकि, मैंने तीन साल ऐसे समूह में काम करने में बिताए, जिसमें केवल फोरट्रान का उपयोग किया गया था, जिसमें मैंने एक निश्चित स्तर का प्रवाह हासिल किया है। हालाँकि, मैं कभी भी फोरट्रान में अपने दम पर कुछ नहीं लिखता क्योंकि मैं सी के साथ अधिक सहज हूं और, परिणामस्वरूप, परिणामी कोड बेहतर होगा , जो भी आप इसे परिभाषित करते हैं।

तो मुख्य अंतर प्रोग्रामर में है, भाषा नहीं। तो कोई मतभेद नहीं हैं? खैर, काफी नहीं। कुछ उदाहरण निम्नलिखित हैं:

  • SIMD: चाहे वह SSE, SSE3 या AltiVec हो, यदि आप उन्हें फोरट्रान में उपयोग करना चाहते हैं, तो आप बेहतर उम्मीद करते हैं और प्रार्थना करते हैं कि कंपाइलर अनुमान लगाता है कि आप क्या चाहते हैं और ऐसा करते हैं। सौभाग्य। सी में आप आमतौर पर प्रत्येक वास्तुकला के लिए आंतरिक कार्य करते हैं, या, हाल ही में, जीसीसी में सामान्य SIMD वेक्टर प्रकार । अधिकांश फोरट्रान संकलक केवल लूप को अनियंत्रित करने के लिए SIMD निर्देशों का उपयोग करेंगे, लेकिन अगर आपके पास एक कर्नेल है जो गैर-स्पष्ट तरीके से डेटा के लघु वैक्टर पर काम करता है, तो संकलक बहुत शायद इसे नहीं देख पाएंगे।

  • विभिन्न हार्डवेयर आर्किटेक्चर: पूरे CUDA आर्किटेक्चर को Cernels के आसपास C. Yes में बनाया गया है। पोर्टलैंड ग्रुप के पास अब CUDA- सक्षम फोरट्रान कंपाइलर भी है, लेकिन यह वाणिज्यिक है, और सबसे महत्वपूर्ण बात, यह NVIDIA से नहीं है। वही OpenCL के लिए जाता है, जिसके लिए मुझे सबसे अच्छा मिल सकता है एक हालिया प्रोजेक्ट जो केवल कुछ बुनियादी कॉल का समर्थन करता है।

  • समानांतर प्रोग्रामिंग: हां, एमपीआई और ओपनएमपी दोनों सी और फोरट्रान दोनों के साथ ठीक काम करते हैं। हालाँकि, यदि आप अपने थ्रेड्स का वास्तविक नियंत्रण चाहते हैं, अर्थात यदि आपके पास पूरी तरह से गतिशील साझा-मेमोरी संगणना है, तो आप कोट्रान के साथ ठंड में बाहर रहेंगे। सी में आपके पास मानक पंथ हैं, जो गर्म और फजी नहीं हैं, फिर भी आपको तूफान के माध्यम से मिलेंगे। सामान्य तौर पर, अधिकांश कम्प्यूटेशंस जो ऑपरेटिंग सिस्टम, उदाहरण के लिए थ्रेड्स, प्रोसेस, फाइल सिस्टम आदि पर निर्भर होते हैं ... सी। ओह के साथ बेहतर तरीके से परोसे जाते हैं, और फोरट्रान के साथ अपनी नेटवर्किंग करने की कोशिश नहीं करते हैं।

  • उपयोग में आसानी: फोरट्रान सी के मुकाबले मतलब के करीब है। एक बार जब आप सभी अलग-अलग खोजशब्दों पर पहुँच जाते हैं और चर घोषित करने के तरीके को छोड़ देते हैं, तो बाकी कोड Matlab की तरह दिखता है, जो सीमित प्रोग्रामिंग अनुभव वाले उपयोगकर्ताओं के लिए अधिक सुलभ होता है।

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

यह सब कुछ थोड़ा-सा geeky, निम्न-स्तरीय सामान है, लेकिन यह उच्च-प्रदर्शन कम्प्यूटिंग है जिसके बारे में हम बात कर रहे हैं, है ना? यदि आप अंतर्निहित हार्डवेयर प्रतिमानों का सर्वोत्तम उपयोग करने में रुचि नहीं रखते हैं, अर्थात कार्यान्वयन और / या एल्गोरिदम विकसित करना जो साझा / वितरित मेमोरी, थ्रेड्स, SIMD वेक्टराइजेशन, SIMT का उपयोग करके GPU, और इसी तरह के लिए सर्वोत्तम हैं, तो आप कर रहे हैं बस एक कंप्यूटर पर गणित कर रहा है।

यह बहुत लंबा हो गया है कि मैं जो कुछ भी मिलाता हूं, इसलिए यहां एक सारांश है - एक प्रकार का घर संदेश ले लो:

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

5
अच्छी प्रतिक्रिया। हालाँकि मुझे नहीं लगता कि आपकी अंतिम टिप्पणी जरूरी है। मैं खुद एक सी प्रोग्रामर हूं, लेकिन आपको अच्छे प्रोग्रामिंग प्रैक्टिस के जरिए फोरट्रान में निम्न स्तर की चीजों तक पहुंच मिलती है। SIMD ऑप्स जैसी चीजों का उपयोग करने का आदर्श तरीका कोड लिखना है जो दृढ़ता से यह सुझाव देता है (उदाहरण के लिए छोरों को अवरुद्ध करना), और संकलक को आपके लिए करने दें। थ्रेडिंग के लिए, बस ओपनएमपी का उपयोग करें (कुछ अतिरिक्त काम के साथ pthreads भी उपयोग करने योग्य है)। फोरट्रान में आपके द्वारा उल्लेखित सभी चीजें हैं, बस एक स्तर पर जो इसके विशिष्ट उपयोगकर्ता के लिए मायने रखती है: संख्यात्मक।
रीड.टेकसन

@ रीड.एक्ट्सन: ठीक है, अगर आप सब कुछ ब्लॉक कर देते हैं जैसे कि कंपाइलर इसे पकड़ लेगा, तो यह सी और फोरट्रान दोनों में स्वचालित रूप से काम करेगा। हालाँकि, समस्या यह है कि आप अपने कंपाइलर पर कितना भरोसा करना चाहते हैं? और आप उन मामलों में क्यों भरोसा करना चाहते हैं जब आप जानते हैं कि वास्तव में आप क्या चाहते हैं? OpenMP थ्रेडिंग करता है, हाँ, लेकिन ब्लॉक-वार। आप इसे अलग-अलग चीजों को करने के लिए अलग-अलग थ्रेड पूल में ट्रिक कर सकते हैं, लेकिन यह सिर्फ OpenMP का गलत इस्तेमाल है। फोरट्रान के लिए Pthreads C फ़ंक्शन के लिए केवल आवरण हैं। मैं सहमत हूँ, हालांकि, कि फोरट्रान आसान है यदि आप विवरण में नहीं हैं।
पेड्रो

1
यकीन है कि आप कंपाइलर पर निर्भर 99% पीक दक्षता पूर्ण विकसित करने के लिए नहीं जा रहे हैं, लेकिन आप आसानी से काफी करीब आ सकते हैं। इसके अलावा आपको या तो आंतरिक या इनलाइन ASM का उपयोग करना होगा। आपको समग्र प्रोग्रामर दक्षता के लिए कहीं न कहीं रियायतें देनी होंगी, इसीलिए प्रोग्रामिंग लैंग्वेज पहले से मौजूद हैं। इस स्तर पर कि आप वास्तव में आंतरिक या एएसएम (मैं कुछ समय रहा है) के विवरण में आने के लिए पर्याप्त पागल हैं, फोरट्रान एक बैसाखी नहीं है। आप अपने इकट्ठे हाथ से अनुकूलित कोड वैसे भी लिंक करना जानते होंगे।
रीड.टेकसन

@ Reid.Atcheson: ठीक है, मैं तर्क देता हूं कि समानांतर एचपीसी अनुप्रयोगों के लिए, आप 99% पीक दक्षता से काफी नीचे समाप्त हो सकते हैं ... और जीसीसी वेक्टर प्रकार एक गैर-मुद्दे का उपयोग कर बनाते हैं :)
पेड्रो

1
@ पेड्रो, शानदार पोस्ट। बिल्कुल प्रतिभाशाली। पोस्टिंग के लिए बहुत बहुत धन्यवाद। बस दिलचस्प धागे के माध्यम से बेतरतीब ढंग से अफवाह करते हुए इसे पाया।
प्रात:

16

वैज्ञानिक सॉफ़्टवेयर के बारे में मेरी 15 वर्षों की सोच से: यदि आपका कोड 25% तेजी से चलता है क्योंकि आप इसे फोरट्रान में लिखते हैं, लेकिन इसे लिखने में आपको 4 गुना समय लगता है (कोई एसटीएल, जटिल डेटा संरचनाओं को लागू करने में कठिनाई आदि), तो फोरट्रान केवल तभी जीतता है जब आप अपने दिन का एक महत्वपूर्ण हिस्सा अंगूठे और अपनी गणना समाप्त होने की प्रतीक्षा में बिताते हैं। यह देखते हुए कि हम में से लगभग सभी के लिए सबसे मूल्यवान चीज हमारा अपना समय है, निष्कर्ष यह है: उस भाषा का उपयोग करें जो आपको अपने कोड को सबसे तेजी से विकसित करने, डिबग करने और परीक्षण करने की अनुमति देती है, इस कारण को अनदेखा करते हुए कि शायद यह संभव से अधिक धीमा हो। आपने इसे फोरट्रान में लिखा था।


13

मेरा दृष्टिकोण C ++ का उपयोग हर चीज के लिए किया गया है लेकिन कम्प्यूटेशनल गुठली, जो आमतौर पर विधानसभा में सबसे अच्छा लिखा जाता है; यह आपको पारंपरिक एचपीसी दृष्टिकोण के प्रदर्शन के सभी खरीदता है, लेकिन आपको SGEMM / DGEMM / CGEMM / ZGEMM जैसे कम्प्यूटेशनल गुठली को एक ही रूटीन में अधिभारित करके, इंटरफ़ेस को सरल बनाने की अनुमति देता है। स्पष्ट रूप से कच्चे बिंदुओं से बचने और अपारदर्शी वर्गों पर स्विच करके अमूर्त स्तर को बहुत अधिक उठाया जा सकता है, लेकिन यह एक अच्छा पहला कदम है।

मुझे लगता है कि C ++ का सबसे बड़ा नकारात्मक रूप संकलन समय में वृद्धि है, लेकिन, मेरे अनुभव में, विकास के समय में बचत इसके लिए अधिक है। एक और नकारात्मक पहलू यह है कि विक्रेता C ++ कंपाइलर में विक्रेता C और फोरट्रान संकलक की तुलना में अधिक बग होते हैं। पिछले वर्ष में, मुझे लगता है कि मैं C ++ कंपाइलर में लगभग दस बगों में चला गया हूं।

उन सभी ने कहा, मुझे लगता है कि निम्न-स्तरीय भाषाओं (और फोरट्रान) में लिखी गई वैज्ञानिक पैकेजों को पूर्ववत करना परिष्कृत डेटा संरचनाओं के लिए सुविधाजनक इंटरफेस को उजागर करने की अनिच्छा है: अधिकांश लोग फोरट्रान BLAS इंटरफ़ेस से संतुष्ट हैं, क्योंकि उन्हें केवल आवश्यकता है मैट्रिक्स का वर्णन करने के लिए संकेत और अग्रणी आयाम, लेकिन कुछ लोग तर्क देंगे कि सामान्य 40-पूर्णांक फोरट्रान विरल-डायरेक्ट सॉल्वर इंटरफ़ेस सुविधाजनक (cf. UHM, SuperLU, PETSc, और Trilinos) के करीब है।

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

y: =αएक्स+y


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

1
मैंने कई लोगों के साथ बात की है जिन्होंने मुझे बताया है कि, उपयुक्त प्रतिबंधित उपयोग के साथ भी, कुछ फोरट्रान जैसे स्पष्ट ऑपरेशन के लिए कुछ संचालन के लिए उनका फोरट्रान अभी भी उनके सी और / या सी ++ कोड से तेज था। मैं यह नहीं कह रहा हूं कि सी या सी ++ कोड को तेजी से बनाना असंभव है, लेकिन फोरट्रान कंपाइलर एक बेहतर काम करता है।
जैक पॉल्सन

मुझे "प्रतिबंधित" कीवर्ड के साथ एक ही अनुभव है (मेरा सरल फोरट्रान कोड हमेशा थोड़ा तेज था)। लेकिन मेरी विशेषज्ञता सीमित है, और मेरे पास जीसीसी से उत्पन्न विधानसभा को समझने में निवेश करने का समय नहीं है। इसलिए मैं केवल फोरट्रान का उपयोग करता हूं, यह सरल है और यह तेज है।
ओदनीज íertík

@JackPoulson: कंपाइलर तर्क कुछ ऐसा है जिसे मैं फोरट्रान समुदाय से काफी सुनता हूं। दुर्भाग्य से, अधिकांश संकलक, जैसे gcc या ifc / icc, एक ही बैक-एंड के लिए विभिन्न भाषा फ्रंट-एंड का उपयोग करते हैं। अनुकूलन और कोड जनरेशन करने वाली मशीनरी समान है और इसलिए परिणामों में अंतर संभवतः प्रोग्रामर की परिचित भाषा में अंतर के कारण होता है ...
पेड्रो

1
अक्सर दोहराए जाने वाले, शायद ही-मान्य दावे पर थोड़ा सा परिप्रेक्ष्य देने के लिए कि फोरट्रान संख्यात्मक गुठली पर तेज है: कुछ समय पहले हमने देखा था कि त्रिलो के एपेट्रा पैकेज में विरल मैट्रिक्स-वेक्टर एक की तुलना में 30% धीमा है। deal.II. पूर्व को सीधे फोरट्रान 77 में लिखा गया था, बाद में सीधे 'सी' के उपयोग के बिना सीधे आगे सी में। दोनों में कोड की लगभग 10-15 लाइनें थीं। आज, Trilinos डील का टुकड़ा कोड का उपयोग करता है। मुझे यकीन है कि एक बहुत सारे मामले मिल सकते हैं जहां F77 सी से तेज है। बिंदु यह है कि सार्वभौमिक रूप से आज कोई भी ऐसा नहीं है।
वोल्फगैंग बैंगर्थ

8

चूंकि मैं यहां नया हूं, इसलिए मैं पुराने सवालों को देख रहा था और मुझे यह पता चला। उम्मीद है कि यह पुराने लोगों को जवाब देने के लिए वर्जित नहीं है!

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

मैं यह सब इसलिए लाता हूं ताकि C ++ प्रोग्रामर फोरट्रान प्रोग्रामर बनें, लेकिन ताकि फोरट्रान लोगों को पता चले कि उनके पास C ++ में स्विच करने या फ़ोर्टन 90/95 में ऑब्जेक्ट ओरिएंटेड अवधारणाओं का अनुकरण करने के अलावा अब और भी विकल्प हैं।

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


7

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

हालाँकि, आप सामान्य पुस्तकालयों तक बेहतर पहुँच प्राप्त कर सकते हैं और संभवत: अपने कोड की दृश्यता (हालांकि यह दृढ़ता से क्षेत्र पर निर्भर करता है, और आपके पास अभी भी शुद्ध सी है)। और आप अभी भी R, Lush, Matlab / Scilab या यहां तक ​​कि Python, Ruby या Lua जैसी स्क्रिप्ट भाषा में इसके कोड को लपेटकर फ़ोर्टन की लचीलेपन की कमी की भरपाई कर सकते हैं।


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

2
मुझे लगता है कि mbq और मार्टिन के अंक दोनों अनुचित हैं। हां, यदि पैर का उपयोग करके रैखिक बीजगणित के उद्देश्यों के लिए एक संख्यात्मक वेक्टर को लागू करने का प्रयास किया जाता है, तो पैर में खुद को गोली मारने के तरीके हैं: सूची [डबल>। लेकिन यह एक मूर्खतापूर्ण तर्क है: कम से कम C ++ में एक लिंक्ड सूची वर्ग है जिसे आप उपयोग कर सकते हैं, जबकि फोरट्रान नहीं करता है। यह कहने जैसा है "कार इतनी तेज गति से चलती है कि आप एक दीवार से टकरा सकते हैं और घायल हो सकते हैं; आपको इसके बजाय घोड़े की नाल वाली गाड़ी का उपयोग करना चाहिए।" उच्च-स्तरीय भाषा को ट्रैश करने के लिए यह केवल एक मूर्खतापूर्ण विचार है जो उच्च-स्तरीय विशेषताओं के लिए निम्न-स्तरीय सामान (जैसे C ++) का भी समर्थन करता है।
वोल्फगैंग बैंगर्थ

@ वोल्फगैंगबैंगर्थ नहीं, अब आप फोरट्रान को नुकसान पहुंचा रहे हैं - यह "निम्न-स्तर" के रूप में है क्योंकि बैक्टीरिया "कम विकसित" हैं फिर मनुष्य। यदि आप एक कार सादृश्य चाहते हैं, तो यह अधिक होना चाहिए "आप एक दलदली बाईपास को पार करने के लिए जीप और लेक्सस दोनों का उपयोग कर सकते हैं, लेकिन पहले एक का उपयोग करने से दर्द कम होता है"।
mbq

1
मैं आपकी राय की सराहना करता हूं, लेकिन मैं इस बात को बनाए रखता हूं कि फोरट्रान C ++ के रूप में विकसित नहीं हुआ है :-)
वोल्फगैंग बैंगर्थ

7

तीन तथ्य:

  • सी में F77- शैली एन-आयामी सरणियाँ: CnD (एक बेशर्म प्लग, भर्ती) का उपयोग कर कोई समस्या नहीं

  • F90 का मॉड्यूल सिस्टम खराब वातावरण तैयार करने और वातावरण बनाने के लिए शत्रुतापूर्ण है। (एक मॉड्यूल का नाम उसके फ़ाइल नाम से मेल नहीं खाता है, उदाहरण के लिए)

  • फोरट्रान अच्छी तरह से refactoring का समर्थन नहीं करता है। किसी फ़ंक्शन से कुछ कार्यक्षमता को खींचने से आपको चार स्थानों को छूने की आवश्यकता होती है: वास्तविक कोड, चर घोषणाएं, तर्क घोषणाएं, और तर्क सूची। C स्पर्श करने के लिए दो स्थानों से मिलता है। यह डेटा को अच्छी तरह से प्रबंधित करने में विफलता के प्रभाव को कम करता है (नीचे वर्णित): चूंकि छोटे पैमाने पर प्रतिरूपता इतनी दर्दनाक होती है, बस हर कोई विशाल उप-लेख लिखता है।

एक व्यक्तिगत छाप:

  • फोरट्रान डेटा के प्रबंधन के लिए अच्छी तरह से काम नहीं करता है। F77 या F90 में उपयोगकर्ता-अपारदर्शी डेटा संरचना के लिए एक सूचक को वापस करने का प्रयास करें। ( transfer(), यहाँ हम आते हैं)

हाय एंड्रियास! CnD दिलचस्प है, मैं इसके बारे में नहीं जानता था। आह, आपने इसे लिखा। : वास्तव में "तर्क सूची" क्या है? मुझे नहीं लगता कि मैं इनका उपयोग करता हूं, इसलिए संशोधित करने के लिए केवल 3 स्थानों की आवश्यकता है। सी में, आपको आमतौर पर वास्तविक कोड, पैरामीटर और हेडर फ़ाइल को संशोधित करने की आवश्यकता होती है, इसलिए यह 3 स्थान (सबसे निश्चित रूप से सी ++ में) भी है। हां, स्थानांतरण () सुपर अच्छा नहीं है, लेकिन आमतौर पर आपको अभ्यास में इसकी आवश्यकता नहीं होती है।
ओन्देजे íertík

3
आधुनिक फोरट्रान को फिर से दिखाना उचित आईडीई के साथ तुच्छ है, जैसे कि ग्रहण में फोट्रान।

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

1
बस वही जोड़ना चाहता था जो @ user389 ने कहा कि, जबकि Photran महान है और एकमात्र फोरट्रान IDE है जो रिफ्लेक्टरिंग की अनुमति देता है, इसका पार्सर हर समय विफल रहता है। दूसरी ओर, इस तथ्य पर टिप्पणी करने की कोई आवश्यकता नहीं है कि ग्रहण स्मृति-भूख है।
astrojuanlu

5

फोरट्रान सरणी / मैट्रिक्स अभिकलन के लिए अनुकूलित है और किसी भी प्रकार के पाठ पार्सिंग के साथ काम करने के लिए पूरी तरह से दर्द है। सी और सी ++, संख्यात्मक कंप्यूटिंग (यह करीब है) में फोरट्रान के साथ मेल नहीं खा सकते हैं, लेकिन मुझे पाठ को संसाधित करने और सी / सी ++ के साथ डेटा (यानी कस्टम डेटा संरचनाओं) को व्यवस्थित करने में बहुत आसान लगता है।

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


ये सही है। पाठ पार्सिंग के लिए भी मैं पायथन का उपयोग करता हूं।
ओदनीज íertík

आप संकलित भाषा में एक पायथन स्क्रिप्ट के भाग को भी लागू कर सकते हैं, जैसे C ++ और इसमें हुक करें। जैसे Boost Python, Swig आदि
Faheem Mitha

4

मैं वर्तमान में एक राष्ट्रीय प्रयोगशाला में काम कर रहा हूं। मेरे आसपास के अधिकांश लोग मैकेनिकल इंजीनियर हैं। एचपीसी समूहों में कुछ लोगों के साथ चैटिंग, वे ज्यादातर लिनक्स और ज्यादातर सी ++ कर रहे हैं। वर्तमान में मैं जिस समूह में हूं, वह ज्यादातर डेस्कटॉप एप्लिकेशन है और हम विंडोज का उपयोग करते हैं और अवरोही क्रम में: C #, FORTRAN, पायथन, VBA और VB (6, नॉट .NET)। कुछ सिमुलेशन इंजन जिनका हम उपयोग करते हैं, वे अन्य राष्ट्रीय प्रयोगशालाओं में FORTRAN में लिखे गए थे।


4

एक पुराने धागे को खोदने के लिए क्षमा करें, लेकिन ऐसा लगता है कि 2015 में भी, फोरट्रान का बहुत उपयोग किया जा रहा है।

मैं अभी इस (वैकल्पिक लिंक ) सूची में आया था जो मूल रूप से 300-पेटाफ्लॉप शिखर सम्मेलन मशीन पर चलने के लिए डीओई की ओसीएलएफ सुविधा द्वारा अनुमोदित 13 कोड की एक सूची है जो 2018 में शोधकर्ताओं को उपलब्ध कराई जाएगी। मैंने मुख्य भाषा का उपयोग करने की कोशिश की। कोड के लिए (एक त्वरित Google खोज पर आधारित) और यहाँ वही है जो मैंने पाया:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

इसलिए 13 कोड में से कम से कम 10 (मेरी त्वरित खोज के आधार पर) फोरट्रान में लिखे गए प्रतीत होते हैं। 50 साल पुरानी भाषा के लिए बुरा नहीं है।

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


3
मैं असहमत हूं, क्योंकि राष्ट्रीय प्रयोगशालाओं में मेरा अनुभव, अगर कुछ भी, इसके विपरीत रहा है। लॉरेंस लिवरमोर में मेरे द्वारा देखे गए अधिकांश नए प्रोजेक्ट्स C ++ में लिखे गए हैं, और अधिकांश नए (या सक्रिय रूप से बनाए) ODE सॉल्वर, FEM विवेक और सामान्य-उद्देश्य वाले वैज्ञानिक कंप्यूटिंग पुस्तकालयों में अत्याधुनिक ओपन-सोर्स लाइब्रेरी हैं। C या C ++ में लगता है। फोरट्रान मुख्य रूप से उन परियोजनाओं में उपयोग किया जाता है जो मौजूदा / विरासत पुस्तकालयों का उपयोग करते हैं; मुझे फोरट्रान का उपयोग करके बहुत सी बड़ी, नई परियोजनाएं दिखाई नहीं दे रही हैं, जो मैं भाषा के बारे में सोचता हूं, से स्वतंत्र हूं।
ज्योफ ऑक्सीबेरी

फ़ोर्ट्रान में लिखे गए कुछ घनत्व कार्यात्मक सिद्धांत कोड में VASP और CASTEP भी शामिल हैं , हालांकि @GeoffOxberry बताते हैं, नई परियोजनाएँ संभवतः C ++ की ओर जाती हैं।
dr.blochwave

@blochwave जैसा कि आप लिंक में पढ़ सकते हैं, परियोजनाएं एक नई मशीन (त्वरक आदि के साथ) के लिए हैं जो 2018 में ऑनलाइन होंगी। इसलिए इसकी तरह वे 25 साल का कोड नहीं लेते हैं और इसे अच्छे से चलाने की उम्मीद करते हैं। प्रदर्शन। मुझे यकीन है कि उपरोक्त सूची में कोडों के बड़े हिस्से हैं या नए कोड के रूप में फिर से लिखे गए हैं। "नए" जलवायु कोड के कई कोड फोरट्रान में हैं और कई देशों द्वारा कई एजेंसियों द्वारा उपयोग किए जाते हैं।
२०:४५

0

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

एक बेहतर सवाल यह है कि उत्कृष्ट रूप से डिज़ाइन किए गए सॉफ़्टवेयर के उदाहरण क्या हैं जो कि स्तरित सॉफ़्टवेयर को डिज़ाइन करने के तरीके के बारे में जानने के लिए अध्ययन करने योग्य हैं।

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