2012-01-02 5 views
5

Сегодня я читал код из очень популярных числовых библиотек, написанных в FORTRAN 77, таких как QUADPACK (last updated in 1987), и мне было интересно, есть ли причина переписывать эти библиотеки в Fortran 90, кроме большого количества работы с учетом больших улучшений Fortran 90, принесенных на язык, включая источник свободной формы, улучшенные структуры управления, поэтому GO TO можно было забыть, векторизовать, интерфейсы и так далее.Являются ли программы FORTRAN 77 быстрее, чем Fortran 90?

Это потому, что компиляторы FORTRAN 77 создают более оптимизированный код, возможно, лучше для параллельного выполнения? Заметьте, что я даже не говорю о Fortran 2003, например 8 лет: Я говорю о Fortran 90, поэтому я предполагаю, что он достаточно распространен, и компиляторы готовы. В любом случае, я не имею связи с этой отраслью.

Edit: janneb прав: LAPACK на самом деле написано в Fortran 90.

+0

Я думаю, что это «большой объем работы, который он поставит» для чего-то, что уже является доказанным соперником. Многие «языковые конструкции более высокого уровня» хороши, но, несмотря на сдвиг парадигмы, они редко приносят пользу. То есть, «код с новым синтаксисом» не подразумевает «лучшую оптимизацию компилятора», и даже F77 (насколько мне больно это признавать) является языком «высокого уровня». –

+0

Эффективные коды Fortran должны придерживаться функций F77 в их ядре для высокой производительности, большинство новых функций обычно приводят к менее эффективным исполняемым файлам. F90 и новее будут в основном полезны для удобства и расширяемости кода. – haraldkl

+0

@haraldkl - Я предполагаю, что у вас есть убедительные доказательства для поддержки таких заявлений? – Rook

ответ

13

Ну, как упоминалось выше «pst», «большое количество работы, которое это создавало», является довольно значительной причиной.

Некоторые дополнительные незначительные моменты:

  • LAPACK IS Fortran 90, в эти дни, в том смысле, что последняя версия уже не компилирует с F77 компилятором. Это, как говорится, далеко от переписывания, только несколько вещей, которые были изменены.

  • Большинство функций F90, о которых вы говорите, упрощают и ускоряют работу с надежными программами, поэтому нет необходимости делать результирующие программы быстрее.

  • Это было не так давно, что бесплатные компиляторы F90 не были доступны (много людей использовали g77!), Поэтому для широко используемой библиотеки, такой как LAPACK, не использующая функции F90, вероятно, было сознательное решение.

  • Компилятор F77, как правило, не производит более быстрый код, чем компилятор F90. Если не по какой-либо другой причине, то потому, что она, скорее всего, устарела и не может оптимизироваться для новейших процессоров. Современный компилятор Fortran может создавать более быстрый код из F77, чем из эквивалентной программы F90, которая широко использует такие вещи, как указатели и т. Д., Но это сильно зависит от рассматриваемой программы (например,используя указатели и структуры данных более благоприятного характера, может позволить использовать лучшие алгоритмы, позволяя программе F90 быстрее производить результаты, даже если она может выполняться при более низком среднем использовании арифметических единиц процессора).

  • Векторизация, если под этим подразумевается синтаксис массива F90 +, в основном проблема с программистом, а не более быстрый код. Компетентный компилятор также будет векторизовать эквивалентный цикл DO.

+1

Очень хорошо сказано. – milancurcic

+0

Компилятор F90 может генерировать более быстрый код, чем компилятор F77, поскольку ему не нужно угадывать столько, сколько операций массива или как псевдонимы элементов массива; программист рассказывает об этом в гораздо большем количестве случаев. –

+0

Хмм, я не знал, что так долго отсутствовали компиляторы F90. Хорошая точка и хороший ответ, спасибо! – astrojuanlu

1

будет ли F77 программа будет медленнее или быстрее, эквивалентной программы F90, переписанный с новый синтаксис является подлежит обсуждению, но давайте игнорировать, что для Теперь.

Что Однако следует принять во внимание, что на самом деле никто не заботится о скорости только. Люди заботятся только о скорости исполнения в случаях , где уместно, и где Bussiness выгодно (я уверен, что есть лучший термин для этого, но ничего не приходит на ум прямо сейчас. .. экономически выгодно возможно).

Поскольку эти две (довольно популярные библиотеки) по-прежнему находятся в F77, очевидно, что общее мнение о том, что затраты на их переписывание перевешивают выгоды, получаемые в результате ускорения исполнения, и преимущества в плане экономической эффективности всего этого процесса.

+0

Да, скорость является ключевым фактором здесь, потому что эти библиотеки используются, главным образом, для хруста. – astrojuanlu

+0

@ Juanlu001 - Как люди любят этот термин :) Это все равно не имеет значения, иногда; например, если программа работает 24 часа в неделю, то она не работает в течение двух недель ... никто не будет заботиться о том, будет ли она работать 25 часов в неделю ... – Rook

+1

@Idigas Это гораздо более плотно со временем в операционной например, прогнозирование погоды, где каждое небольшое ускорение здесь и там имеет значение. – milancurcic

5

Нет причин вкладывать в тонну работы (возможно) улучшить то, что хорошо работает. Следует отметить, что, хотя Fortran 90 представил множество новых функций, он не изменил язык. Помните, что Fortran 90 Standard обратно совместим с FORTRAN 77. Современный компилятор также сможет оптимизировать код FORTRAN 77. Есть функции, введенные в Fortan 90 (например, указатели), которые будут препятствовать эффективности, и этого следует избегать, если вас беспокоит время выполнения, например. в HPC.

Так что это не имеет особого значения. Для современного компилятора хорошо написанный FORTAN 77 так же оптимизирован - он похож на торт без обледенения. Здесь, в случае Fortran 90 и выше, обледенение выглядит лучше, чем на вкус - это удобство для программиста, но не обязательно улучшает эффективность программы.

+2

IIRC, на самом деле стандарты Fortran ** не совместимы ** назад. Fortran 90 отказался от некоторых функций от FORTRAN 77, а Fortran 95 ** удалил ** некоторые устаревшие функции в предыдущем стандарте, например. – astrojuanlu

+0

@ Juanlu001 Вы правы. Я пошел вперед. Стандарт Fortran 90 обратно совместим с Fortran 77 (а также имеет большинство дополнительных функций для языка). – milancurcic

+2

IRO-bot, @ Juanlu001 - впереди, но не сильно ... для функции, которая должна быть удалена из стандарта fortran, она должна проходить через несколько этапов, и лишь некоторые из них до сих пор были удалены (очень портативные и редко используемые). Однако, даже имея это в виду, большинство поставщиков по-прежнему поддерживают их, независимо от стандарта. Итак, да, хотя стандарт исключил их, можно сказать, что фортран компиляторы ОЧЕНЬ обратная совместимость. В F90 не было никаких удаленных функций, а F95 представило несколько, хотя я еще не видел компилятор, который их не поддерживает. – Rook

5

Существует одна из основных причин, почему Fortran 77 программы могут быть быстрее:

Распределенные массивы (Fortran 90) гораздо медленнее, чем объявлены-на-компиляции временных массивов. Оба не помещаются в одно и то же место в памяти. Это управление стекю и памятью кучи в Fortran.

See here for instance

Это, как говорится, Fortran 90+ имеют быстрые 'все в блоке' операции над массивами. Я большой поклонник GCC-фортраном (gfortran) и без какой-либо опции компиляции, для массива с размером N

a = a + 1 

в 4 раза быстрее, чем

do i = 1 , N 
    a(i) = a(i) + 1 
end do 

Эта скамья для меня , на моей машине, на gfortran без опции оптимизации и без каких-либо ограничений, что это профессиональный бенчмаркинг.

Задача «Проблема» (которая не является проблемой, а не функцией) не является архитектурой, компилятором или чем-то связанным, но с Fortran Standard.

+3

Ну, конечно, динамически выделенная память делает программы сложнее оптимизировать, чем статически выделяемые, потому что они менее предсказуемы компилятором. Будут ли они помещены в стек или кучу, не определяется стандартом Fortran и, скорее всего, зависит от системы, компилятора и d20. Но это не настоящий аргумент, потому что, когда выделенные массивы не нужны, мы, конечно, не хотим их использовать. – milancurcic

+0

Но где нужны распределяемые массивы, нам придется их использовать, не так ли? :) Отличный ответ Максимилиен, спасибо, что указали это! Не студент CS, поэтому для меня это не тривиально. А также вещь векторизации настолько полезна. – astrojuanlu

+0

Очень интересный блог кстати. – astrojuanlu