هل فورتران أسهل في التحسين من لغة C لإجراء العمليات الحسابية الثقيلة؟

StackOverflow https://stackoverflow.com/questions/146159

  •  02-07-2019
  •  | 
  •  

سؤال

من وقت لآخر قرأت أن Fortran هو أو يمكن أن يكون أسرع من C لإجراء العمليات الحسابية الثقيلة.هل هذا صحيح حقا؟يجب أن أعترف أنني بالكاد أعرف لغة فورتران، لكن كود فورتران الذي رأيته حتى الآن لم يُظهر أن اللغة تتمتع بميزات لا تمتلكها لغة C.

إذا كان هذا صحيحا، من فضلك قل لي لماذا.من فضلك لا تخبرني ما هي اللغات أو libs المناسبة لمعالجة الأرقام، لا أنوي كتابة تطبيق أو lib للقيام بذلك، أنا فقط فضولي.

هل كانت مفيدة؟

المحلول

اللغات لديها مجموعات ميزات مماثلة.يأتي اختلاف الأداء من حقيقة أن Fortran يقول أن الاسم المستعار غير مسموح به، ما لم يتم استخدام عبارة EQUIVALENCE.أي تعليمات برمجية تحتوي على أسماء مستعارة ليست صالحة في Fortran، ولكن الأمر متروك للمبرمج، وليس للمترجم، لاكتشاف هذه الأخطاء.وبالتالي يتجاهل مترجمو Fortran التعرجات المحتملة لمؤشرات الذاكرة ويسمحون لهم بإنشاء تعليمات برمجية أكثر كفاءة.ألقِ نظرة على هذا المثال الصغير في لغة 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;
    }
}

سيتم تشغيل هذه الوظيفة بشكل أبطأ من نظيرتها في Fortran بعد التحسين.لما ذلك؟إذا قمت بكتابة قيم في مصفوفة الإخراج، فيمكنك تغيير قيم المصفوفة.بعد كل شيء، يمكن أن تتداخل المؤشرات وتشير إلى نفس الجزء من الذاكرة (بما في ذلك ملف int المؤشر!).يضطر مترجم لغة C إلى إعادة تحميل قيم المصفوفة الأربع من الذاكرة لجميع العمليات الحسابية.

في Fortran، يمكن للمترجم تحميل قيم المصفوفة مرة واحدة وتخزينها في السجلات.يمكنه القيام بذلك لأن مترجم Fortran يفترض أن المؤشرات/المصفوفات لا تتداخل في الذاكرة.

لحسن الحظ، restrict تم تقديم الكلمات الرئيسية والتعرجات الصارمة إلى معيار C99 لمعالجة هذه المشكلة.إنه مدعوم جيدًا في معظم مترجمي C++ هذه الأيام أيضًا.تسمح لك الكلمة الأساسية بإعطاء المترجم تلميحًا بأن المبرمج يعد بأن المؤشر لا يستخدم اسمًا مستعارًا مع أي مؤشر آخر.يعني التعرج الصارم أن المبرمج يعد بأن المؤشرات من نوع مختلف لن تتداخل أبدًا، على سبيل المثال أ double* لن تتداخل مع int* (مع استثناء محدد وهو char* و void* يمكن أن تتداخل مع أي شيء).

إذا استخدمتها فسوف تحصل على نفس السرعة من C وFortran.ومع ذلك، فإن القدرة على استخدام restrict الكلمة الرئيسية التي تحتوي على وظائف مهمة للأداء فقط تعني أن برامج C (وC++) أكثر أمانًا وأسهل في الكتابة.على سبيل المثال، ضع في اعتبارك رمز Fortran غير الصالح: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), ، والذي سيسعد معظم مترجمي Fortran بتجميعه دون أي تحذير ولكنه يقدم خطأً يظهر فقط على بعض المترجمين، وعلى بعض الأجهزة، ومع بعض خيارات التحسين.

نصائح أخرى

نعم، في عام 1980؛في عام 2008؟يعتمد على

عندما بدأت البرمجة بشكل احترافي، كانت هيمنة فورتران على السرعة موضع تحدي.أتذكر قرأت عنها في د.دوبس وأخبروا المبرمجين الأكبر سنًا بالمقالة، فضحكوا.

لذلك لدي وجهتي نظر حول هذا الموضوع، نظري وعملي. نظريا ليس لدى Fortran اليوم أي ميزة جوهرية لـ C/C++ أو حتى أي لغة تسمح بتجميع التعليمات البرمجية. في التمرين لا تزال فورتران اليوم تتمتع بفوائد تراث التاريخ والثقافة المبنية على تحسين الكود الرقمي.

حتى إصدار Fortran 77، كان التركيز الرئيسي على اعتبارات تصميم اللغة هو التحسين.نظرًا لحالة نظرية المترجم والتكنولوجيا، غالبًا ما كان هذا يعني تقييد الميزات والقدرات من أجل منح المترجم أفضل فرصة لتحسين التعليمات البرمجية.التشبيه الجيد هو التفكير في Fortran 77 كسيارة سباق احترافية تضحي بالميزات من أجل السرعة.لقد أصبح المترجمون هذه الأيام أفضل عبر جميع اللغات وأصبحت ميزات إنتاجية المبرمجين أكثر قيمة.ومع ذلك، لا تزال هناك أماكن يهتم فيها الناس بشكل أساسي بالسرعة في الحوسبة العلمية؛من المرجح أن هؤلاء الأشخاص قد ورثوا التعليمات البرمجية والتدريب والثقافة من الأشخاص الذين كانوا هم أنفسهم مبرمجي فورتران.

عندما يبدأ المرء بالحديث عن تحسين التعليمات البرمجية، هناك العديد من المشكلات وأفضل طريقة للتعرف على ذلك هي للتربص بأماكن تواجد الأشخاص الذين تتمثل مهمتهم في الحصول على رمز رقمي سريع.لكن ضع في اعتبارك أن مثل هذه التعليمات البرمجية الحساسة للغاية عادة ما تكون جزءًا صغيرًا من الخطوط العامة للتعليمات البرمجية ومتخصصة جدًا:الكثير من أكواد فورتران تعتبر "غير فعالة" تمامًا مثل الكثير من الأكواد الأخرى باللغات الأخرى لا ينبغي أن يكون التحسين هو الشغل الشاغل لمثل هذا الكود.

مكان رائع للبدء في التعرف على تاريخ وثقافة فورتران هو ويكيبيديا. دخول فورتران ويكيبيديا رائع وأنا أقدر كثيرًا أولئك الذين بذلوا الوقت والجهد لجعله ذا قيمة لمجتمع فورتران.

(كانت النسخة المختصرة من هذه الإجابة عبارة عن تعليق في سلسلة المحادثات الممتازة التي بدأها نيلز ولكن ليس لدي الكارما للقيام بذلك.في الواقع، ربما لم أكن لأكتب أي شيء على الإطلاق، لكن هذا الموضوع يحتوي على محتوى معلوماتي فعلي ومشاركته بدلاً من حروب اللهب والتعصب اللغوي، وهي تجربتي الرئيسية مع هذا الموضوع.لقد غمرتني واضطررت إلى مشاركة الحب.)

إلى حد ما، تم تصميم Fortran مع مراعاة تحسين المترجم.تدعم اللغة عمليات المصفوفة بأكملها حيث يمكن للمترجمين استغلال التوازي (خاصة على المعالجات متعددة النواة).على سبيل المثال،

ضرب المصفوفة الكثيفة هو ببساطة:

matmul(a,b)

معيار L2 للمتجه x هو:

sqrt(sum(x**2))

وعلاوة على ذلك تصريحات مثل FORALL, PURE & ELEMENTAL الإجراءات الخمزيد من المساعدة لتحسين التعليمات البرمجية.حتى المؤشرات في Fortran ليست مرنة مثل C لهذا السبب البسيط.

يحتوي معيار فورتران القادم (2008) على مصفوفات مشتركة تسمح لك بكتابة تعليمات برمجية متوازية بسهولة.G95 (مفتوح المصدر) والمترجمون من CRAY يدعمونه بالفعل.

لذا نعم، يمكن أن يكون Fortran سريعًا ببساطة لأن المترجمين يمكنهم تحسينه/موازنته بشكل أفضل من C/C++.ولكن مرة أخرى، مثل أي شيء آخر في الحياة، هناك مترجمون جيدون ومترجمون سيئون.

ومن المضحك أن الكثير من الإجابات هنا من عدم معرفة اللغات.ينطبق هذا بشكل خاص على مبرمجي C/C++ الذين فتحوا كود FORTRAN 77 القديم وناقشوا نقاط الضعف فيه.

أفترض أن مشكلة السرعة هي في الغالب مسألة بين C/C++ وFortran.في الكود الضخم، يعتمد الأمر دائمًا على المبرمج.هناك بعض ميزات اللغة التي يتفوق عليها Fortran وبعض الميزات التي تتفوق عليها لغة C.لذلك، في عام 2011، لا يمكن لأحد أن يقول أيهما أسرع.

فيما يتعلق باللغة نفسها، يدعم Fortran في الوقت الحاضر ميزات Full OOP وهو متوافق تمامًا مع الإصدارات السابقة.لقد استخدمت Fortran 2003 جيدًا وأود أن أقول إنه كان من دواعي سروري استخدامه.في بعض الجوانب، لا يزال Fortran 2003 متأخرًا عن C++ ولكن دعونا نلقي نظرة على الاستخدام.يستخدم Fortran في الغالب للحسابات العددية، ولا يستخدم أحد ميزات C++ OOP الفاخرة لأسباب تتعلق بالسرعة.في الحوسبة عالية الأداء، لا يوجد مكان تقريبًا لـ C++ (ألق نظرة على معيار MPI وسترى أنه تم إهمال C++!).

في الوقت الحاضر، يمكنك ببساطة القيام ببرمجة لغات مختلطة باستخدام Fortran وC/C++.توجد أيضًا واجهات لـ GTK+ في Fortran.هناك مترجمات مجانية (gfortran، g95) والعديد من المجمعات التجارية الممتازة.

هناك عدة أسباب تجعل فورتران أسرع.ومع ذلك، فإن المبلغ الذي يهمهم غير مهم جدًا أو يمكن التغلب عليه على أي حال، ولا ينبغي أن يكون مهمًا.السبب الرئيسي لاستخدام Fortran في الوقت الحاضر هو الحفاظ على التطبيقات القديمة أو توسيعها.

  • الكلمات الرئيسية النقية والعنصرية على الوظائف.هذه هي الوظائف التي ليس لها أي آثار جانبية.يسمح هذا بإجراء تحسينات في حالات معينة حيث يعرف المترجم أنه سيتم استدعاء نفس الوظيفة بنفس القيم. ملحوظة:تطبق دول مجلس التعاون الخليجي كلمة "خالصة" كامتداد للغة.المترجمين الآخرين قد كذلك.يمكن للتحليل بين الوحدات أيضًا إجراء هذا التحسين ولكنه صعب.

  • مجموعة قياسية من الوظائف التي تتعامل مع المصفوفات، وليس العناصر الفردية.أشياء مثل sin() وlog() وsqrt() تأخذ المصفوفات بدلاً من الكميات.هذا يجعل من السهل تحسين الروتين. يعطي التوجيه التلقائي نفس الفوائد في معظم الحالات إذا كانت هذه الوظائف مضمنة أو مدمجة

  • نوع معقد مدمج.من الناحية النظرية، قد يسمح هذا للمترجم بإعادة ترتيب أو حذف تعليمات معينة في حالات معينة، ولكن من المحتمل أنك سترى نفس الفائدة مع البنية { double re, im;};المصطلح المستخدم في C.إنه يجعل التطوير أسرع على الرغم من أن المشغلين يعملون على أنواع معقدة في فورتران.

أعتقد أن النقطة الأساسية لصالح لغة Fortran هي أنها لغة أكثر ملاءمة للتعبير عن الرياضيات المستندة إلى المتجهات والمصفوفات.تعتبر مشكلة تحليل المؤشر المذكورة أعلاه حقيقية في الممارسة العملية، حيث لا يمكن للكود المحمول أن يفترض حقًا أنه يمكنك إخبار المترجم بشيء ما.هناك دائمًا ميزة للتعبير عن الحوسبة بطريقة أقرب إلى الشكل الذي يبدو عليه المجال.لا تحتوي لغة C حقًا على مصفوفات على الإطلاق، إذا نظرت عن كثب، فهي مجرد شيء يتصرف مثله.لدى فورتران مصفوفات حقيقية.مما يجعل من السهل تجميع أنواع معينة من الخوارزميات خاصة للأجهزة المتوازية.

في أعماق أشياء مثل نظام وقت التشغيل واتفاقيات الاتصال، تتشابه لغة C وFortran الحديثة بدرجة كافية بحيث يصعب رؤية ما يمكن أن يحدث فرقًا.لاحظ أن C هنا هو بالفعل الأساس C:تعد لغة C++ مشكلة مختلفة تمامًا ولها خصائص أداء مختلفة جدًا.

لا يوجد شيء اسمه أن لغة ما أسرع من لغة أخرى، لذا فإن الإجابة الصحيحة هي لا.

ما عليك أن تسأله حقًا هو "هل يتم تجميع الكود باستخدام Fortran Compiler X بشكل أسرع من الكود المكافئ الذي تم تجميعه باستخدام برنامج التحويل البرمجي C؟" تعتمد الإجابة على هذا السؤال بالطبع على اثنين من المترجمين التي تختارها.

سؤال آخر يمكن للمرء أن يطرحه سيكون على غرار "بالنظر إلى نفس القدر من الجهد المبذول في التحسين في المترجمين ، أي مترجم سينتج رمزا أسرع؟" الجواب على هذا سيكون في الواقع فورتران.يتمتع مترجمو Fortran بمزايا معتمدة:

  • كان على Fortran التنافس مع Assembly في الماضي عندما تعهد البعض بعدم استخدام المترجمين أبدًا، لذلك تم تصميمه من أجل السرعة.تم تصميم لغة C لتكون مرنة.
  • لقد كان مجال فورتران هو مجال معالجة الأرقام.في رمز المجال هذا هو أبداً سريع كفاية.لذلك كان هناك دائمًا الكثير من الضغط للحفاظ على كفاءة اللغة.
  • يتم إجراء معظم الأبحاث حول تحسينات المترجمات من قبل أشخاص مهتمين بتسريع كود معالجة أرقام Fortran، لذا فإن تحسين كود Fortran يعد مشكلة معروفة أكثر بكثير من تحسين أي لغة مجمعة أخرى، وتظهر الابتكارات الجديدة في مترجمات Fortran أولاً.
  • بيجي:تشجع لغة C استخدام المؤشر بشكل أكبر بكثير من لغة Fortran.يؤدي هذا إلى زيادة النطاق المحتمل لأي عنصر بيانات في برنامج C بشكل كبير، مما يجعل تحسينه أكثر صعوبة.لاحظ أن Ada هي أيضًا أفضل بكثير من لغة C في هذا المجال، وهي لغة OO أكثر حداثة من لغة Fortran77 الشائعة.إذا كنت تريد لغة OO يمكنها إنشاء تعليمات برمجية أسرع من لغة C، فهذا خيار مناسب لك.
  • نظرًا مرة أخرى لمكانتها المتخصصة في تحليل الأرقام، يميل عملاء مترجمي Fortran إلى الاهتمام بالتحسين أكثر من عملاء مترجمي لغة C.

ومع ذلك، لا يوجد ما يمنع أي شخص من بذل الكثير من الجهد لتحسين مترجم C الخاص به، وجعله يولد تعليمات برمجية أفضل من مترجم Fortran الخاص بمنصته.في الواقع، المبيعات الكبيرة الناتجة عن مترجمي لغة C تجعل هذا السيناريو ممكنًا تمامًا

هناك عنصر آخر يختلف فيه Fortran عن C - ومن المحتمل أن يكون أسرع.لدى Fortran قواعد تحسين أفضل من C.في فورتران، لا يتم تحديد ترتيب تقييم التعبيرات، مما يسمح للمترجم بتحسينه - إذا أراد المرء فرض ترتيب معين، فيجب عليه استخدام الأقواس.في لغة C، يكون الترتيب أكثر صرامة، ولكن مع الخيارات "-fast"، تكون أكثر استرخاءً ويتم تجاهل "(...)" أيضًا.أعتقد أن فورتران لديه طريق يقع بشكل جيد في المنتصف.(حسنًا، IEEE يجعل الحياة أكثر صعوبة نظرًا لأن بعض تغييرات ترتيب التقييم تتطلب عدم حدوث تجاوزات، وهو ما يجب تجاهله أو إعاقة التقييم).

مجال آخر من القواعد الأكثر ذكاءً هو الأعداد المركبة.لم يقتصر الأمر على أن الأمر استغرق حتى C 99 حتى حصلت عليها C، بل إن القواعد التي تحكمها أفضل في Fortran؛نظرًا لأن مكتبة Fortran الخاصة بـ gfortran مكتوبة جزئيًا بلغة C ولكنها تطبق دلالات Fortran، فقد اكتسبت دول مجلس التعاون الخليجي الخيار (والذي يمكن استخدامه أيضًا مع برامج C "العادية"):

-قواعد FCX-فورتران يتبع الضرب والقسمة المعقدة قواعد فورتران.يتم تقليل النطاق كجزء من القسمة المعقدة، ولكن لا يوجد تحقق مما إذا كانت نتيجة الضرب أو القسمة المعقدة هي "NaN + I*NaN"، مع محاولة إنقاذ الموقف في هذه الحالة.

تعتبر قواعد الاسم المستعار المذكورة أعلاه ميزة أخرى وأيضًا - على الأقل من حيث المبدأ - عمليات المصفوفة الكاملة، والتي إذا تم أخذها في الاعتبار بشكل صحيح بواسطة مُحسِّن المترجم، يمكن أن تؤدي إلى تعليمات برمجية أسرع.على الجانب الآخر، هناك بعض العمليات التي تستغرق وقتًا أطول، على سبيل المثال.إذا قام شخص ما بمهمة لمصفوفة قابلة للتخصيص، فهناك الكثير من عمليات التحقق الضرورية (إعادة التخصيص؟[ميزة Fortran 2003]، تحتوي على خطوات المصفوفة، وما إلى ذلك)، مما يجعل العملية البسيطة أكثر تعقيدًا خلف الكواليس - وبالتالي أبطأ، ولكنها تجعل اللغة أكثر قوة.من ناحية أخرى، فإن عمليات المصفوفة ذات الحدود والخطوات المرنة تجعل من السهل كتابة التعليمات البرمجية - وعادة ما يكون المترجم أفضل في تحسين التعليمات البرمجية من المستخدم.

في المجمل، أعتقد أن كلا من C وFortran يتمتعان بالسرعة نفسها تقريبًا؛يجب أن يكون الاختيار هو اللغة التي تفضلها أكثر أو ما إذا كان استخدام عمليات المصفوفة الكاملة لـ Fortran وقابليتها الأفضل للنقل أكثر فائدة - أو التواصل الأفضل مع مكتبات النظام وواجهة المستخدم الرسومية في لغة C.

لا يوجد شيء بخصوص اللغات Fortran وC مما يجعل أحدهما أسرع من الآخر لأغراض محددة.هناك أشياء حول محددة المترجمين لكل لغة من هذه اللغات مما يجعل بعضها مفضلاً لمهام معينة أكثر من غيرها.

لسنوات عديدة، كانت مجمعات Fortran موجودة والتي يمكنها القيام بالسحر الأسود لروتينك الرقمي، مما يجعل العديد من الحسابات المهمة سريعة إلى حد جنوني.لم يتمكن مترجمو C المعاصرون من القيام بذلك أيضًا.ونتيجة لذلك، نشأ عدد من مكتبات الأكواد الرائعة في فورتران.إذا كنت ترغب في استخدام هذه المكتبات الرائعة والناضجة والمختبرة جيدًا، فعليك استخدام مترجم Fortran.

تظهر ملاحظاتي غير الرسمية أن الناس في هذه الأيام يقومون بترميز أغراضهم الحسابية الثقيلة بأي لغة قديمة، وإذا استغرق الأمر بعض الوقت، فإنهم يجدون الوقت في مجموعة حوسبة رخيصة.قانون مور يجعل منا حمقى.

أقارن سرعة Fortran وC وC++ مع معيار Levine-Callahan-Dongarra الكلاسيكي من netlib.الإصدار متعدد اللغات، مع OpenMP، هوhttp://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectorsلغة C أقبح، لأنها بدأت بالترجمة الآلية، بالإضافة إلى إدراج القيود والبراغمات لبعض المترجمين.C++ هو مجرد C مع قوالب STL حيثما أمكن ذلك.من وجهة نظري، فإن STL عبارة عن حقيبة مختلطة فيما يتعلق بما إذا كانت تعمل على تحسين قابلية الصيانة.

لا يوجد سوى الحد الأدنى من ممارسة الوظيفة التلقائية في البطانة لمعرفة إلى أي مدى تعمل على تحسين التحسين، حيث أن الأمثلة تعتمد على ممارسة فورتران التقليدية حيث يتم الاعتماد بشكل ضئيل على البطانة.

يفتقر مترجم C/C++ الذي يتمتع بالاستخدام الأكثر انتشارًا إلى التوجيه التلقائي، والذي تعتمد عليه هذه المعايير بشكل كبير.

إعادة المشاركة التي جاءت قبل هذا مباشرة:هناك بضعة أمثلة حيث يتم استخدام الأقواس في فورتران لإملاء ترتيب أسرع أو أكثر دقة للتقييم.لا يتوفر لمترجمي لغة C المعروفين خيارات لمراقبة الأقواس دون تعطيل التحسينات الأكثر أهمية.

لقد كنت أقوم ببعض الرياضيات المكثفة باستخدام FORTRAN وC لبضع سنوات.من تجربتي الخاصة أستطيع أن أقول أن لغة FORTRAN هي في بعض الأحيان أفضل من لغة C ولكن ليس بسبب سرعتها (يمكن للمرء أن يجعل لغة C تعمل بنفس سرعة لغة FORTRAN باستخدام أسلوب الترميز المناسب) ولكن بسبب المكتبات المحسنة بشكل جيد للغاية مثل LAPACK، وبسبب موازاة كبيرة.في رأيي، يعد استخدام FORTRAN أمرًا صعبًا حقًا، كما أن مزاياه ليست جيدة بما يكفي لإلغاء هذا العيب، لذا فأنا الآن أستخدم C+GSL لإجراء العمليات الحسابية.

أنا مبرمج هاوٍ ولدي "متوسط" في كلتا اللغتين.أجد أنه من الأسهل كتابة كود فورتران سريعًا بدلاً من كود C (أو C++).تعد كل من لغة Fortran وC لغتين "تاريخيتين" (وفقًا لمعايير اليوم)، ويتم استخدامهما بكثافة، كما أنهما مزودان بمترجم مجاني وتجاري مدعوم جيدًا.

لا أعرف ما إذا كانت هذه حقيقة تاريخية ولكن فورتران تبدو وكأنها مصممة لتكون متوازية/موزعة/متجهة/متعددة النوى.واليوم هو إلى حد كبير "المقياس القياسي" عندما نتحدث عن السرعة:"هل هو مقياس؟"

من أجل معالجة وحدة المعالجة المركزية النقية، أحب Fortran.بالنسبة لأي شيء متعلق بـ IO، أجد أنه من الأسهل العمل مع C.(إنه أمر صعب في كلتا الحالتين على أي حال).

الآن بالطبع، بالنسبة للتعليمات البرمجية المكثفة للرياضيات الموازية، ربما تريد استخدام وحدة معالجة الرسومات (GPU) الخاصة بك.يتمتع كل من C وFortran بالكثير من واجهة CUDA/OpenCL المتكاملة بشكل أو بآخر (والآن OpenACC).

إجابتي الموضوعية إلى حد ما هي:إذا كنت تعرف اللغتين بشكل جيد/ضعيف على قدم المساواة، فأعتقد أن Fortran أسرع لأنني أجد أنه من الأسهل كتابة تعليمات برمجية متوازية/موزعة في Fortran مقارنة بـ C.(بمجرد أن تفهم أنه يمكنك كتابة فورتران "بشكل حر" وليس فقط كود F77 الصارم)

إليك الإجابة الثانية لأولئك الذين يرغبون في التصويت ضدي لأنهم لا يحبون الإجابة الأولى:تتمتع كلتا اللغتين بالميزات المطلوبة لكتابة تعليمات برمجية عالية الأداء.لذا فهو يعتمد على الخوارزمية التي تنفذها (وحدة المعالجة المركزية المكثفة؟ايو مكثفة؟الذاكرة كثيفة؟)، الأجهزة (وحدة معالجة مركزية واحدة؟متعدد النواة؟توزيع الكمبيوتر العملاق؟GPGPU ؟FPGA؟)، مهارتك وفي النهاية المترجم نفسه.يحتوي كل من C وFortran على مترجم رائع.(أنا مندهش للغاية من مدى تقدم مترجمي Fortran وكذلك مترجمي C).

ملاحظة :أنا سعيد لأنك استبعدت libs على وجه التحديد لأن لدي الكثير من الأشياء السيئة لأقولها عن Fortran GUI libs.:)

لم أسمع أن Fortan أسرع بكثير من لغة C، ولكن قد يكون من المتصور أنه في بعض الحالات سيكون أسرع.والمفتاح ليس في سمات اللغة الموجودة، بل في تلك التي (عادة) غائبة.

ومن الأمثلة على ذلك مؤشرات C.يتم استخدام مؤشرات C تقريبًا في كل مكان، ولكن مشكلة المؤشرات هي أن المترجم عادةً لا يمكنه معرفة ما إذا كانت تشير إلى أجزاء مختلفة من نفس المصفوفة.

على سبيل المثال، إذا كتبت روتين strcpy الذي يبدو كالتالي:

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

يجب أن يعمل المترجم على افتراض أن d و s قد يكونان متداخلين في المصفوفات.لذلك لا يمكنه إجراء تحسين من شأنه أن يؤدي إلى نتائج مختلفة عندما تتداخل المصفوفات.وكما تتوقع، فإن هذا يحد بشكل كبير من نوع التحسينات التي يمكن إجراؤها.

[يجب أن أشير إلى أن C99 يحتوي على كلمة رئيسية "مقيدة" تخبر المترجمين بوضوح أن المؤشرات لا تتداخل.لاحظ أيضًا أن لغة Fortran تحتوي أيضًا على مؤشرات، ذات دلالات مختلفة عن تلك الخاصة بـ C، لكن المؤشرات ليست موجودة في كل مكان كما هو الحال في C.]

لكن العودة إلى C مقابل.بالنسبة لمشكلة Fortran، فمن الممكن أن يكون مترجم Fortran قادرًا على إجراء بعض التحسينات التي قد لا تكون ممكنة لبرنامج C (مكتوب بشكل مباشر).لذلك لن أتفاجأ كثيرًا بهذا الادعاء.ومع ذلك، أتوقع أن الفرق في الأداء لن يكون كبيرًا.[~5-10%]

أي اختلافات في السرعة بين Fortran وC ستكون أكثر من وظيفة تحسينات المترجم ومكتبة الرياضيات الأساسية التي يستخدمها المترجم المعين.لا يوجد شيء جوهري في Fortran من شأنه أن يجعله أسرع من C.

على أية حال، يمكن للمبرمج الجيد أن يكتب فورتران بأي لغة.

سريعة وبسيطة:كلاهما متساويان في السرعة، لكن فورتران أبسط.ما هو الأسرع حقًا في النهاية يعتمد على الخوارزمية، ولكن لا يوجد فرق كبير في السرعة على أي حال.هذا ما تعلمته في ورشة عمل فورتران في مركز الحوسبة عالية الأداء في شتوتغارد بألمانيا عام 2015.أنا أعمل مع Fortran وC وأشارك هذا الرأي.

توضيح:

تم تصميم لغة C لكتابة أنظمة التشغيل.ومن ثم فهو يتمتع بحرية أكبر من اللازم لكتابة تعليمات برمجية عالية الأداء.بشكل عام، هذه ليست مشكلة، ولكن إذا لم يقم الشخص بالبرمجة بعناية، فيمكنه بسهولة إبطاء الكود.

تم تصميم فورتران للبرمجة العلمية.لهذا السبب، فهو يدعم كتابة بناء جملة التعليمات البرمجية السريعة، لأن هذا هو الغرض الرئيسي من Fortran.وعلى عكس الرأي العام، فإن فورتران ليست لغة برمجة قديمة.أحدث معاييرها هو عام 2010 ويتم نشر المترجمين الجدد بشكل منتظم، حيث تتم كتابة معظم التعليمات البرمجية عالية الأداء في فورتران. يدعم Fortran أيضًا الميزات الحديثة مثل توجيهات المترجم (في لغة C pragmas).

مثال: نريد إعطاء بنية كبيرة كوسيطة إدخال للدالة (فورتران:روتين فرعي).داخل الدالة لا يتم تغيير الوسيطة.

تدعم لغة C كلاً من الاتصال حسب المرجع والاتصال حسب القيمة، وهي ميزة مفيدة.في حالتنا، قد يستخدم المبرمج عن طريق الخطأ استدعاء القيمة.يؤدي هذا إلى إبطاء الأمور إلى حد كبير، حيث يجب نسخ البنية داخل الذاكرة أولاً.

يعمل Fortran مع الاستدعاء حسب المرجع فقط، مما يجبر المبرمج على نسخ البنية يدويًا، إذا كان يريد حقًا إجراء عملية استدعاء حسب القيمة.في حالتنا، سيتم تشغيل فورتران تلقائيًا بنفس سرعة الإصدار C مع الاتصال حسب المرجع.

بشكل عام، FORTRAN أبطأ من C.يمكن للغة C استخدام مؤشرات مستوى الأجهزة التي تسمح للمبرمج بالتحسين اليدوي.لا يتمتع FORTRAN (في معظم الحالات) بإمكانية الوصول إلى اختراقات معالجة ذاكرة الأجهزة.(VAX FORTRAN قصة أخرى.) لقد استخدمت FORTRAN بشكل متقطع منذ السبعينيات.(حقًا.)

ومع ذلك، بدءًا من التسعينيات، تطورت لغة FORTRAN لتشمل بنيات لغوية محددة يمكن تحسينها إلى خوارزميات متوازية بطبيعتها والتي يستطيع تصرخ حقا على معالج متعدد النواة.على سبيل المثال، يسمح التوجيه التلقائي لمعالجات متعددة بالتعامل مع كل عنصر في ناقل البيانات بشكل متزامن.16 معالجًا - 16 عنصرًا متجهًا - تستغرق المعالجة 1/16 من الوقت.

في لغة C، عليك إدارة المواضيع الخاصة بك وتصميم الخوارزمية الخاصة بك بعناية للمعالجة المتعددة، ثم استخدام مجموعة من استدعاءات واجهة برمجة التطبيقات (API) للتأكد من حدوث التوازي بشكل صحيح.

في FORTRAN، ما عليك سوى تصميم الخوارزمية الخاصة بك بعناية للمعالجة المتعددة.يمكن للمترجم ووقت التشغيل التعامل مع الباقي نيابةً عنك.

يمكنك أن تقرأ قليلا عن فورتران عالي الأداء, ، لكنك تجد الكثير من الروابط الميتة.من الأفضل أن تقرأ عن البرمجة المتوازية (مثل OpenMP.org) وكيف يدعم FORTRAN ذلك.

الكود الأسرع لا يعود حقًا إلى اللغة، فهو المترجم لذا يمكنك رؤية "المترجم" ms-vb الذي يقوم بإنشاء كود كائن متضخم وأبطأ ومتكرر مرتبط ببعضه البعض داخل ".exe"، ولكن PowerBasic ينشئ بطريقة كبيرة جدًا رمز أفضل.يتم إنشاء كود الكائن الذي تم إنشاؤه بواسطة مترجمي C وC++ في بعض المراحل (مرحلتين على الأقل) ولكن حسب التصميم، فإن معظم مترجمي Fortran لديهم 5 مراحل على الأقل بما في ذلك التحسينات عالية المستوى، لذا، حسب التصميم، سيكون لدى Fortran دائمًا القدرة على إنشاء تعليمات برمجية محسنة للغاية.إذن في النهاية، المترجم ليس اللغة التي يجب أن تطلبها، أفضل مترجم أعرفه هو Intel Fortran Compiler لأنه يمكنك الحصول عليه على نظامي LINUX وWindows ويمكنك استخدام VS باعتباره IDE، إذا كنت تبحث عن مترجم رخيص الثمن يمكنك دائمًا ترحيله على OpenWatcom.

مزيد من المعلومات حول هذا:http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html

يتمتع Fortran بإجراءات إدخال/إخراج أفضل، على سبيل المثال.توفر ميزة do الضمنية مرونة لا يمكن لمكتبة C القياسية أن تطابقها.

يتعامل مترجم Fortran مباشرة مع الأكثر تعقيدا بناء الجملة المعنية ، وعلى هذا النحو لا يمكن تقليل بناء الجملة بسهولة لنموذج تمرير الحجة ، لا يمكن ل C تنفيذه بكفاءة.

باستخدام المعايير الحديثة والمترجم، لا!

اقترح بعض الأشخاص هنا أن برنامج FORTRAN أسرع لأن المترجم لا يحتاج إلى القلق بشأن الاسم المستعار (وبالتالي يمكنه وضع المزيد من الافتراضات أثناء التحسين).ومع ذلك، فقد تم التعامل مع هذا الأمر في لغة C منذ معيار C99 (على ما أظن) مع تضمين الكلمة الأساسية المقيدة.والذي يخبر المترجم بشكل أساسي أنه ضمن نطاق العطاء، فإن المؤشر ليس مستعارًا.علاوة على ذلك، تتيح لغة C حساب المؤشر المناسب، حيث يمكن لأشياء مثل الاسم المستعار أن تكون مفيدة جدًا من حيث الأداء وتخصيص الموارد.على الرغم من أنني أعتقد أن الإصدار الأحدث من FORTRAN يتيح استخدام المؤشرات "المناسبة".

بالنسبة للتطبيقات الحديثة، تتفوق لغة C العامة على لغة FORTRAN (على الرغم من أنها سريعة جدًا أيضًا).

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

يحرر:

يبدو أن الانتقاد العادل لهذا هو أن القياس قد يكون متحيزًا.إليك مصدر آخر (بالنسبة لـ C) يضع النتيجة في سياق أكبر:

http://julialang.org/benchmarks/

يمكنك أن ترى أن لغة C تتفوق عادةً على لغة Fortran في معظم الحالات (انظر مرة أخرى الانتقادات أدناه والتي تنطبق هنا أيضًا)؛وكما ذكر آخرون، فإن قياس الأداء هو علم غير دقيق يمكن تحميله بسهولة لتفضيل لغة واحدة على اللغات الأخرى.لكنه يضع في السياق كيفية تشابه أداء Fortran وC.

يمكن لـ Fortran التعامل مع المصفوفات، وخاصة المصفوفات متعددة الأبعاد، بشكل مريح للغاية.يمكن أن يكون تقطيع عناصر المصفوفة متعددة الأبعاد في Fortran أسهل بكثير من ذلك في C/C++.تحتوي لغة C++ الآن على مكتبات يمكنها القيام بهذه المهمة، مثل Boost أو Eigen، لكنها بعد كل شيء مكتبات خارجية.في فورتران هذه الوظائف جوهرية.

ما إذا كان Fortran أسرع أو أكثر ملاءمة للتطوير يعتمد في الغالب على المهمة التي تحتاج إلى إنهائها.باعتباري متخصصًا في الحساب العلمي للجيوفيزياء، فقد أجريت معظم العمليات الحسابية بلغة فورتران (أعني فورتران الحديثة، >=F90).

هذا أكثر من مجرد موضوعي إلى حد ما، لأنه يدخل في جودة المترجمين وما إلى ذلك أكثر من أي شيء آخر.ومع ذلك، للإجابة على سؤالك بشكل أكثر مباشرة، من وجهة نظر اللغة/المترجم، لا يوجد شيء حول Fortran عبر C مما يجعله أسرع أو أفضل بطبيعته من C.إذا كنت تقوم بعمليات حسابية ثقيلة، فسوف يعود الأمر إلى جودة المترجم، ومهارة المبرمج في كل لغة ومكتبات دعم الرياضيات الجوهرية التي تدعم تلك العمليات لتحديد أي منها سيكون أسرع في تنفيذ معين. .

يحرر:لقد أثار أشخاص آخرون مثلNils النقطة الجيدة حول الاختلاف في استخدام المؤشرات في لغة C وإمكانية الاسم المستعار الذي ربما يجعل التطبيقات الأكثر سذاجة أبطأ في لغة C.ومع ذلك، هناك طرق للتعامل مع ذلك في C99، عبر إشارات تحسين المترجم و/أو في كيفية كتابة C بالفعل.تمت تغطية هذا جيدًا في إجابة @ Nils والتعليقات اللاحقة التي تتبع إجابته.

تقدم معظم المنشورات بالفعل حججًا مقنعة، لذا سأضيف فقط سنتين المثل إلى جانب مختلف.

قد يكون لكون فورتران أسرع أو أبطأ من حيث قوة المعالجة في النهاية أهميته، ولكن إذا استغرق تطوير شيء ما في فورتران وقتًا أطول بخمسة أضعاف للأسباب التالية:

  • فهو يفتقر إلى أي مكتبة جيدة لمهام مختلفة عن معالجة الأرقام الخالصة
  • أنها تفتقر إلى أي أداة لائقة للتوثيق واختبار الوحدة
  • إنها لغة ذات تعبيرية منخفضة جدًا، مما يزيد بشكل كبير من عدد أسطر التعليمات البرمجية.
  • لديها معالجة سيئة للغاية للسلاسل
  • إنه يحتوي على قدر لا بأس به من المشكلات بين المترجمين والبنيات المختلفة مما يدفعك إلى الجنون.
  • لديها استراتيجية إدخال/إخراج سيئة للغاية (قراءة/كتابة الملفات المتسلسلة.نعم، ملفات الوصول العشوائي موجودة ولكن هل رأيتها مستخدمة من قبل؟)
  • فهو لا يشجع ممارسات التطوير الجيدة والنموذجية.
  • الافتقار الفعال إلى مترجم مفتوح المصدر قياسي ومتوافق تمامًا (كل من gfortran و g95 لا يدعمان كل شيء)
  • إمكانية التشغيل التفاعلي سيئة للغاية مع لغة C (التشويه:شرطة سفلية واحدة، شرطتان سفليتان، بدون شرطة سفلية، بشكل عام شرطة سفلية واحدة ولكن اثنتين إذا كان هناك شرطة سفلية أخرى.ولا تدعنا نخوض في الكتل المشتركة...)

ثم المسألة ليست ذات صلة.إذا كان هناك شيء بطيء، فلن تتمكن في معظم الأحيان من تحسينه بما يتجاوز حدًا معينًا.إذا كنت تريد شيئًا أسرع، قم بتغيير الخوارزمية.في النهاية، وقت الكمبيوتر رخيص.وقت الإنسان ليس كذلك.قيمة الاختيار الذي يقلل من الوقت البشري.إذا زاد وقت الكمبيوتر، فهو فعال من حيث التكلفة على أي حال.

تقليديًا، لا يقوم Fortran بتعيين خيارات مثل -fp:strict (والتي يتطلبها ifort لتمكين بعض الميزات في USE IEEE_arithmetic، وهو جزء من معيار f2003).لا يقوم Intel C++ أيضًا بتعيين -fp:strict كإعداد افتراضي، ولكن هذا مطلوب لمعالجة ERRNO، على سبيل المثال، ولا تجعل برامج التحويل البرمجي C++ الأخرى من السهل إيقاف تشغيل ERRNO أو الحصول على تحسينات مثل تقليل simd.لقد طلب مني gcc وg++ إعداد Makefile لتجنب استخدام التركيبة الخطيرة -O3 -ffast-math -fopenmp -march=native.بخلاف هذه المشكلات، يصبح هذا السؤال حول الأداء النسبي أكثر صعوبة ويعتمد على القواعد المحلية حول اختيار المترجمين والخيارات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top