Изучение ФОРТРАНА В современную эпоху

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Недавно я начал работать с большим объемом кода FORTRAN, требующего больших затрат на научные вычисления.Мне трудно разобраться во всех, скажем, нюансах языка сорокалетней давности, несмотря на Google и две книги начального уровня.Код изобилует "улучшениями, повышающими производительность".Есть ли у кого-нибудь какие-либо руководства или практические советы по de-оптимизация FORTRAN для CS 101 уровней?Кто-нибудь знает о том, как работает оптимизация кода на FORTRAN?Существуют ли какие-либо типичные "подводные камни" FORTRAN, которые могут не прийти в голову разработчику, работающему на Java / C ++ / .NET, использующему кодовую базу FORTRAN 77/90?

Это было полезно?

Решение

Вы как бы должны получить "представление" о том, что программистам приходилось делать в те времена.Подавляющее большинство кода, с которым я работаю, старше меня и работало на машинах, которые были "новыми", когда мои родители учились в средней школе.

Распространенными ФОРТРАН-измами, с которыми я имею дело, которые ухудшают читабельность, являются:

  • Общие блоки
  • Неявные переменные
  • Два или три цикла DO с общими операторами CONTINUE
  • GOTO вместо циклов DO
  • Арифметические операторы IF
  • Вычисленные значения GOTO
  • Эквивалентность ВЕЩЕСТВЕННАЯ / ЦЕЛОЧИСЛЕННАЯ / другая в некотором общем блоке

Стратегии решения этих проблем включают:

  1. Получить Spag / плюсФОРТ, стоит своих денег, он решает многие из них автоматически и без ошибок (tm)
  2. Перейдите на Fortran 90, если это вообще возможно, если нет, перейдите на Fortran 77 свободного формата
  3. Добавьте НЕЯВНЫЙ NONE к каждой подпрограмме, а затем исправьте каждую ошибку компиляции, что отнимает много времени, но в конечном счете необходимо, некоторые программы могут сделать это за вас автоматически (или вы можете написать это скриптом).
  4. Перемещение всех ОБЫЧНЫХ блоков в модули, низко висящий фрукт, того стоит
  5. Преобразуйте арифметические операторы IF в блоки IF..ELSEIF..ELSE
  6. Преобразуйте вычисленные GOTO для ВЫБОРА блоков CASE
  7. Преобразуйте все циклы DO в более новый синтаксис F90

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Преобразуйте эквивалентные элементы общего блока либо в ВЫДЕЛЯЕМУЮ память, выделенную в модуле, либо в их истинные символьные процедуры, если это Холлерит, хранящийся в РЕАЛЬНОМ

Если у вас возникли более конкретные вопросы относительно того, как выполнить некоторые задачи по удобочитаемости, я могу дать совет.У меня есть кодовая база из нескольких сотен тысяч строк Fortran, которая была написана за 40 лет, за которые я в некотором роде несу ответственность, так что я, вероятно, сталкивался с любыми "проблемами", которые вы, возможно, обнаружили.

Другие советы

Устаревшая Мыльница Fortran

Я довольно долго помогал поддерживать / улучшать устаревшую кодовую базу Fortran и по большей части думаю шестилетние переменные стоит на деньгах.Однако этот совет имеет тенденцию к техническому;более сложная задача для hoe заключается во внедрении "передовой практики".

  • Установите требуемый стиль кодирования и рекомендации по кодированию.
  • Требуйте проверки кода (не только от программиста!) для всего, что представлено в базе кода.(Контроль версий должен быть привязан к этому процессу.)
  • Начните создавать и запускать модульные тесты;то же самое с бенчмарками или регрессионными тестами.

В наши дни это может показаться очевидными вещами, но, рискуя чрезмерно обобщить, я утверждаю, что большинство мастерских по разработке кода на Fortran имеют укоренившуюся культуру, некоторые из них появились еще до появления термина "разработка программного обеспечения", и что со временем доминирующим становится "Сделайте это сейчас".(Это ни в коем случае не характерно только для магазинов Fortran.)

Обнимающие Ошибки

Но что делать с уже существующей, убогой старой устаревшей кодовой базой?Я согласен с Джоэлом Спольски по поводу переписывания, не надо.Однако, на мой взгляд шестилетние переменные указывает ли на допустимое исключение: Используйте программные средства для перехода к более совершенным конструкциям Fortran. Многое может быть уловлено / исправлено анализаторами кода (ПРОВЕРИТЬ) и переписчики кода (плюсФОРТ).Если вам приходится делать это вручную, убедитесь, что у вас есть веская причина.(Жаль, что у меня нет под рукой ссылки на количество программных ошибок, возникших в результате исправления программных багов, это унизительно.Я думаю, что какая-то такая статистика есть в Экспертное программирование на языке Си.)

Вероятно, лучшее нападение в победном матче Fortran gotchas - это лучшая защита:Довольно хорошо владеет языком.Для достижения этой цели я рекомендую ...книги!

Библиотека Мертвых Деревьев Fortran

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

Fortran 90/95 для ученых и инженеров, автор Стивен Дж .Чэпмен

Книга хороша даже для Fortran 77 тем, что в ней конкретно определены конструкции, которые не следует использовать, и приведены лучшие альтернативы.Тем не менее, на самом деле это учебник, и он может выдохнуться, если вы действительно хотите узнать все до мелочей о Fortran 95, вот почему я рекомендую

Объясненный Fortran 90/95, автор Майкл Меткалф и Джон К.Рид

в качестве вашего справочника (sic) для Fortran 95.Имейте в виду, что это не самый понятный текст, но завеса прояснится, когда вы действительно захотите получить максимальную отдачу от новой функции Fortran 95.

За то, что я сосредоточился на проблемах перехода с Fortran 77 на Fortran 90, мне понравилось

Переход на Fortran 90, автор : Джим Керриган

но сейчас эта книга вышла из печати.(Я просто не понимаю, как О'Рейли использует Сафари, почему не все их книги, вышедшие из печати, доступны?)

Наконец, что касается наследника замечательной классики, Программные средства, Я выдвигаю

Классический ФОРТРАН, автор Майкл Купфершмид

Эта книга не только показывает, что можно сделать с "только" Fortran 77, но и рассказывает о некоторых возникающих более тонких проблемах (например, следует или не следует использовать ВНЕШНЕЕ объявление).Эта книга точно не охватывает ту же область, что и "Программные средства", но это две из трех книг по программированию на Fortran, которые я бы назвал "интересными"....(вот третий).

Прочие рекомендации, применимые к почти каждый компилятор Fortran

  • Существует опция компилятора для принудительного применения НЕЯВНОГО поведения NONE, которую вы можете использовать для определения проблемных подпрограмм, не изменяя их сначала с помощью объявления НЕЯВНОГО NONE .Этот совет не будет казаться осмысленным до тех пор, пока сборка не сработает в первый раз из-за НЕЯВНОЙ команды NONE, вставленной в устаревшую процедуру.(Что?Ваш обзор кода этого не уловил?;-)
  • Существует опция компилятора для проверки границ массива, которая может быть полезна при отладке кода на Fortran 77.
  • Компиляторы Fortran 90 должны быть способны компилировать почти весь код Fortran 77 и даже более старый код Fortran.Включите параметры создания отчетов в вашем компиляторе Fortran 90, запустите через него свой устаревший код, и у вас будет достойный старт в проверке синтаксиса.Некоторые коммерческие компиляторы Fortran 77 на самом деле являются компиляторами Fortran 90, которые работают в режиме Fortran 77, так что это может быть относительно тривиальным выбором для любых имеющихся у вас сценариев сборки.

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

Даже простой рефакторинг, такой как изменение глупо выглядящих имен переменных, может стать большой ловушкой.Исторически стандартные математические уравнения в данной области науки будут использовать определенную сокращенную форму со времен Максвелла.Таким образом, просмотр массива с именем B(:) в electromagnetics говорит всем инженерам Emag о том, для чего именно решается задача.Измените это на свой страх и риск.Мораль, прежде чем переименовывать, ознакомьтесь со стандартной номенклатурой науки.

Как человек, имеющий опыт работы как с FORTRAN (77-й вкус, хотя прошло некоторое время с тех пор, как я использовал его всерьез), так и С / С ++, на что следует обратить внимание, и это сразу приходит на ум, - это массивы.Массивы FORTRAN начинаются с индекса 1 вместо 0, как это делается в C / C ++ / Java.Кроме того, расположение памяти меняется на противоположное.Таким образом, увеличение первого индекса дает вам последовательные ячейки памяти.

Моя жена по-прежнему регулярно использует FORTRAN, и у нее есть некоторый код на C ++, с которым ей нужно поработать теперь, когда я собираюсь начать помогать ей.По мере возникновения проблем во время ее обращения я постараюсь указать на них.Может быть, они помогут.

Не могли бы вы объяснить, что вы должны делать для поддержания кода?Вам действительно нужно изменять код?Если вы можете уйти, изменив только интерфейс к этому коду, а не сам код, это было бы лучше всего.

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

Из-за характера проблемы я не думаю, что общих вопросов и ответов достаточно, чтобы быть полезными.Я предлагаю вам опубликовать серию конкретных вопросов с приложенным фрагментом кода.Может быть, начать с того, от чего у вас больше всего болит голова?

Я использую Fortran, начиная с версии 66 года, с 1967 года (на IBM 7090 с объемом памяти 32 тыс. слов).Затем я некоторое время использовал PL / 1, но позже вернулся к Fortran 95, потому что он идеально подходит для задач с матрицей / комплексными числами, которые у нас есть.Я хотел бы добавить к соображениям, что большая часть запутанной структуры старых кодов просто связана с небольшим объемом доступной памяти, что приводит к таким вещам, как повторное использование нескольких строк кода с помощью вычисляемого или назначаемого GOTOs.Другой проблемой является оптимизация путем определения вспомогательных переменных для каждого повторяющегося подвыражения - компиляторы просто не оптимизировали для этого.Кроме того, ему не разрешалось писать DO i=1,n+1;ты должен был написать n1=n+1; DO i=1,n1.В результате старые коды перегружены лишними переменными.Когда я переписал код на Fortran 95, сохранилось только 10% переменных.Если вы хотите сделать код более разборчивым, я настоятельно рекомендую искать переменные, которые можно легко устранить.

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

Что ж, в каком-то смысле вам повезло, потому что в Fortran не так уж много тонких конструкций управления потоком, наследования или тому подобного.С другой стороны, в нем есть несколько действительно удивительных ошибок, таких как арифметически вычисляемые переходы к числовым меткам, неявно типизированные переменные, которые не требуют объявления, отсутствие истинных ключевых слов.

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

В любом случае, основной научный расчетный код должен быть достаточно читабельным.Любой язык программирования, использующий инфиксную арифметику, был бы хорошей подготовкой к чтению арифметического кода Fortran и кода присваивания.

Мне нравился ФОРТРАН, я преподавал на нем и программировал.Просто хотел добавить это сюда.Не прикасался к нему много лет.
Я начинал в COBOL, а когда перешел на FORTRAN, почувствовал, что освободился.Все относительно, да?Я бы поддержал то, что было сказано выше - признаю, что это ПРОЦЕДУРНЫЙ язык - никаких тонкостей - так что принимайте его таким, каким вы его видите.
Вероятно, это расстроит вас с самого начала.

Я начал работать с Fortran IV (WATFIV) на перфокартах, и мои первые годы работы были с FORTRAN v1 (IBM, уровень Fortran 77).Много полезных советов в этой теме.

Я бы добавил, что вы должны различать то, что делается для того, чтобы заставить beast работать вообще, и то, что "оптимизирует" код, и то, что более читаемо и ремонтопригодно.Я помню, как имел дело с наложениями VAX, пытаясь заставить код моделирования DOE запускаться на IBM с виртуальной памятью (их пришлось удалить, и все это превратилось в одно адресное пространство).

Я бы, конечно, начал с тщательной реструктуризации управляющих структур FORTRAN IV, по крайней мере, до уровня FORTRAN 77, с соответствующими отступами и комментариями.Попробуйте избавиться от примитивных управляющих структур, таких как ASSIGN и COMPUTED GOTO, арифметическое IF, и, конечно, от как можно большего количества GOTO (используя IF-THEN-ELSE-ENDIF).Определенно используйте НЕЯВНЫЙ NONE в каждой процедуре, чтобы заставить вас правильно объявлять все переменные (вы не поверите, сколько ошибок я обнаружил в коде других людей - опечатки в именах переменных).Остерегайтесь "преждевременных оптимизаций", с которыми вам лучше позволить компилятору справиться самому.

Если вы хотите, чтобы этот код продолжал жить и его можно было поддерживать, вы обязаны перед собой и своими преемниками сделать его читабельным и понятным. Просто будьте уверены в том, что вы делаете, когда меняете код! В FORTRAN есть множество своеобразных конструкций, которые могут легко сбить с толку кого-то, пришедшего из мира программирования на языке Си.Помните, что FORTRAN восходит к середине-концу 50-х годов, когда не существовало такого понятия, как наука о языке и проектировании компилятора, просто ad hoc взламывание чего-то вместе (извините, докторБ!).

Вот еще один, который время от времени кусал меня.Когда вы работаете над кодом на FORTRAN, убедитесь, что вы пропустили все шесть начальных столбцов.Время от времени я получаю код с отступом всего в пять пробелов, и ничего не работает.На первый взгляд все кажется нормальным, а потом я, наконец, понимаю, что все строки начинаются с столбца 6, а не с столбца 7.

Для тех, кто не знаком с FORTRAN, первые 5 столбцов предназначены для номеров строк (= меток), 6-й столбец предназначен для символа продолжения на случай, если у вас строка длиннее 80 символов (просто поместите что-нибудь здесь, и компилятор узнает, что эта строка на самом деле является частью предыдущей), а код всегда начинается с столбца 7.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top