क्या फोरट्रान को भारी गणनाओं के लिए C से अनुकूलित करना आसान है?


410

समय-समय पर मैंने पढ़ा कि फोरट्रान भारी गणना के लिए तेज है या सी है। क्या यह सच है? मुझे यह स्वीकार करना चाहिए कि मैं शायद ही फोरट्रान को जानता हूं, लेकिन अभी तक जो फोरट्रान कोड मैंने देखा है वह यह नहीं दिखाता है कि भाषा में वे विशेषताएं हैं जो मेरे पास नहीं हैं।

अगर यह सच है, तो कृपया मुझे बताएँ। कृपया मुझे यह न बताएं कि नंबर क्रंचिंग के लिए कौन सी भाषाएं या लिबास अच्छे हैं, मैं ऐसा करने के लिए ऐप या लिब लिखने का इरादा नहीं करता, मैं सिर्फ उत्सुक हूं।


53
नीचे दिए गए उत्तरों से अवास्तविक रूप से व्यक्तिपरक। सही शीर्षक है "क्या कोई फ़ाउंडमेंडल आर्किटेक्चरल कारण हैं कि एक फोरट्रान कंपाइलर M एक C कंपाइलर की तुलना में बेहतर ऑप्टोमाइज्ड कोड क्यों उत्पन्न करता है" लेकिन यह सिर्फ नाइट-पिकिंग है।
मार्टिन बेकेट

3
शीर्षक प्रश्न इतना व्यक्तिपरक नहीं है क्योंकि यह गलतफहमी है, मुझे लगता है। अधिक विस्तृत प्रश्न व्यक्तिपरक नहीं है।
jfm3

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

1
मुझे नहीं लगता कि प्रश्न या उत्तर व्यक्तिपरक हैं। लेकिन अगर आपको लगता है कि यह झंडा किसी की मदद करता है, तो मैं इसके साथ ठीक हूं।
क्विनमार्स

2
@sixlettervariables यद्यपि आप और मैं पहले से ही उत्तर जानते हैं, यह एक ऐसा प्रश्न है जो अधिकांश लोगों को उनके करियर में होता है और उत्तर को समझने के लिए महत्वपूर्ण है। एक खारिज करने वाली टिप्पणी पोस्ट करने के बजाय, एक उत्तर क्यों न दें जिससे आप सहमत हैं और
मार्क

जवाबों:


447

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

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

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

फोरट्रान में कंपाइलर मैट्रिक्स मूल्यों को एक बार लोड कर सकते हैं और उन्हें रजिस्टरों में संग्रहीत कर सकते हैं। ऐसा इसलिए कर सकते हैं क्योंकि फोरट्रान कंपाइलर पॉइंटर्स / एरियर्स को मेमोरी में ओवरलैप नहीं करता है।

सौभाग्य से, restrictकीवर्ड और सख्त-अलियासिंग को इस समस्या को हल करने के लिए C99 मानक के लिए पेश किया गया है। यह इन दिनों के साथ-साथ अधिकांश C ++ कंपाइलरों में भी समर्थित है। कीवर्ड आपको कंपाइलर को एक संकेत देने की अनुमति देता है कि प्रोग्रामर वादा करता है कि एक पॉइंटर किसी अन्य पॉइंटर के साथ नहीं करता है। सख्त अलियासिंग का मतलब है कि प्रोग्रामर वादों कि विभिन्न प्रकार के संकेत दिए होगा कभी नहीं ओवरलैप है, उदाहरण के लिए एक के लिए double*नहीं होगा ओवरलैप के साथ एक int*(विशिष्ट अपवाद के रूप char*और void*कुछ भी साथ ओवरलैप कर सकते हैं)।

यदि आप उनका उपयोग करते हैं तो आपको C और फोरट्रान से समान गति मिलेगी। हालांकि, restrictप्रदर्शन महत्वपूर्ण कार्यों के साथ ही कीवर्ड का उपयोग करने की क्षमता का मतलब है कि C (और C ++) प्रोग्राम बहुत सुरक्षित और लिखने में आसान हैं। उदाहरण के लिए, अमान्य फोरट्रान कोड पर विचार करें: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30)जो कि अधिकांश फोरट्रान संकलक बिना किसी चेतावनी के खुशी से संकलित करेंगे, लेकिन एक बग का परिचय देंगे जो केवल कुछ संकलक पर, कुछ हार्डवेयर पर और कुछ अनुकूलन विकल्पों के साथ दिखाता है।


26
सभी सच्चे और मान्य, जेफ। हालाँकि, मैं "मान नहीं अलियासिंग" -विसिच सुरक्षित मानता हूँ। यह अन्य परियोजनाओं से विरासत में मिले कोड को इतने सूक्ष्म तरीके से तोड़ सकता है कि मैं इसका उपयोग नहीं करूंगा। मैं उस कारण के लिए एक प्रतिबंध-नाज़ी बन गया हूँ :-)
Nils Pipenbrinck

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

33
एक अच्छा उदाहरण मेमेकपी () बनाम मेमोव () का मात्र अस्तित्व है। मेम्केपी () के विपरीत, मेम्मोव () अतिव्यापी क्षेत्रों से मुकाबला करता है, इसलिए मेम्पी () तेज हो सकता है फिर मेमोवे ()। यह समस्या किसी के लिए मानक पुस्तकालय में एक के बजाय दो फ़ंक्शन को शामिल करने के लिए पर्याप्त कारण थी।
jfs

12
मुझे लगता है कि सेबस्टियन की बात थी - सी मेमोरी हैंडलिंग की जटिलता / लचीलेपन के कारण, यहां तक ​​कि चलती स्मृति के रूप में सरल कुछ मुश्किल है।
मार्टिन बेकेट

3
आपके call transformउदाहरण में ज्यादा समझ नहीं है।
व्लादिमीर एफ

163

हाँ, 1980 में; 2008 में? निर्भर करता है

जब मैंने व्यावसायिक रूप से प्रोग्रामिंग शुरू की, तो फोरट्रान की गति प्रभुत्व को चुनौती दी जा रही थी। मुझे याद है कि डॉ। डॉब्स में इसके बारे में पढ़ना और पुराने प्रोग्रामर को लेख के बारे में बताना - वे हँसे।

इसलिए इस बारे में मेरे दो विचार हैं, सैद्धांतिक और व्यावहारिक। सिद्धांत रूप में फोरट्रान को आज C / C ++ या यहां तक ​​कि किसी भी भाषा में असेंबली कोड के लिए कोई आंतरिक लाभ नहीं है। व्यवहार में फोरट्रान आज भी संख्यात्मक कोड के अनुकूलन के आसपास निर्मित इतिहास और संस्कृति की विरासत का लाभ उठाता है।

फोरट्रान 77 तक और साथ ही, भाषा डिज़ाइन के विचारों में मुख्य फोकस के रूप में अनुकूलन था। कंपाइलर सिद्धांत और प्रौद्योगिकी की स्थिति के कारण , कोड का अनुकूलन करने के लिए कंपाइलर को सर्वश्रेष्ठ शॉट देने के लिए अक्सर इसका मतलब सुविधाओं और क्षमता को प्रतिबंधित करना होता है। फोरट्रान 77 को एक पेशेवर रेस कार के रूप में सोचने के लिए एक अच्छी सादृश्यता है जो गति के लिए बलिदान करती है। इन दिनों कंपाइलरों ने सभी भाषाओं में बेहतर प्रदर्शन किया है और प्रोग्रामर उत्पादकता के लिए सुविधाओं को अधिक महत्व दिया गया है। हालांकि, अभी भी ऐसे स्थान हैं जहां लोग मुख्य रूप से वैज्ञानिक कंप्यूटिंग में तेजी से चिंतित हैं; इन लोगों को संभवतः उन लोगों से कोड, प्रशिक्षण और संस्कृति विरासत में मिली है, जो खुद फोरट्रान प्रोग्रामर थे।

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

फोरट्रान के इतिहास और संस्कृति के बारे में सीखने के लिए एक अद्भुत जगह है विकिपीडिया। फोरट्रान विकिपीडिया प्रविष्टि शानदार है और मैं उन लोगों की बहुत सराहना करता हूं जिन्होंने फोरट्रान समुदाय के लिए मूल्य बनाने के लिए समय और प्रयास किया है।

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


1
लिंक: web.archive.org/web/20090401205830/http://ubiety.uwaterloo.ca/… अब काम नहीं करता है। क्या कोई वैकल्पिक लिंक है?
nathanielng

64

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

सघन मैट्रिक्स गुणन बस है:

matmul(a,b)

वेक्टर x का L2 मान है:

sqrt(sum(x**2))

इसके अतिरिक्त कथन FORALL, PUREऔरELEMENTAL प्रक्रियाएं आदि कोड को अनुकूलित करने में मदद करते हैं। यहां तक ​​कि फोरट्रान में संकेत इस सरल कारण के कारण सी के रूप में लचीले होते हैं।

आगामी फोरट्रान मानक (2008) में सह-सरणियाँ हैं जो आपको आसानी से समानांतर कोड लिखने की अनुमति देती हैं। C95 से G95 (खुला स्रोत) और संकलक पहले से ही इसका समर्थन करते हैं।

तो हाँ फोरट्रान केवल तेजी से हो सकता है क्योंकि कंपाइलर इसे C / C ++ से बेहतर रूप से अनुकूलित / समानांतर कर सकते हैं। लेकिन फिर से जीवन में हर चीज की तरह अच्छे संकलक और बुरे संकलक हैं।



1
forallनिर्माण अब मान्य नहीं है क्योंकि compilers कोड अच्छी तरह से अनुकूलन नहीं कर सका। प्रतिस्थापन है do concurrent। इसके अलावा, कोड sqrt(sum(x**2))अक्षम दिखता है, क्योंकि कंपाइलर शायद पूरे वेक्टर का निर्माण करता है x**2। मुझे लगता है कि एक लूप बेहतर है, लेकिन यह निस्संदेह आंतरिक norm2फ़ंक्शन को कॉल करने के लिए सबसे अच्छा है ।
ए। हेन्निंक

39

यह हास्यास्पद है कि भाषाओं को न जानने से यहाँ बहुत सारे उत्तर हैं। यह विशेष रूप से C / C ++ प्रोग्रामर के लिए सच है, जिन्होंने 77 कोड खोला और पुराना है और कमजोरियों पर चर्चा करते हैं।

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

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

आजकल, आप केवल फोरट्रान और सी / सी ++ के साथ मिश्रित भाषा प्रोग्रामिंग कर सकते हैं। यहां तक ​​कि फोरट्रान में GTK + के लिए इंटरफेस भी हैं। मुफ्त संकलक (gfortran, g95) और कई उत्कृष्ट वाणिज्यिक हैं।


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

7
LAMMPS बेहद सरल C ++ में लिखा गया है जो भाषा की अधिकांश आधुनिक विशेषताओं का लाभ नहीं उठाता है। यह C ++ का प्रतिनिधित्व करता है जो फोर्ट्रन प्रोग्रामर जानते हैं जो C ++ 98 सीखने के बाद C लिखते हैं। यह कहना नहीं है कि LAMMPS खराब तरीके से लिखा गया है, बस यह उदाहरण नहीं है जब आप एचपीसी में C ++ की वकालत करना चाहते हैं।
जेफ

30

कई कारण हैं कि फोरट्रान तेजी से क्यों हो सकता है। हालाँकि, जो राशि वे मायने रखते हैं वह इतनी अयोग्य है या किसी भी तरह से काम की जा सकती है, यह बात नहीं होनी चाहिए। आजकल फ़ोर्ट्रान का उपयोग करने का मुख्य कारण विरासत अनुप्रयोगों को बनाए रखना या विस्तारित करना है।

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

  • फ़ंक्शंस का मानक सेट जो एरे से निपटता है, व्यक्तिगत तत्व नहीं। पाप की तरह सामान (), लॉग (), sqrt () स्केलर के बजाय सरण लेते हैं। इससे दिनचर्या को अनुकूलित करना आसान हो जाता है। यदि ये फ़ंक्शन इनलाइन या बिल्डिंस हैं, तो अधिकांश मामलों में ऑटो-वैरिएशन समान लाभ देता है

  • बिलिन जटिल प्रकार। सिद्धांत रूप में यह कंपाइलर को कुछ मामलों में कुछ निर्देशों को पुन: व्यवस्थित करने या समाप्त करने की अनुमति दे सकता है, लेकिन संभावना है कि आपको संरचना {डबल रे, आईएम के साथ एक ही लाभ दिखाई देगा; }; मुहावरे का इस्तेमाल सी में किया जाता है। यह तेजी से विकास के लिए बनाता है, क्योंकि ऑपरेटर्स फोरट्रान में जटिल प्रकारों पर काम करते हैं।


1
"लेकिन संभावना है कि आपको { double re, im; };C में उपयोग किए गए संरचनात्मक मुहावरे के साथ समान लाभ दिखाई देगा "। सी संकलक सबसे अधिक संभावना है कि कॉलर के स्टैक के साथ sret रूप में संरचना को स्थान आवंटित करते हुए, कैलरी के लिए एक पॉइंटर को पास करता है जो इसे भरता है। यह एक फोरट्रान कंपाइलर के रूप में रजिस्टरों में कई मूल्यों को वापस करने की तुलना में कई गुना धीमा है। ध्यान दें कि कॉम्प्लेक्स के विशेष मामले में C99 ने इसे ठीक किया।
जॉन हैरोप

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

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

28

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

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


25

एक भाषा के एक दूसरे से तेज होने जैसी कोई बात नहीं है, इसलिए उचित उत्तर नहीं है

आपके पास वास्तव में पूछने के लिए है "कोड फोरलेन संकलक की तुलना में फोरट्रान संकलक एक्स के साथ तेजी से संकलित कोड है?" पाठ्यक्रम के उस प्रश्न का उत्तर इस बात पर निर्भर करता है कि आप कौन से दो कंपाइलर चुनते हैं।

एक अन्य प्रश्न जो पूछ सकता है, "उनके कंपाइलरों में ऑप्टिमाइज़िंग में लगाए गए प्रयासों की समान मात्रा को देखते हुए, कौन सा कंपाइलर तेज कोड का उत्पादन करेगा?" इसका उत्तर वास्तव में फोरट्रान होगा । फोरट्रान संकलक के प्रमाणित फायदे हैं:

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

हालांकि, किसी को अपने सी कंपाइलर के अनुकूलन में एक टन का प्रयास करने से रोकना नहीं है, और यह उनके प्लेटफ़ॉर्म के फोरट्रान कंपाइलर से बेहतर कोड उत्पन्न करता है। वास्तव में, सी कंपाइलरों द्वारा उत्पन्न बड़ी बिक्री इस परिदृश्य को काफी संभव बनाती है


4
मैं सहमत हूँ। और क्या मैं यह जोड़ सकता हूं कि 50 के शुरुआती 60 के दशक के अंत में जब फोरट्रान को पेश किया गया था (यह पहली उच्च स्तरीय भाषा थी) तो इस बात पर संशय था कि यह कितना कुशल हो सकता है। इसलिए इसके डेवलपर्स को यह साबित करना था कि फोरट्रान कुशल और उपयोगी हो सकता है और बस अपनी बात को साबित करने के लिए इसे "मौत के लिए अनुकूलित" कर सकता है। C बहुत बाद में आया (70 के दशक के मध्य तक) और साबित करने के लिए कुछ भी नहीं था, इसलिए बोलने के लिए। लेकिन इस समय तक बहुत सारे फोरट्रान कोड लिखे जा चुके थे, इसलिए वैज्ञानिक समुदाय इससे चिपके हुए थे और अब भी है। मैं फोरट्रान को प्रोग्राम नहीं करता, लेकिन मैंने सी ++ से फोरट्रान सबरूटीन्स को कॉल करने के लिए लिंक करना सीख लिया है।
ओलुमाइड

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

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

@Praxeolitic - यह काफी सही है (यही वजह है कि मैं खुश हूं कि मैंने ऐसा कुछ नहीं कहा)।
टेड

@ ईमानदारी से, कुछ महीने बाद यहां वापस आ रहा हूं तो मुझे नहीं पता कि मैंने आपके जवाब पर वह टिप्पणी क्यों छोड़ दी। शायद मेरा मतलब उसे कहीं और छोड़ने का था? XP
21

22

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

होशियार नियमों का एक अन्य क्षेत्र जटिल संख्याएं हैं। इतना ही नहीं कि जब तक सी 99 नहीं लिया गया था कि सी उनके पास था, तब भी नियम उन्हें फोर्ट्रान में बेहतर हैं; चूँकि फोरट्रान लाइब्रेरी ऑफ़ गॉटरन को आंशिक रूप से C में लिखा गया है, लेकिन फोरट्रान शब्दार्थों को लागू करता है, GCC ने विकल्प प्राप्त किया (जिसका उपयोग "सामान्य" C कार्यक्रमों के साथ भी किया जा सकता है):

-fcx-फोरट्रान-नियम जटिल गुणा और भाग फोरट्रान नियमों का पालन करते हैं। सीमा में कमी को जटिल विभाजन के हिस्से के रूप में किया जाता है, लेकिन इस बात की कोई जाँच नहीं है कि उस मामले में स्थिति को बचाने के प्रयास के साथ एक जटिल गुणन या विभाजन का परिणाम "NaN + I * NaN" है या नहीं।

उपर्युक्त उल्लिखित नियम एक और बोनस है और यह भी - कम से कम सिद्धांत रूप में - पूरे-सरणी संचालन, जिसे यदि संकलक के अनुकूलक द्वारा ठीक से ध्यान में रखा जाता है, तो तेज कोड का नेतृत्व कर सकता है। गर्भनिरोधक पक्ष में यह है कि कुछ ऑपरेशन में अधिक समय लगता है, जैसे कि यदि कोई एक आवंटन योग्य सरणी में असाइनमेंट करता है, तो बहुत सारे चेक आवश्यक हैं (reallocate? [फोरट्रान 2003 फीचर], इसमें सरणी स्ट्राइड्स आदि हैं), जो बनाते हैं? सरल ऑपरेशन पर्दे के पीछे और अधिक जटिल - और इस तरह धीमी, लेकिन भाषा को अधिक शक्तिशाली बनाता है। दूसरी ओर, लचीली सीमा और तारों के साथ सरणी संचालन कोड लिखना आसान बनाता है - और कंपाइलर आमतौर पर उपयोगकर्ता की तुलना में बेहतर अनुकूलन कोड होता है।

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


नान + इनान मामले में सार्थक रूप से "बचाव" के लिए क्या है? क्या शिशुओं को NaN से अलग बनाता है, जो कि infinities पर हस्ताक्षर किए जाते हैं। गैर-जटिल शिशुओं को शामिल करने वाले ऑपरेशन, जो एक संकेतित संकेत उपज प्राप्त करेंगे NaN और मुझे लगता है कि कोई कारण जटिल संख्या अन्यथा नहीं करना चाहिए। यदि (2,2) में से एक (DBL_MAX, DBL_MAX) गुणा करता है, और तब परिणाम आता है, तो अतिप्रवाह की अनुपस्थिति में परिणाम का संकेत क्या होना चाहिए? इसके बजाय एक (1.001, DBL_MAX) से क्या गुणा होता है? मैं सही उत्तर के रूप में (NaN, NaN) और अनंत के रूप में अनन्तता और NaN के किसी भी संयोजन के बारे में बताता हूँ।
सुपरकैट

14

फोरट्रान और सी भाषाओं के बारे में कुछ भी नहीं है जो विशिष्ट उद्देश्यों के लिए एक दूसरे की तुलना में तेजी से बनाता है। इन भाषाओं में से प्रत्येक के लिए विशिष्ट संकलक के बारे में बातें हैं जो कुछ कार्यों को दूसरों की तुलना में अधिक अनुकूल बनाती हैं।

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

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


11
लगभग इसे उखाड़ फेंका। समस्या फोरट्रान कि है करता कुछ निहित फायदे हैं। हालाँकि, आप काफी स्पष्ट हैं कि देखने के लिए महत्वपूर्ण बात यह है कि भाषा नहीं है।
TED

14

मैं netlib से क्लासिक लेविन-कॉलाहन-डोंगर्रा बेंचमार्क के साथ फोरट्रान, सी और सी ++ की गति की तुलना करता हूं। OpenMP के साथ कई भाषा संस्करण है, http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors C कुरूप है, क्योंकि यह स्वचालित अनुवाद के साथ शुरू हुआ था, और कुछ के लिए प्रतिबंध और प्रचार का सम्मिलन compilers। C ++ एसटीएल टेम्प्लेट के साथ सी है जहां लागू होता है। मेरे विचार से, एसटीएल एक मिश्रित बैग है कि क्या यह स्थिरता को बेहतर बनाता है।

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

C / C ++ कंपाइलर जिसके पास अब तक सबसे व्यापक उपयोग है, में ऑटो-वेक्टरकरण का अभाव है, जिस पर ये बेंचमार्क बहुत अधिक निर्भर करते हैं।

इससे पहले जो पोस्ट आया था, उसे फिर से लें: उदाहरण के कुछ उदाहरण हैं जहाँ फोरट्रान का उपयोग मूल्यांकन के तेज या अधिक सटीक क्रम को निर्धारित करने के लिए किया जाता है। ज्ञात सी संकलक के पास अधिक महत्वपूर्ण अनुकूलन को अक्षम किए बिना कोष्ठकों का निरीक्षण करने के विकल्प नहीं हैं।


अलियासिंग समस्या को दूर करने के लिए बदसूरत अनुवाद की आवश्यकता है। आपको संकलक मॉक चर को यह बताने के लिए देना होगा कि बिंदु के रूप में कार्यान्वित किए गए ब्युर चर को रजिस्टर-अनुकूलित किया जा सकता है।
डेविड

12

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

मुझे नहीं पता कि यह एक ऐतिहासिक तथ्य है, लेकिन फोर्ट्रान को ऐसा लगता है कि यह समान / वितरित / वेक्टरकृत / जो भी कई-कोर-ized है। और आज यह बहुत "मानक मीट्रिक" है जब हम गति के बारे में बात कर रहे हैं: "क्या यह पैमाना है?"

शुद्ध सीपीयू crunching के लिए मैं फोरट्रान प्यार करता हूँ। IO से संबंधित किसी भी चीज के लिए मुझे C. के साथ काम करना आसान लगता है (वैसे भी दोनों में यह मुश्किल है)।

अब, समानांतर गणित गहन कोड के लिए, आप शायद अपने GPU का उपयोग करना चाहते हैं। C और फोरट्रान दोनों में बहुत कम या ज्यादा अच्छी तरह से एकीकृत CUDA / OpenCL इंटरफ़ेस (और अब OpenACC) है।

मेरा मध्यम वस्तुनिष्ठ उत्तर है: यदि आप दोनों भाषा को समान रूप से अच्छी तरह से / खराब तरीके से जानते हैं तो मुझे लगता है कि फोरट्रान तेज है क्योंकि मुझे सी। की तुलना में फोरट्रान में समानांतर / वितरित कोड लिखना आसान लगता है (एक बार जब आप समझ गए कि आप "फ्रीफॉर्म" फोरट्रान लिख सकते हैं) न केवल सख्त F77 कोड)

यहां उन लोगों के लिए 2 उत्तर दिया गया है जो मुझे नीचा दिखाना चाहते हैं क्योंकि उन्हें 1 उत्तर पसंद नहीं है: दोनों भाषाओं में उच्च-प्रदर्शन कोड लिखने के लिए आवश्यक विशेषताएं हैं। तो यह आपके द्वारा कार्यान्वित किए जा रहे एल्गोरिदम पर निर्भर है (सीपीयू इंटेंसिव? आईओओ इंटेंसिव? मेमोरी इंटेंसिव?), हार्डवेयर (सिंगल सीपीयू! मल्टी-कोर? सुपर कंप्यूटर वितरित? जीपीजीपीयू? एफपीजीए?), आपका कौशल और अंततः कंपाइलर ही। C और फोरट्रान दोनों में कमाल का कंपाइलर है। (मैं गंभीरता से हैरान हूं कि फोरट्रान कंपाइलर कितने उन्नत हैं, लेकिन सी कंपाइलर हैं)।

पुनश्च: मुझे खुशी है कि आपने विशेष रूप से लिबास को बाहर रखा है क्योंकि मुझे फोरट्रान जीयूआई लिबास के बारे में कहने के लिए बहुत बुरी चीजें हैं। :)


11

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


10

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

वैसे भी, एक अच्छा प्रोग्रामर किसी भी भाषा में फोरट्रान लिख सकता है।


@ स्कॉट क्लॉसन: आपको -1 नंबर मिले और मुझे नहीं पता कि क्यों। यह उपाय करने के लिए +1 किया था। हालाँकि, कुछ बातों को ध्यान में रखना है फोरट्रान हमारे माता-पिता की तुलना में लंबे समय तक रहा है। संकलक आउटपुट के अनुकूलन में बहुत समय व्यतीत हुआ: D
user7116

मैं सहमत हूँ। मैंने समानांतर रूप से एक बहुत ही समान उत्तर पोस्ट किया था।
लंबा जेफ़

सी में पॉइंटर उर्फ ​​मुद्दा दूसरों द्वारा उठाया गया है, लेकिन ऐसे कई तरीके हैं जो प्रोग्रामर आधुनिक कंपाइलरों पर इसका उपयोग करने के लिए उपयोग कर सकते हैं, इसलिए मैं अभी भी सहमत हूं।
लंबा जेफ़

1
@Kluge: "फोरट्रान के लिए कुछ भी आंतरिक नहीं है जो इसे सी से तेज बना देगा"। पॉइंटर अलियासिंग, रजिस्टरों में कंपाउंड वैल्यू वापस करना, बिल्ट-इन हाई-लेवल न्यूमेरिकल कंस्ट्रक्शन ...
जॉन हैरोप

9

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

एक उदाहरण सी पॉइंटर्स हैं। सी पॉइंटर्स का उपयोग हर जगह बहुत अधिक किया जाता है, लेकिन पॉइंटर्स के साथ समस्या यह है कि कंपाइलर आमतौर पर यह नहीं बता सकते हैं कि क्या वे एक ही एरे के विभिन्न हिस्सों की ओर इशारा कर रहे हैं।

उदाहरण के लिए यदि आपने एक कठिन दिनचर्या लिखी है जो इस तरह दिखाई देती है:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

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

[मुझे ध्यान देना चाहिए कि C99 में एक "प्रतिबंधित" कीवर्ड होता है, जो कि संकलक को बताता है कि संकेत ओवरलैप नहीं करते हैं। यह भी ध्यान दें कि फोरट्रान में भी पॉइंटर्स हैं, सी से अलग शब्दार्थ के साथ, लेकिन पॉइंटर्स सी के रूप में सर्वव्यापी नहीं हैं।

लेकिन सी बनाम फोरट्रान मुद्दे पर वापस आते हुए, यह अनुमान है कि एक फोरट्रान संकलक कुछ अनुकूलन करने में सक्षम है जो कि (सीधे लिखे गए) सी कार्यक्रम के लिए संभव नहीं हो सकता है। इसलिए मुझे दावे से बहुत आश्चर्य नहीं होगा। हालाँकि, मुझे उम्मीद है कि प्रदर्शन अंतर इतना सब कुछ नहीं होगा। [~ 5-10%]


9

त्वरित और सरल: दोनों समान रूप से तेज़ हैं, लेकिन फोरट्रान सरल है। अंत में तेजी से व्हाट्सएप एल्गोरिथ्म पर निर्भर करता है, लेकिन वैसे भी गति में कोई अंतर नहीं है। यह मैंने 2015 में उच्च प्रदर्शन कंप्यूटिंग केंद्र स्टटगार्ड, जर्मनी में एक फोरट्रान कार्यशाला में सीखा है। मैं फोरट्रान और सी दोनों के साथ काम करता हूं और इस राय को साझा करता हूं।

स्पष्टीकरण:

C को ऑपरेटिंग सिस्टम लिखने के लिए डिज़ाइन किया गया था। इसलिए उच्च प्रदर्शन कोड लिखने की आवश्यकता से अधिक स्वतंत्रता है। सामान्य तौर पर यह कोई समस्या नहीं है, लेकिन अगर कोई सावधानी से प्रोग्राम नहीं करता है, तो कोई आसानी से कोड को धीमा कर सकता है।

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

उदाहरण: हम एक फ़ंक्शन (फोरट्रान: सबरूटीन) को इनपुट तर्क के रूप में एक बड़ी संरचना देना चाहते हैं। फ़ंक्शन के भीतर तर्क बदल नहीं है।

C दोनों का समर्थन करता है, संदर्भ द्वारा कॉल करें और मूल्य से कॉल करें, जो एक आसान विशेषता है। हमारे मामले में, प्रोग्रामर गलती से कॉल का उपयोग कर सकता है। यह चीजों को काफी धीमा कर देता है, क्योंकि संरचना को पहले मेमोरी में कॉपी करना पड़ता है।

फोरट्रान केवल संदर्भ द्वारा कॉल के साथ काम करता है, जो प्रोग्रामर को हाथ से संरचना को कॉपी करने के लिए मजबूर करता है, अगर वह वास्तव में मूल्य ऑपरेशन द्वारा कॉल चाहता है। हमारे मामले में फोरट्रान स्वचालित रूप से सी संस्करण के रूप में उपवास के रूप में संदर्भ के साथ कॉल किया जाएगा।


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

@MaliRemorker उन्होंने इसे 2016 में लिखा था, 2010 में नहीं।
कोवलस्की

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

8

आमतौर पर फोरट्रान सी। की तुलना में धीमा होता है। प्रोग्रामर को हाथ से ऑप्टिमाइज़ करने की अनुमति देने वाले हार्डवेयर लेवल पॉइंटर्स का उपयोग कर सकते हैं। FORTRAN (ज्यादातर मामलों में) हैकिंग को संबोधित करने वाली हार्डवेयर मेमोरी तक पहुंच नहीं है। (VAX FORTRAN एक और कहानी है।) मैंने '70 के दशक से FORTRAN का उपयोग किया है। (वास्तव में।)

हालाँकि, 90 के फोरट्रान में शुरू करने के लिए विशिष्ट भाषा निर्माणों को शामिल करना शामिल है जिन्हें स्वाभाविक रूप से समानांतर एल्गोरिदम में अनुकूलित किया जा सकता है जो कर सकते हैं वास्तव में मल्टी-कोर प्रोसेसर पर चिल्ला । उदाहरण के लिए, स्वचालित वेक्टराइजिंग कई प्रोसेसरों को डेटा के वेक्टर में प्रत्येक तत्व को संभालने की अनुमति देता है। 16 प्रोसेसर - 16 तत्व वेक्टर - प्रसंस्करण समय 1/16 लेता है।

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

FORTRAN में, आपको केवल मल्टी-प्रोसेसिंग के लिए अपने एल्गोरिथ्म को सावधानीपूर्वक डिज़ाइन करना होगा। कंपाइलर और रन-टाइम आपके लिए बाकी का काम संभाल सकते हैं।

आप उच्च प्रदर्शन फोरट्रान के बारे में थोड़ा पढ़ सकते हैं , लेकिन आपको बहुत सारे मृत लिंक मिलते हैं। आप समानांतर प्रोग्रामिंग (जैसे OpenMP.org ) के बारे में पढ़ना बेहतर समझते हैं और कैसे फोरट्रान इसका समर्थन करता है।


6
@ एस.लॉट: मैं सोच भी नहीं सकता था कि हमारे यहां जो कोड्स हैं उनमें से ज्यादातर के लिए सी कोड लिखे जाने के कारण भयावह सी कोड कितना अच्छा लगता होगा। आपको फोरट्रान में सरल कोड से बेहतर प्रदर्शन मिलेगा। ऐसा नहीं है कि आप या मैं एक प्रतिसाद नहीं पा सके। : D
user7116

2
@Greg रोजर्स: आपको अपना मुद्दा फोरट्रान वेक्टराइजेशन लोगों के साथ रखना होगा, न कि मुझे। मैं वही पढ़ रहा हूं जो मैं पढ़ रहा हूं। polyhedron.com/absoftlinux
एस.लॉट

2
-1 // "आम तौर पर फोरट्रान सी की तुलना में धीमा है। यह लगभग सब कुछ के लिए सच है।" क्यों? // फोरट्रान बनाम सी में मल्टी-थ्रेडिंग का उपयोग करने में आसानी के आधार पर एक तर्क प्रदर्शन के बारे में कुछ नहीं कह रहा है।
स्टैबर्ट

4
@ S.Lott: "मल्टी-थ्रेडिंग केवल प्रदर्शन के लिए मौजूद है"। त्रुटि, नहीं।
जॉन हैरोप

4
@ एस.लॉट: "हार्डवेयर स्तर पर लगभग पॉइंटर्स का सी का उपयोग सी को फोरट्रान की तुलना में तेज होने की अनुमति देता है"। एर, नो
जॉन हैरोप

5

तेजी से कोड वास्तव में भाषा पर निर्भर नहीं है, कंपाइलर है ताकि आप ms-vb "कंपाइलर" देख सकें जो फूला हुआ, धीमा और निरर्थक ऑब्जेक्ट कोड है जो एक ".exe" के अंदर एक साथ बंधा हुआ है, लेकिन पावरबाइक बहुत अधिक तरीके से उत्पन्न होता है। बेहतर कोड। C और C ++ कंपाइलर द्वारा बनाया गया ऑब्जेक्ट कोड कुछ चरणों (कम से कम 2) में उत्पन्न होता है, लेकिन डिज़ाइन द्वारा अधिकांश फोरट्रान कंपाइलरों में कम से कम 5 चरण होते हैं, जिनमें उच्च-स्तरीय अनुकूलन शामिल होते हैं, इसलिए डिज़ाइन द्वारा फ़ोर्ट्रान में हमेशा एक अनुकूलित कोड उत्पन्न करने की क्षमता होती है। इसलिए अंत में कंपाइलर वह भाषा नहीं है जिसके लिए आपको पूछना चाहिए, सबसे अच्छा कंपाइलर मुझे पता है कि इंटेल फोरट्रान कंपाइलर है क्योंकि आप इसे LINUX और विंडोज पर प्राप्त कर सकते हैं और यदि आप देख रहे हैं तो आप IDE के रूप में VS का उपयोग कर सकते हैं, सस्ते जांघ संकलक आप हमेशा OpenWatcom पर रिले कर सकते हैं।

इसके बारे में अधिक जानकारी: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html


3

फोरट्रान में बेहतर I / O दिनचर्या है, उदाहरण के लिए निहित सुविधा से लचीलापन मिलता है जो C के मानक पुस्तकालय से मेल नहीं खा सकता है।

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


1
क्या आपके पास बेंचमार्क हैं जो फोरट्रान को सी / आई / ओ के लिए दिखाते हैं?
जेफ

3

आधुनिक मानकों और संकलक का उपयोग करना, नहीं!

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

आधुनिक कार्यान्वयन के लिए C सामान्य आउटपरफॉर्म फोरट्रान (हालांकि यह बहुत तेज़ है)।

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

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

इसकी एक निष्पक्ष आलोचना यह प्रतीत होती है कि बेंचमार्किंग पक्षपातपूर्ण हो सकती है। यहाँ एक और स्रोत है (C के सापेक्ष) जो परिणाम को अधिक संदर्भ में रखता है:

http://julialang.org/benchmarks/

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


3
फोरट्रान के बारे में कुछ भी मानना ​​एक मूर्ख होगा जो मानता है कि यह अभी भी फोरट्रान है। यह 25 साल से अधिक समय पहले बदल गया था। वे परीक्षण भाषाओं की तुलना नहीं कर सकते, क्योंकि वे विभिन्न विक्रेताओं के कंपाइलरों का उपयोग करते हैं, हालांकि इंटेल और जीसीसी दोनों में सी और फोरट्रान दोनों के लिए कंपाइलर हैं। इसलिए वे तुलनाएं बेकार हैं।
व्लादिमीर एफ

2

फोरट्रान बहुत सुविधाजनक रूप से सरणी, विशेष रूप से बहुआयामी सरणियों को संभाल सकता है। फोरट्रान में बहुआयामी सरणी के तत्वों को सील करना C / C ++ की तुलना में बहुत आसान हो सकता है। C ++ में अब लाइब्रेरी काम कर सकती हैं, जैसे कि Boost या Eigen, लेकिन वे सभी बाहरी लाइब्रेरी के बाद हैं। फोरट्रान में ये कार्य आंतरिक हैं।

क्या फोरट्रान तेजी से विकसित करने के लिए अधिक सुविधाजनक है या नहीं, ज्यादातर उस काम पर निर्भर करता है जिसे आपको समाप्त करने की आवश्यकता है। भूभौतिकी के लिए एक वैज्ञानिक संगणना व्यक्ति के रूप में, मैंने फोरट्रान (मैं आधुनिक फोरट्रान, = = F90) का अभिकलन किया।


1
और यह भी कि क्या फोरट्रान तेजी से है, इस पर भी निर्भर करता है: कंपाइलर जॉब्स (यह मायने रखता है!), गणना की नौकरियों के लिए कि क्या आप कोड के लिए उपयुक्त समानांतरण लागू करते हैं, और आपका कोड कैसे लिखा जाता है।
काई

1

यह कुछ हद तक व्यक्तिपरक है, क्योंकि यह संकलक की गुणवत्ता में और कुछ और की तुलना में अधिक है। हालाँकि, आपके प्रश्न का सीधे उत्तर देने के लिए, भाषा / संकलक दृष्टिकोण से बोलते हुए C के बारे में Fortran के बारे में कुछ भी नहीं है जो इसे स्वाभाविक रूप से तेज या C से बेहतर बनाने जा रहा है। यदि आप भारी गणित कार्य कर रहे हैं, तो यह नीचे आ जाएगा। संकलक की गुणवत्ता, प्रत्येक भाषा में प्रोग्रामर का कौशल और आंतरिक गणित समर्थन पुस्तकालय जो उन कार्यों का समर्थन करते हैं जो अंततः यह निर्धारित करते हैं कि किसी दिए गए कार्यान्वयन के लिए तेज़ होने जा रहा है।

EDIT: @Nils जैसे अन्य लोगों ने C में पॉइंटर्स के उपयोग में अंतर और अलियासिंग के लिए संभावना के बारे में अच्छी बात उठाई है कि शायद सी में सबसे अधिक भोली कार्यान्वयन धीमा हो जाता है। हालांकि, C99 में उस से निपटने के तरीके हैं संकलक अनुकूलन झंडे और / या सी वास्तव में कैसे लिखा जाता है। यह @ उत्तर उत्तर और उसके उत्तर पर आने वाली टिप्पणियों में अच्छी तरह से शामिल है।


यह एक एल्गोरिदम के बेंचमार्क टेस्ट की तरह लगता है। कम समय, फोरट्रान या सी? मेरे लिए व्यक्तिपरक नहीं है। शायद मुझे कुछ याद आ रहा है।
एस.लॉट।

1
सहमत नहीं हैं। आप संकलक की तुलना कर रहे हैं, भाषाओं की नहीं। मुझे लगता है कि मूल प्रश्न यह है कि यदि भाषा के बारे में ऐसा कुछ है जो इसे स्वाभाविक रूप से बेहतर बनाता है। यहाँ अन्य उत्तर सूक्ष्म संदिग्ध अंतरों में से कुछ में मिल रहे हैं, लेकिन मुझे लगता है कि हम सबसे सहमत हैं कि वे शोर में हैं।
लंबा जेफ़

यह एल्गोरिदम का O (n) विश्लेषण नहीं है। यह प्रदर्शन है। यह न देखें कि प्रदर्शन एक काल्पनिक कार्यान्वयन-स्वतंत्र अवधारणा कैसे हो सकता है। लगता है मुझे कुछ याद आ रहा है।
S.Lott

1
-1: "सी पर फोरट्रान के बारे में कुछ भी नहीं है जो इसे स्वाभाविक रूप से तेज या सी से बेहतर बनाने जा रहा है"। त्रुटि, नहीं।
जॉन हैरोप

0

अधिकांश पोस्ट पहले से ही सम्मोहक तर्क प्रस्तुत करते हैं, इसलिए मैं सिर्फ एक अलग पहलू में लौकिक 2 सेंट जोड़ूंगा।

अंत में प्रसंस्करण शक्ति के संदर्भ में फोरट्रान तेजी से या धीमा होने के कारण इसका महत्व हो सकता है, लेकिन अगर फोरट्रान में कुछ विकसित करने में 5 गुना अधिक समय लगता है क्योंकि:

  • इसमें शुद्ध संख्या क्रंचिंग से भिन्न कार्यों के लिए किसी अच्छे पुस्तकालय का अभाव है
  • यह प्रलेखन और इकाई परीक्षण के लिए किसी भी सभ्य उपकरण का अभाव है
  • यह बहुत कम अभिव्यंजकता वाली भाषा है, जो कोड की लाइनों की संख्या को आसमान छूती है।
  • इसमें तारों का बहुत खराब संचालन होता है
  • यह विभिन्न संकलक और आर्किटेक्चर के बीच एक पागल राशि है जो आपको पागल कर रही है।
  • यह एक बहुत ही खराब IO रणनीति है (क्रमिक फ़ाइलों की READ / WRITE। हाँ, यादृच्छिक अभिगम फ़ाइलें मौजूद हैं लेकिन क्या आपने इसका उपयोग करते हुए देखा है?)
  • यह अच्छी विकास प्रथाओं, मॉडर्नाइजेशन को प्रोत्साहित नहीं करता है।
  • एक पूरी तरह से मानक के प्रभावी अभाव, पूरी तरह से आज्ञाकारी उद्घाटन स्रोत संकलक (दोनों gfortran और g95 सब कुछ का समर्थन नहीं करते)
  • सी के साथ बहुत खराब अंतर्संचालनीयता (मैनिंगिंग: एक अंडरस्कोर, दो अंडरस्कोर, कोई अंडरस्कोर, सामान्य एक अंडरस्कोर में नहीं, लेकिन दो अगर एक और अंडरस्कोर है। और सिर्फ कॉमोन ब्लॉक में न डालें ...)

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


3
नीचा दिखाया गया है, हालांकि आप दिलचस्प बिंदुओं को उठाते हैं जो अन्य भाषाओं के मुकाबले लाभ / कमियों की चर्चा को जोड़ते हैं (जो कि मैं पूरी तरह से सहमत नहीं हूं), यह वास्तव में सवाल का जवाब नहीं है ...
steabert

@ स्टैबर्ट: वास्तव में, मैंने कहाI will just add the proverbial 2 cents to a different aspect
स्टेफानो बोरीनी

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

10
-1। आप F77 के संदर्भ में फोरट्रान के बारे में सोचते हैं। जिसे F90, F95, F03 और F08 द्वारा अधिगृहीत किया गया था।
काइल कानोस

4
डाउनवोट किया गया क्योंकि यह विशेष रूप से व्यापार-बंद के एक पक्ष के बारे में बात करता है। अधिकांश सामान्य प्रोग्रामिंग के लिए विकास की गति मायने रख सकती है, लेकिन यह इसे एकमात्र वैध व्यापार नहीं बनाता है। फोरट्रान प्रोग्रामर अक्सर वैज्ञानिक / इंजीनियर होते हैं, जो भाषा की सादगी को महत्व देते हैं (FORmula TRANslation सीखना बेहद आसान है और मास्टर। C / C ++ नहीं है ), उत्कृष्ट पुस्तकालयों (अक्सर अन्य भाषाओं से उपयोग किया जाता है), और गति (जैसे मौसम सिमुलेशन) कि फोरट्रान में दिन लगते हैं, लेकिन अगर महीने पूरी तरह से अन्य भाषाओं में लिखे गए हैं)।
BraveNewCurrency

-3

फोरट्रान परंपरागत रूप से -fp जैसे विकल्पों को सेट नहीं करता है: सख्त (जो ifort को USE IEEE_arithmetic में कुछ सुविधाओं को सक्षम करने की आवश्यकता है, f2003 मानक का एक हिस्सा)। Intel C ++ भी -fp को सेट नहीं करता है: एक डिफ़ॉल्ट के रूप में सख्त, लेकिन यह ERRNO हैंडलिंग के लिए आवश्यक है, उदाहरण के लिए, और अन्य C ++ कंपाइलर ERRNO को बंद करने या सिमड कमी जैसे अनुकूलन प्राप्त करने के लिए इसे सुविधाजनक नहीं बनाते हैं। gcc और g ++ ने मुझे खतरनाक संयोजन -O3 -ffast-math -fopenmp -march = देशी के उपयोग से बचने के लिए मेकफाइल स्थापित करने की आवश्यकता है। इन मुद्दों के अलावा, रिश्तेदार के प्रदर्शन के बारे में यह सवाल अधिक नाइट-पिकी हो जाता है और संकलक और विकल्प के विकल्प के बारे में स्थानीय नियमों पर निर्भर करता है।


हाल के जीसीसी अपडेट ने ओपनपैम और फास्ट-गणित के संयोजन के साथ समस्या को ठीक किया।
टिम

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