Фортран занимает особое место в численном программировании. Конечно, вы можете создавать хорошие и быстрые программы на других языках, но Fortran продолжает работать очень хорошо, несмотря на свой возраст. Более того, в Фортране проще создавать быстрые программы. Я сделал быстрые программы на C ++, но вы должны быть более осторожны с такими вещами, как наложение указателей. Таким образом, должна быть причина для этого, и очень техническая. Это потому, что компилятор может оптимизировать больше? Мне бы очень хотелось узнать технические детали, поэтому, если я использую другой язык, я могу принять это во внимание.
Например, я знаю - или я так думаю - одна вещь состоит в том, что стандарт определяет, что указатели всегда находятся в памяти, что означает более быстрый доступ к памяти. Я считаю, что вы можете сделать это в C ++, задав флаг компилятору. Таким образом, это помогает узнать, что делает Фортран хорошо, так что если мы используем другой язык, мы можем имитировать это.
источник
Ответы:
Языковые дизайнеры сталкиваются с большим выбором. Кен Кеннеди подчеркнул два: (1) лучшие абстракции и (2) код более высокого или более низкого уровня (менее или более похожий на машину). В то время как функциональные языки, такие как Haskell и Scheme, ориентированы на первые, традиционные научно-вычислительные языки, такие как Fortran и C / C ++, ориентированы на последние. Утверждение, что один язык быстрее другого, обычно вводит в заблуждение: у каждого языка есть проблемная область, для которой он превосходен. Фортран в области числовых кодов на основе массива лучше, чем другие языки, по двум основным причинам: модель массива и его явность.
Модель массива
Программисты на Фортране в основном выполняют манипуляции с массивами. Для этого Fortran облегчает несколько оптимизаций компилятора, которые недоступны на других языках. Наилучшим примером является векторизация: знание структуры данных позволяет компилятору вызывать встроенные функции уровня сборки в массиве.
Ясность языка
Хотя кажется, что более простой язык должен компилироваться «лучше», чем более сложный, на самом деле это не так. Когда кто-то пишет на ассемблере , компилятор мало что может сделать: все, что он видит, это очень тонко детализированные инструкции. Фортран требует четкости (таким образом, больше работы программиста) только в тех случаях, которые дают реальное вознаграждение за вычисления на основе массива. Fortran использует простые типы данных, базовый поток управления и ограниченные пространства имен; напротив, он не сообщает компьютеру, как загружать регистры (что может потребоваться в режиме реального времени ). Где Fortran является явным, что позволяет такие вещи , как полный вывод типов, который помогает новичкам начать работу. Это также позволяет избежать одной вещи, которая часто делает C медленным:непрозрачные указатели .
Фортран может быть медленным
Fortran не справляется с любой задачей: поэтому мало кто использует его для создания графических интерфейсов или даже для неструктурированных научных вычислений. Как только вы покидаете мир массивов для графиков, деревьев решений и других областей, это преимущество в скорости быстро исчезает. Посмотрите тесты компьютерного языка для некоторых примеров и чисел.
источник
Конструкция Fortran позволяет компилятору выполнять более сильные оптимизации в некоторых случаях, которые обычно недоступны для C.
Один известный пример - обработка псевдонимов . В Fortran вы можете получить доступ к определенной области памяти только через определенный символ, связанный с этой областью памяти. Это знание позволяет компилятору использовать хитрые трюки, когда пришло время кешировать: он знает, изменилось ли значение потенциально или нет. До F90 это было легко проверено. Когда появился Fortran 90
pointers
, предположение больше не было верным: вы могли получить доступ к одной и той же области памяти с помощью двух (или более) символов. По этой причине вы должны указыватьtarget
массивы, к которым вы хотите обращаться с помощью указателей.Другим интересным фактом является то, что многие конструкции позволяют компилятору выполнять распараллеливание без вмешательства пользователя. Такая роскошь возможна благодаря относительному «платформенному агностицизму» Фортрана как языка.
Есть много других тонких трюков, как это. Кроме того, помните, что сегодня никто не использует Fortran, за исключением численных расчетов, что означает, что основной особенностью и преимуществом компиляторов Fortran является скорость кода. В результате производители сосредоточились на этом.
Тем не менее, вы можете создавать исходный код и на других языках. Однако это может потребовать особого ухода или вмешательства человека. В целом, однако, это то, что производительность не является проблемой, пока не возникнет проблема, а человеческое время намного дороже, чем компьютерное. Таким образом, практика кодирования должна быть направлена на сохранение человеческого времени, а не компьютерного времени.
источник
Я не думаю, что Фортран настолько близок к металлу (см. Другой ответ), но он очень легко оптимизируется. Циклы просты, и язык легко поддерживает расширения векторизации (хорошо, когда я использовал его в своей первой работе, мы нацеливались на широкий спектр векторов большого железа).
Существует также большой фактор инерции. В Фортране много числового кода, поэтому создатели высокопроизводительных серверов и суперкомпьютеров стараются написать хорошие оптимизирующие компиляторы Фортрана. Компиляторы хороши (даже на машинах с относительным отсутствием высококачественных компиляторов), поэтому пользователи продолжают использовать Фортран и даже пишут в нем новый код. Поэтому строители позаботятся о том, чтобы у их следующего поколения были хорошие компиляторы и т. Д.
источник
Будьте осторожны с городскими мифами здесь. Если два компилятора генерируют один и тот же код сборки, то результирующие программы будут иметь одинаковую производительность.
Для любой данной части логики существует программа на языке ассемблера, которая минимизирует время ее выполнения. Эта программа не заботится о том, какой компилятор ее сгенерировал.
Тем не менее, скомпилированные языки существуют, чтобы облегчить жизнь программисту. Отчасти это может побудить пользователя использовать функции, которые не приводят к минимальному времени выполнения. Ярким примером этого является
new
C ++. (Насколько медленным это может быть - это всего три символа?) Практически умоляет вас динамически распределять память и не обращать внимания на стоимость времени выполнения. Если это то, что вы хотите сделать, это потрясающе, но Фортран мог бы быть быстрее только потому, что он вам не помог.Но, кроме этого, я никогда не видел программу, которая, как было написано вначале, не имела большой возможности для улучшения производительности, которую компилятор никогда не смог бы очистить для вас. Как пример, тратить большую часть времени на вызовы
exp
и / илиlog
многократно с одним и тем же аргументом. В качестве другого примера, вызов DGEMM для умножения матриц и выяснение того, что большая часть времени уходит на вызов LSAME, просто для расшифровки входных аргументов символов.Это в то же время, когда люди говорят, что Fortran работает быстрее из-за псевдонимов указателей или циклического развертывания. Это все равно, что сказать, что автобус, сделанный Porsche, наверняка будет быстрее, чем автобус, сделанный Chevrolet. Там должно быть немного здравого смысла.
источник