Легче ли оптимизировать Fortran, чем C, для тяжелых вычислений? - PullRequest
388 голосов
/ 28 сентября 2008

Время от времени я читаю, что Fortran является или может быть быстрее C для тяжелых вычислений. Это действительно так? Я должен признать, что почти не знаю Фортрана, но код Фортрана, который я видел до сих пор, не показал, что у языка есть особенности, которых нет у C.

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

Ответы [ 23 ]

11 голосов
/ 06 ноября 2015

Я программист-любитель, и я "средний" на обоих языках. Мне легче писать быстрый код на Фортране, чем на C (или C ++). И Fortran, и C являются «историческими» языками (по сегодняшним стандартам), интенсивно используются и хорошо поддерживают бесплатный и коммерческий компилятор.

Я не знаю, является ли это историческим фактом, но Фортран чувствует, что он построен так, чтобы быть параллельным / распределенным / векторизованным / каким-либо многоядерным. И сегодня это в значительной степени «стандартная метрика», когда мы говорим о скорости: «она масштабируется?»

За чистоту процессора я люблю Фортран. Для всего, что связано с IO, мне легче работать с C. (в любом случае это сложно в любом случае).

Теперь, конечно, для параллельного математического кода вы, вероятно, захотите использовать свой графический процессор. И C, и Fortran имеют много более или менее хорошо интегрированных интерфейсов CUDA / OpenCL (а теперь и OpenACC).

Мой в меру объективный ответ: если вы знаете оба языка одинаково / плохо, то я думаю, что Fortran быстрее, потому что мне легче писать параллельный / распределенный код на Fortran, чем C. (как только вы поняли, что можете писать «freeform» "Фортран, а не только строгий код F77)

Вот второй ответ для тех, кто хочет понизить голос, потому что им не нравится первый ответ: оба языка имеют функции, необходимые для написания высокопроизводительного кода. Таким образом, это зависит от алгоритма, который вы реализуете (интенсивный процессор, интенсивный объем памяти), аппаратного обеспечения (одноядерный, многоядерный, распределенный суперкомпьютер, GPGPU, FPGA), ваших навыков и, в конечном счете, самого компилятора. И C, и Fortran имеют потрясающий компилятор. (Я серьезно удивлен тем, насколько продвинуты компиляторы Фортрана, но также и компиляторы Си).

PS: я рад, что вы специально исключили библиотеки, потому что у меня есть много плохого, что можно сказать о библиотеках Fortran GUI. :)

11 голосов
/ 30 июля 2010

Несколько лет я занимался обширной математикой с Фортраном и Си. Исходя из собственного опыта, я могу сказать, что FORTRAN иногда действительно лучше, чем C, но не за его скорость (можно заставить C работать так же быстро, как FORTRAN, используя соответствующий стиль кодирования), а скорее из-за очень хорошо оптимизированных библиотек, таких как LAPACK, и из-за отличное распараллеливание. На мой взгляд, с FORTRAN действительно неудобно работать, и его преимущества недостаточно хороши, чтобы устранить этот недостаток, поэтому сейчас я использую C + GSL для расчетов.

10 голосов
/ 28 сентября 2008

Я не слышал, чтобы Фортан был значительно быстрее, чем С, но вполне возможно, что в некоторых случаях он будет быстрее. И ключ не в языковых особенностях, которые присутствуют, а в тех, которые (обычно) отсутствуют.

Примером являются C-указатели. Указатели на Си используются практически везде, но проблема с указателями заключается в том, что компилятор обычно не может определить, указывают ли они на разные части одного и того же массива.

Например, если вы написали подпрограмму strcpy, которая выглядела так:

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

Компилятор должен работать в предположении, что d и s могут быть перекрывающимися массивами. Таким образом, он не может выполнить оптимизацию, которая выдала бы другие результаты, когда массивы перекрываются. Как и следовало ожидать, это значительно ограничивает виды оптимизации, которые могут быть выполнены.

[Следует отметить, что в C99 есть ключевое слово restrict, которое явно указывает компиляторам, что указатели не перекрываются. Также обратите внимание, что в Фортране тоже есть указатели с семантикой, отличной от C, но указатели не повсеместны, как в C.]

Но, возвращаясь к проблеме C против Fortran, вполне возможно, что компилятор Fortran способен выполнить некоторые оптимизации, которые могут быть невозможны для (написанной прямо) программы на C. Так что я не был бы слишком удивлен иском. Тем не менее, я ожидаю, что разница в производительности не будет такой большой. [~ 5-10%]

9 голосов
/ 28 сентября 2008

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

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

9 голосов
/ 10 ноября 2016

Быстро и просто: Оба одинаково быстры, но Фортран проще. То, что действительно быстрее в конечном итоге, зависит от алгоритма, но в любом случае разница в скорости отсутствует Это то, что я узнал на семинаре по Fortran в высокопроизводительном вычислительном центре Штутгарда, Германия, в 2015 году. Я работаю с Fortran и C и разделяю это мнение.

Пояснение:

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

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

Пример: Мы хотим дать большую структуру в качестве входного аргумента функции (fortran: подпрограмма). Внутри функции аргумент не изменяется.

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

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

7 голосов
/ 28 сентября 2008

Обычно FORTRAN работает медленнее, чем C. C может использовать указатели аппаратного уровня, позволяющие программисту оптимизировать работу вручную. ФОРТРАН (в большинстве случаев) не имеет доступа к аппаратному взлому адресации памяти. (VAX FORTRAN - это другая история.) Я использовал FORTRAN и выключал его с 70-х годов. (На самом деле.)

Однако, начиная с 90-х годов, FORTRAN эволюционировал, чтобы включать в себя специальные языковые конструкции, которые можно оптимизировать в изначально параллельные алгоритмы, которые могут действительно кричать на многоядерном процессоре. Например, автоматическая векторизация позволяет нескольким процессорам обрабатывать каждый элемент вектора данных одновременно. 16 процессоров - 16 элементов вектора - обработка занимает 1/16 времени.

В C вы должны управлять своими собственными потоками и тщательно разрабатывать свой алгоритм для многопроцессорной обработки, а затем использовать несколько вызовов API, чтобы убедиться в правильности параллелизма.

В FORTRAN вам нужно только тщательно разработать свой алгоритм для мультиобработки. Компилятор и среда выполнения могут обработать все остальное за вас.

Вы можете прочитать немного о High Performance Fortran , но вы найдете много мертвых ссылок. Вам лучше прочитать о параллельном программировании (например, OpenMP.org ) и о том, как это поддерживает FORTRAN.

5 голосов
/ 17 июля 2010

Более быстрый код не совсем соответствует языку, это компилятор, поэтому вы можете увидеть ms-vb «компилятор», который генерирует раздутый, медленный и избыточный объектный код, который связан вместе внутри «.exe», но powerBasic генерирует слишком лучший код. Объектный код, созданный компиляторами C и C ++, генерируется в некоторых фазах (по крайней мере, в 2), но по своей конструкции большинство компиляторов Fortran имеют по крайней мере 5 фаз, включая высокоуровневые оптимизации, поэтому по замыслу Fortran всегда будет иметь возможность генерировать высоко оптимизированный код. Итак, в конце концов, это компилятор, а не язык, который вы должны запрашивать, лучший из известных мне компиляторов - это компилятор Intel Fortran, потому что вы можете получить его в LINUX и Windows, и вы можете использовать VS в качестве IDE, если вы ищете дешевый тугой компилятор, который вы всегда можете передать на OpenWatcom.

Подробнее об этом: http://ed -thelen.org / 1401Project / 1401-IBM-Systems-Journal-FORTRAN.html

3 голосов
/ 05 апреля 2015

Fortran имеет лучшие процедуры ввода / вывода, например подразумеваемое средство do дает гибкость, с которой стандартная библиотека C не может сравниться.

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

2 голосов
/ 02 июля 2018

Fortran очень удобно обрабатывать массивы, особенно многомерные. Нарезка элементов многомерного массива в Fortran может быть намного проще, чем в C / C ++. C ++ теперь имеет библиотеки, которые могут выполнять эту работу, такие как Boost или Eigen, но они все-таки внешние библиотеки. В Фортране эти функции присущи.

То, что Fortran быстрее или удобнее для разработки, в основном зависит от того, какую работу вы должны выполнить. Как научный специалист по геофизике, я делал большинство вычислений на Фортране (я имею в виду современный Фортран,> = F90).

2 голосов
/ 19 декабря 2016

Используя современные стандарты и компилятор, нет!

Некоторые люди здесь предположили, что FORTRAN работает быстрее, потому что компилятору не нужно беспокоиться о псевдонимах (и, следовательно, он может делать больше предположений при оптимизации). Тем не менее, это было решено в C начиная со стандарта C99 (я думаю) с включением ключевого слова restrict. Что в основном говорит компилятору, что в заданной области указатель не является псевдонимом. Кроме того, C обеспечивает правильную арифметику указателей, где такие вещи, как псевдонимы, могут быть очень полезны с точки зрения производительности и распределения ресурсов. Хотя я думаю, что более поздняя версия FORTRAN позволяет использовать «правильные» указатели.

Для современных реализаций C в целом превосходит FORTRAN (хотя и очень быстро).

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

EDIT:

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

http://julialang.org/benchmarks/

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

...