Что делает Фортран быстрым?

41

Фортран занимает особое место в численном программировании. Конечно, вы можете создавать хорошие и быстрые программы на других языках, но Fortran продолжает работать очень хорошо, несмотря на свой возраст. Более того, в Фортране проще создавать быстрые программы. Я сделал быстрые программы на C ++, но вы должны быть более осторожны с такими вещами, как наложение указателей. Таким образом, должна быть причина для этого, и очень техническая. Это потому, что компилятор может оптимизировать больше? Мне бы очень хотелось узнать технические детали, поэтому, если я использую другой язык, я могу принять это во внимание.

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

jbcolmenares
источник
7
Я бы сказал, что это может быть лучшим вопросом для stackoverflow, хотя я думаю, что это хороший вопрос. Быстрый поиск ( stackoverflow.com/search?q=fortran+fast ) приводит меня к этому вопросу, который может вам помочь: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Янн
3
Вам необходимо указать, какой тип фортрана вы используете. Есть существенная разница между 77 и 90+. Я предполагаю, по крайней мере, 90, если мы говорим об указателях ...
Qubyte
Я всегда читал о том, что Fortran быстрее, чем C. Ну, может быть, но быстрее ли он как 2% или скорее как 50%?
Шухало
4
Это городской миф. Если компилятор не может использовать специальные инструкции, вы можете вручную оптимизировать практически любую программу, независимо от компилятора, для генерации примерно одного и того же машинного языка.
Майк Данлавей

Ответы:

50

Языковые дизайнеры сталкиваются с большим выбором. Кен Кеннеди подчеркнул два: (1) лучшие абстракции и (2) код более высокого или более низкого уровня (менее или более похожий на машину). В то время как функциональные языки, такие как Haskell и Scheme, ориентированы на первые, традиционные научно-вычислительные языки, такие как Fortran и C / C ++, ориентированы на последние. Утверждение, что один язык быстрее другого, обычно вводит в заблуждение: у каждого языка есть проблемная область, для которой он превосходен. Фортран в области числовых кодов на основе массива лучше, чем другие языки, по двум основным причинам: модель массива и его явность.

Модель массива

Программисты на Фортране в основном выполняют манипуляции с массивами. Для этого Fortran облегчает несколько оптимизаций компилятора, которые недоступны на других языках. Наилучшим примером является векторизация: знание структуры данных позволяет компилятору вызывать встроенные функции уровня сборки в массиве.

Ясность языка

Хотя кажется, что более простой язык должен компилироваться «лучше», чем более сложный, на самом деле это не так. Когда кто-то пишет на ассемблере , компилятор мало что может сделать: все, что он видит, это очень тонко детализированные инструкции. Фортран требует четкости (таким образом, больше работы программиста) только в тех случаях, которые дают реальное вознаграждение за вычисления на основе массива. Fortran использует простые типы данных, базовый поток управления и ограниченные пространства имен; напротив, он не сообщает компьютеру, как загружать регистры (что может потребоваться в режиме реального времени ). Где Fortran является явным, что позволяет такие вещи , как полный вывод типов, который помогает новичкам начать работу. Это также позволяет избежать одной вещи, которая часто делает C медленным:непрозрачные указатели .

Фортран может быть медленным

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

aterrel
источник
7
Проблемы с графическим интерфейсом и вводом-выводом можно легко решить, обернув фортрановский язык в язык «более общего назначения». Я часто использую R для этой цели.
МБК
2
shootout.alioth.debian.org больше не доступен! И новая версия имеет гораздо меньше информации :(
astrojuanlu
23

Конструкция Fortran позволяет компилятору выполнять более сильные оптимизации в некоторых случаях, которые обычно недоступны для C.

Один известный пример - обработка псевдонимов . В Fortran вы можете получить доступ к определенной области памяти только через определенный символ, связанный с этой областью памяти. Это знание позволяет компилятору использовать хитрые трюки, когда пришло время кешировать: он знает, изменилось ли значение потенциально или нет. До F90 это было легко проверено. Когда появился Fortran 90 pointers, предположение больше не было верным: вы могли получить доступ к одной и той же области памяти с помощью двух (или более) символов. По этой причине вы должны указывать targetмассивы, к которым вы хотите обращаться с помощью указателей.

Другим интересным фактом является то, что многие конструкции позволяют компилятору выполнять распараллеливание без вмешательства пользователя. Такая роскошь возможна благодаря относительному «платформенному агностицизму» Фортрана как языка.

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

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

Стефано Борини
источник
2
Когда ваши компьютеры попадают в диапазон> 100 миллионов долларов, люди (аспиранты) перестают выглядеть так дорого по сравнению.
Фил Миллер
6
@Novelocrat: количество кода , который работает на $ 100 миллионов компьютера было написано бесчисленными человеко - часов , которые выходят далеко за рамки $ отметки 100 млн даже град цене студента. Помните, что расходы на человека вдвое больше его дохода. Остальное уходит на налоги и соотносится. Кроме того, компьютер не испытывает выгорание. Человек делает, и будет менять работу.
Стефано Борини
1
@StefanoBorini У меня долгая история компьютеров, которые сгорели ...
N74
1
«Кроме того, помните, что сегодня никто не использует Фортран, за исключением численных расчетов,« Фортран = »FORmula TRANslation». Фортран всегда использовался в основном для численных расчетов. Fortran имеет большую долю времени высокопроизводительных компьютеров.
user21387
Сегодня, как и всегда, Фортран используется для всех тех же целей - численных расчетов.
последовательность
12

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

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

winwaed
источник
8

Будьте осторожны с городскими мифами здесь. Если два компилятора генерируют один и тот же код сборки, то результирующие программы будут иметь одинаковую производительность.

Для любой данной части логики существует программа на языке ассемблера, которая минимизирует время ее выполнения. Эта программа не заботится о том, какой компилятор ее сгенерировал.

Тем не менее, скомпилированные языки существуют, чтобы облегчить жизнь программисту. Отчасти это может побудить пользователя использовать функции, которые не приводят к минимальному времени выполнения. Ярким примером этого является newC ++. (Насколько медленным это может быть - это всего три символа?) Практически умоляет вас динамически распределять память и не обращать внимания на стоимость времени выполнения. Если это то, что вы хотите сделать, это потрясающе, но Фортран мог бы быть быстрее только потому, что он вам не помог.

Но, кроме этого, я никогда не видел программу, которая, как было написано вначале, не имела большой возможности для улучшения производительности, которую компилятор никогда не смог бы очистить для вас. Как пример, тратить большую часть времени на вызовы expи / или logмногократно с одним и тем же аргументом. В качестве другого примера, вызов DGEMM для умножения матриц и выяснение того, что большая часть времени уходит на вызов LSAME, просто для расшифровки входных аргументов символов.

Это в то же время, когда люди говорят, что Fortran работает быстрее из-за псевдонимов указателей или циклического развертывания. Это все равно, что сказать, что автобус, сделанный Porsche, наверняка будет быстрее, чем автобус, сделанный Chevrolet. Там должно быть немного здравого смысла.

Майк Данлавей
источник
4
Я не думаю, что это просто городской миф. Поддержка Fortran операций с целым массивом, функций PURE / ELEMENTAL и т. Д. Может помочь компиляторам легко оптимизировать / векторизовать или даже распараллелить. Например, см. Думатьparallel.com/ 2007/ 08/14/… . То, что на самом деле делают компиляторы, - это отдельная история (зависит от поставщика).
Стали
@stali: это зависит не только от поставщика. Это зависит от компилируемой программы. Я видел, как люди обобщают слова «существует программа, на которой Фортран может работать быстро», на «Фортран работает быстрее в любой программе». Если вы укажете на это, люди могут начать подстригать, подстригать и расчесывать волосы, и то, к чему это в конечном итоге сводится, в сущности, является не чем иным, как тем, что люди хотят думать.
Майк Данлавей