Как можно модернизировать большую кодовую базу, основанную на фортрановском числе?


21

Друг из академии попросил у меня совета (я разработчик бизнес-приложений на C #).

У него есть устаревшая кодовая база, которую он написал на Фортране в области медицинской визуализации. Это делает огромное количество хруста с использованием векторов. Он использует кластер (30-ядерные ядра) и теперь перешел на одну рабочую станцию ​​с 500-гигабитным GPUS.

Однако, куда идти дальше с кодовой базой так:

  • Другие люди могут поддерживать его в течение следующего 10-летнего цикла
  • Ускорьте настройку программного обеспечения
  • Может работать на разных инфраструктурах без перекомпиляции

После некоторых исследований от меня (это очень интересная область) некоторые варианты:

  • Используйте Python и CUDA от Nvidia
  • Перепишите на функциональном языке. Например, F # или Haskell
  • Перейти на основе облачных и использовать что-то вроде Hadoop и Java
  • Выучить C

Какой у вас был опыт с этим? На что должен смотреть мой друг, чтобы модернизировать свою кодовую базу?

ОБНОВЛЕНИЕ: Спасибо @Mark и всем, кто ответил. Причина, по которой мой друг задает этот вопрос, заключается в том, что в жизненном цикле проектов самое время сделать обзор. Чтобы научить ассистентов-исследователей в Фортране, нужно время (мне нравится C #, и особенно инструменты, и я не могу представить себе возвращение к старым языкам !!)

Мне понравилось предложение сохранить чистое число в Фортране, но обернуть его во что-то более новое. Возможно, Python как таковой, похоже, становится оплотом в академических кругах как язык программирования общего назначения, который довольно легко подобрать.

См. Раздел « Медицинская визуализация» и парень, который написал оболочку на Фортране для CUDA. Могу ли я законно опубликовать свои оболочки на Фортране 90 в библиотеке Nvidias CUFFT (из CUDA SDK)? ,


Я бы добавил OpenCL в список.
Джерри Гроб

3
Привет, Дейв, есть определенный тип "Какой язык я должен изучать дальше?" вопрос, который мы здесь не разрешаем, поэтому я внес небольшие изменения, чтобы люди не приняли этот вопрос за это. Но можете ли вы расширить свой вопрос, чтобы объяснить, почему варианты, которые вы обнаружили до сих пор, не соответствуют друг другу, поэтому он может помочь вам найти ответы, которые лучше подходят?

Что конкретно вы имеете в виду под "Может работать на разных инфраструктурах без перекомпиляции"?
Ладья

Привет @Idigas - я не слишком уверен в специфике. Но по сути дела пошла история о том, что при переносе кодовой базы в другие кластеры / машины становилось кошмаром, когда все правильные версии библиотек собирались вместе. Я считаю, что кодовая база была перенесена с F77 на F90 или что-то еще. В основном, я пытаюсь помочь ему поговорить с нужными людьми, чтобы принять разумное решение о том, менять ли архитектуру / языки. Я родом из прошлого, где клиентам не нравится день дополнительного времени на программирование, поэтому все, что я могу сделать, чтобы помочь мне написать лучший код, самый быстрый - идеальный :-)
Дейв Матеер

@DaveMateer - см. Мой ответ (не вписывается в это поле здесь). Я собираюсь спать сейчас, поэтому будущие ответы могут быть немного медленными :)
Ладья

Ответы:


24

Требования, которые вы выдвинули, фактически ставят Fortran на первое место в списке для таких проблем:

а)
сокращение чисел б) параллеллы
в) это был и остается языком де-факто, преподаваемым за пределами обучения CS (для инженеров, которые не являются профессиональными программистами).
d) имеет невероятную (!) отраслевую поддержку по количеству отраслевых компиляторов, и ни один из поставщиков не продемонстрировал ни малейших признаков отказа от этой отрасли. Не так давно один из представителей Intel сообщил, что продажи их продуктов Fortran выше, чем у других в их инструментах разработки.

Это также язык, который невероятно легко подобрать. Я не согласен с тем, что требуется время для того, чтобы привести научных сотрудников в курс дела. В моем первом учебнике было не больше, чем, о, я не знаю, 30 (?) Страниц разреженного печатного текста. Это язык, на котором после изучения 10 ключевых слов можно писать программы среднего размера. Я бы осмелился сказать, что эти 30 страниц, написанные в тексте Word по умолчанию, стали бы более чем исчерпывающим «Руководством по Фортрану» для большинства пользователей.

Если вы заинтересованы в CUDA, вы можете проверить компилятор Portland Group , который его поддерживает . Я не знаком с мельчайшими деталями, но люди обычно говорят об этом с похвалой.

Кроме того, для параллельных программ у вас есть OpenMP, MPI и теперь предстоящие (и долгожданные) совместные массивы, которые недавно внедрил компилятор Intel . Чтобы не тратить слова впустую, в Fortran есть очень хорошая гамма «библиотек» для распараллеливания программ.

Для этого прежде всего разрабатываются стандартные числовые библиотеки , другие языки более или менее следуют в портфеле функций / рутин.

Однако, несмотря на все сказанное, я ( однако, зависит от того, когда он был изначально написан) рекомендую, если это, скажем, код F77 или более старый, переписывая его частично во времени на более новые диалекты - по крайней мере, F90, если это возможно с функциями F2003. Бумага / диссертации по этой теме была недавно опубликована (средний размер PDF файла вперед). Это может не только обеспечить правильную переносимость между несколькими платформами, но также упростит дальнейшее обслуживание.

ps Что касается "будущего обслуживания", просто анегдот, который я иногда хотел бы упомянуть. Во время написания своей диссертации я повторно использовал код моего наставника, написанный 35 лет назад с момента написания. Скомпилировано только с одной ошибкой; в конце пропущена выписка из-за ошибки копирования-вставки :)


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

Мне кажется, вы решаете эту «проблему» неправильно. Что я имею в виду в нескольких коротких моментах (потому что здесь очень поздно, и моя способность составлять удобочитаемые (не говоря уже о понятных) предложениях оставляет меня после 22:00).

а) вы упомянули, что пытаетесь свести к минимуму дополнительное время кодирования, но при этом вы рассматриваете возможность переписать язык, специализированный для численных вычислений, на язык с ярким выбором языков , если вы простите мое выражение

  • некоторые из которых не имеют поддержки многомерных массивов, среди прочего
  • большинство из них непригодны для тяжелой числовой работы (я допускаю, что о возможностях параллельной обработки Haskell и Hadoop я ничего не знаю ... но никогда не слышал, чтобы они даже упоминались в этих кругах)
  • возможно, это было опробовано, но я никогда не слышал о переписывании с Фортрана, языка для дискретных задач, на функциональный язык
  • недавно было обсуждение на comp.lang.fortran (попробуйте поискать в группах Google) аспектов научных вычислений «в облаке»
    (не хотел бы вас мотивировать, но, честно говоря, никто не был на самом деле Я уверен, что этот термин даже представляет, у менее одинокого был пример успешного применения. Большинство людей согласились с тем, что потенциал существует, но пока они довольны тем, как все работает сейчас.). Многие проблемы не подходят для такого рода распараллеливания.

б) какова будет стоимость такого переписывания? люди / час.

c) -правильные версии библиотек для компиляции ... - это проблема на любом языке, которую нельзя избежать, как ни крути.

d) Я слышал о Python (действительно хорошем языке), который несколько раз использовался в параллельных приложениях, но его проникновение на этот рынок все еще не растет, и его постоянно меняющаяся природа делает его очень плохим выбором для долгосрочный проект (подумайте о обратной совместимости). Некоторым людям это очень нравится как «клейкий» язык.

Тьфу, если я думаю о чем-то еще, добавлю это завтра. Должен немного поспать ...


@Idigas .. снова очень ценю. Полностью согласен, что если что-то работает, то это очень много значит. Наша индустрия изобилует полным переписыванием, идущим ужасно неправильно (Netscape!).
Дэйв Матеер

1
Идигас имеет правильную идею здесь. У вас есть рабочая кодовая база, которая функционирует годами, и ее расшифровка вызовет ошибки. Кроме того, Fortran - это простой язык для восприятия - он может быть уродливым, но сделан из четких концепций. Держите под контролем зависимости от другого кода и, возможно, напишите хороший интерфейс в стиле C для Fortran, и вы обнаружите, что код замечательно ориентирован на будущее (стиль C, так как практически любой другой язык имеет механизм для вызова код с интерфейсом в стиле C).
Anon

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

Ух ты, я не знал, что вокруг Фортран так много любви. Мне пришлось 5 лет развиваться в F77, и я терпеть не могу.
dodgy_coder

2
@dodgy_coder. Приятно слышать, что вы занимались разработкой на Fortran + .NET в девяностые годы. Первая бета .NET вышла в 2000 году.

10

Я сомневаюсь, что Фортран когда-нибудь умрет - у него такое большое наследие программного обеспечения и библиотек, написанных на нем, что люди все еще работают над ним, только стабилизируя эту ситуацию. Более того, это по-прежнему очень хороший язык, если вы не хотите делать что-то большее, чем перемалывание чисел - синтаксис очень элегантен и логичен, плюс компилятор может легко угадать, что происходит. Таким образом, гарантируется, что любая новая технология аппаратного ускорителя будет поддерживать C, Fortran и какой-то OpenCL (когда он, наконец, сойдется во что-то солидное).

Так что я бы сказал, что вы должны просто четко отделить числовую часть, оставить ее в Фортране, сделать четкую привязку и написать остальное во что хотите.


Не говоря уже о том, что новые проекты в Фортране также начинаются в настоящее время.
Ладья

Да, Fortran - это не COBOL, он поддерживается не только потому, что это то, что люди узнали 30 лет назад (хотя IMO и является его частью). Сокращение числа не является моей сильной стороной, хотя, так что, если есть лучшее, я, конечно, не знаю это.
Бен Брокка

1
Язык фортран по-прежнему лидирует на 10 лет по сокращению чисел и связанной с этим оптимизации. Это не умрет в ближайшее время.
Мартин Йорк,

1
В недавней «Коммуникации ACM» появилась статья о Fortran и о том, как она продолжает развиваться и развиваться. Сохранение (по крайней мере, части обработки чисел) кода на Фортране, вероятно, было бы хорошим шагом. Это также помогает избежать синдрома Netscape (переписать = новые ошибки = огромное время цикла = разозлить всех участников).
quick_now

1
Вы действительно хотите, чтобы кто-то, кто вообще не заинтересован в Фортране, касался вашего хрустящего кода? Большая проблема заключается в том, чтобы убедиться, что результат остается точным после переписывания.
Питер Смит

4

Python действительно набирает обороты в научном компьютерном сообществе (см. Устаревшее представление, см. Том 9, номер 3 CiSE ). Я думаю, что гибрид Python / Fortran - отличный путь. Чтобы воспользоваться всеми этими графическими процессорами, вы можете использовать PyCUDA или PyOpenCL .

Я математик, который анализирует и пишет числовые решения для уравнений в частных производных. Недавно я был в такой же ситуации, как у твоего друга; рассматриваемый код Fortran 77 является хорошо известным программным обеспечением Clawpack . Мы переписали код верхнего уровня (все части, которые не должны быть быстрыми) в Python и использовали f2py для автоматического переноса низкоуровневых частей.

Действительно мощный результат этого заключается в том, что мы смогли почти тривиально соединить гибридный код Python / Fortran (названный PyClaw ) с параллельной библиотекой PETSc, впервые создав масштабируемую параллельную версию Clawpack, которая хорошо работает на ядрах 65K. Весь параллельный код, который нам пришлось написать, содержится менее чем в 300 строках Python . Сейчас мы решаем проблемы, которые невозможно было бы решить только с помощью устаревшего кода. Не менее важно и то, что теперь новым пользователям гораздо проще подобрать код, поскольку Python является таким дружественным языком, и почти все можно изменять во время выполнения, а не во время компиляции.

Если вы хотите увидеть более подробную информацию о нашем подходе и результатах, у нас есть статья по arXiv .

Извиняюсь за саморекламу, но казалось, что мой личный опыт будет здесь уместен. Если вы хотели бы услышать еще много идей, вы можете опубликовать это также на новом http://scicomp.stackexchange.com .


1

Я сейчас нахожусь в ситуации, очень похожей на ситуацию твоего друга. Я также отчаянно пытаюсь «модернизировать» мой более чем 40-летний код KLOC Fortran-77. И, несмотря на то, что Fortran по-прежнему считается королем в приложениях по обработке чисел, я хотел бы сказать, что еще не все потеряно. (То, что следует, - это напыщенная речь, так терпите меня).

Тот факт, что Fortran является лучшим языком для числового кода, не означает, что мы должны постоянно нести с собой этот огромный багаж грязного, сложного кода (да, код Fortran обязательно должен быть грязным, особенно Fortran-77, который является язык, который буквально не имеет отношения к разработке программного обеспечения, когда он пересекает определенные KLOC). Те, кто защищает Fortran для сокращения чисел, забывают общее замечание, что когда вы выполняете анализ производительности таких кодов, это только 5% или 10% кода, который требует высокой производительности, а для оставшихся 90% + Fortran - бесполезные издержки, просто чтобы сделать жизнь инженера-программиста настоящим адом.

Когда вы переходите на Fortran-90 с Fortran-77, вы, по сути, готовы в некоторой степени компенсировать производительность с языковыми функциями. Фортран является мощным механизмом вычисления чисел, главным образом благодаря Фортрану-77. Вы могли бы сказать, что Fortran-90 работает так же быстро, но проблемы оптимизации, с которыми приходилось сталкиваться разработчикам компиляторов при добавлении функций Fortran-90/2003 и сохранении производительности Fortran-77, мало чем отличаются от проблем, с которыми сталкивались авторы компиляторов C с (и в результате C тоже считается быстрым, не говоря уже о том, что C также позволяет выполнять inline-сборку). Так почему бы не начать добавлять C-код постепенно (вместо Fortran-90) в код Fortran-77. Мой код уже содержит фрагменты в C и фрагменты в Fortran-77, и он отлично работает при некоторых проблемах, таких как передача строк, нулевое индексирование / одноиндексирование и т. Д. Но преимущество, которое я получаю от C,

Я бы пошел еще дальше. Даже C (и определенно Fortran-90/95/2003) слишком низкоуровневый, если вы хотите хороший «гуманный» интерфейс для обработки кода. Я думаю о переходе на Python-Fortran-77 или гибрид Python-C. Код, в котором 90% кода - это Python (включая Numpy, Scipy, мобильность и все такое сладкое), и только код с интенсивным исполнением 5% -10% остается кодом Fortran-77 или C.


1
«Код на Фортране должен быть грязным». Нет. Грязный кодер напишет грязный код на любом языке, и обратное утверждение верно. Керниган и Плаугер показали, как писать чистый фортран много лет назад .

0

В настоящее время я занимаюсь обновлением старой кодовой базы FORTRAN95, которая будет использоваться в современных промышленных средах, поскольку предыдущая версия будет работать только на компьютерах под управлением Windows 2000. Сама кодовая база FORTRAN выполняет большое количество вычислений, связанных с моделированием орошения.

Поэтому вместо того, чтобы переписывать FORTRAN на более современный язык, я просто использую коммерческий компилятор Silverfrost FTN95 для компиляции кодовой базы FORTRAN в библиотеку .Net 4.0, которую я использую в качестве серверной части приложения WPF. , Таким образом, я не рискую вносить известные ошибки в код симуляции и модернизирую его, перенося базу кода в среду .Net 4.0, чтобы она работала в более современных средах.

Но в зависимости от того, насколько велика ваша симуляция, вы можете просто переписать все это на более современном языке, таком как C #, я сам планирую сделать это, как только у меня будет работающая версия симуляции для сравнения результатов.

Надеюсь, мой опыт поможет, спасибо, Алекс.


0

Я был ведущим разработчиком проекта 2001-2003 гг., Который портировал приложение windows 100KLOC с FORTRAN на C #. Это было приложение для обработки чисел, имевшее собственные привязки графического интерфейса к библиотекам Win32. Порт C # и WinForms значительно упростил управление кодом и предоставил всем более богатую среду разработки в Visual Studio. Сначала было немало сопротивления (особенно в том, что касается заявлений о формате), но, в конце концов, оно того стоило.

На мой взгляд, имеет смысл укусить пулю и избавиться от максимально возможного количества кода FORTRAN. Скорость никогда не была проблемой - начальные тесты, выполняющие код на C # по сравнению с FORTRAN, обнаружили, что разница в производительности незначительна, даже несмотря на то, что C # выполняет управляемый код. Однако ваши потребности в векторах могут немного отличаться, и наличие меньшего количества оставшегося кода FORTRAN также будет приемлемым.

Другой причиной для этого является, конечно, долгосрочная доступность людей с опытом работы на FORTRAN, которые могут поддерживать ваш код по сравнению с разработчиками на C #. Кроме того, это помогает моральному духу команды работать на современном, хорошо поддерживаемом языке.


0

Мне сказали, что во многих контекстах MATLAB заменяет FORTRAN для научных вычислительных приложений. Он не только современен и высокоуровнев, но и довольно быстр в том, что делает. Многие разработчики, работающие над программным обеспечением для медицинской визуализации, уже используют MATLAB, поэтому у него есть несколько библиотек, посвященных медицинской визуализации. Это означает, что вы найдете как инструменты, так и поддержку эксперта в области, если вы пойдете с MATLAB.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.