Що робить Фортран швидким?


41

Фортран займає особливе місце в чисельному програмуванні. Ви, звичайно, можете робити гарне та швидке програмне забезпечення іншими мовами, але Fortran дуже добре працює, незважаючи на свій вік. Крім того, у Fortran простіше робити швидкі програми. Я робив швидкі програми на C ++, але ви повинні бути більш уважними до таких речей, як псевдонім вказівника. Отже, в цьому має бути причина, і дуже технічна. Це тому, що компілятор може оптимізувати більше? Мені б дуже хотілося знати технічні деталі, тому якщо я використовую іншу мову, я можу взяти до уваги ці речі.

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


7
Я б сказав, що це може бути кращим питанням для stackoverflow, хоча я думаю, це гарне питання. Швидкий пошук ( stackoverflow.com/search?q=fortran+fast ) приводить мене до цього питання , який може допомогти вам: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Вам потрібно вказати, який тип фортран ви використовуєте. Існує значна різниця між 77 і 90+. Я припускаю щонайменше 90, якщо ми говоримо про покажчики ...
qubyte

Я завжди читав про те, що Фортран швидше, ніж С. Ну, може, але чи швидше він, як 2%, чи швидше, як 50%?
шухало

4
Це міський міф. Якщо компілятор не може використовувати спеціальні інструкції, ви можете вручну оптимізувати майже будь-яку програму, незалежно від компілятора, для створення приблизно однієї і тієї ж машинної мови.
Майк Данлаве

Відповіді:


50

Мовні дизайнери стикаються з багатьма варіантами. Кен Кеннеді наголосив на двох: (1) кращих абстракціях та (2) вищому чи нижчому рівні (менш чи більше машиноподібних) кодів. Хоча функціональні мови, такі як Haskell і Scheme, зосереджуються на першій, традиційні науково-обчислювальні мови, такі як Fortran і C / C ++, зосереджуються на останніх. Сказати, що одна мова швидша за іншу, зазвичай є досить оманливою: у кожної мови є проблемний домен, для якого вона переважає. Fortran краще в області чисельних кодів на основі масиву, ніж інші мови, з двох основних причин: його моделі масиву та чіткості.

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

Програмісти Fortran значною мірою проводять маніпуляції з масивом. Для цього Fortran полегшує кілька оптимізацій компілятора, які недоступні іншими мовами. Найкращий приклад - векторизація: знання компонування даних дає змогу компілятору викликати властивості рівня складання через масив.

Мовна експліцитність

Хоча здається, що більш проста мова повинна компілювати "краще", ніж більш складна, це насправді не так. Коли ви пишете мовою складання , компілятор може зробити не так багато: все, що вона бачить, - це дуже дрібні вказівки. Фортран вимагає чіткості (таким чином, більше роботи програміста) лише у випадках, які приносять реальні винагороди за обчислення на основі масиву. Fortran використовує прості типи даних, основний потік управління та обмежені простори імен; навпаки, це НЕ сказати комп'ютера , як завантажити регістри (які можуть бути необхідні для реального часу ). Там, де Fortran є явним, він дає змогу робити такі речі, як повний висновок типу, який допомагає новачкам розпочати роботу. Це також уникає однієї речі, яка часто робить C повільним:непрозорі покажчики .

Фортран може бути повільним

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


7
Проблеми з GUI / IO можна легко вирішити, обернувши фортранський хруст на мові "більш загального призначення". Я часто використовую R для цієї мети.
mbq

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
"Крім того, пам’ятайте, що сьогодні ніхто не використовує Fortran, за винятком числових обчислень," Fortran = "FORmula TRANSlation". Фортран завжди використовувався в першу чергу і був розроблений для чисельних обчислень. Fortran має велику частку високопродуктивних комп'ютерів.
користувач21387

Сьогодні, як і завжди, Fortran використовується для всіх тих же цілей - числових обчислень.
послідовність

12

Я не думаю, що Фортран наближений до металу (див. Іншу відповідь), але оптимізувати його, як правило, дуже легко. Петлі прості, і мова легко підтримує розширення векторизації (добре, коли я використовував це в моєму першому завданні, ми орієнтувались на широкий спектр векторної великої заліза).

Існує також великий інерційний фактор. У Fortran дуже багато числового коду, тому розробники серверів високого класу та суперкомп'ютерів переконують, що вони добре записують оптимізатори компіляторів Fortran. Компілятори хороші (навіть на машинах з відносною відсутністю високоякісних компіляторів), тому користувачі продовжують використовувати Fortran і навіть записують у нього новий код. Тож будівельники переконаються, що наступне покоління має хороші компілятори тощо.


8

Будьте уважні до міських міфів тут. Якщо два компілятори генерують один і той же код складання, то отримані програми матимуть однакову продуктивність.

Для будь-якої заданої логіки існує програма на мові збірки, яка мінімізує час її виконання. Цій програмі байдуже, який компілятор її створив.

Однак, складені мови існують для полегшення життя програміста. Частина вартості цього полягає в тому, що вони можуть спокусити користувача використовувати функції, які не призводять до мінімального часу виконання. Найважливіший приклад цього - newв C ++. (Наскільки це може бути повільно - це лише три символи?) Він практично просить вас динамічно розподіляти пам'ять, і не звертати уваги на вартість виконання. Якщо це ви хочете зробити, це приголомшливо, але Фортран міг бути швидшим тільки тому, що він не засмоктував вас у цьому.

Але поза цим я ніколи не бачив програми, яка, як було написано раніше, не мала великого простору для покращення продуктивності такого виду, який компілятор ніколи не міг би очистити від вас. Як один із прикладів - витратити велику частину часу на дзвінки expта / або logповторно з тим самим аргументом. Як інший приклад: заклик DGEMM до множення матриць та з'ясування того, що велика частина часу йде на виклик LSAME просто для розшифровки його вхідних аргументів символів.

Це в той же час, як люди кажуть, що Фортран швидше через згладжування вказівника чи розкручування циклу. Це як би сказати, що автобус, виготовлений Porsche, безумовно, був би швидшим, ніж автобус, виготовлений Chevrolet. Тут має бути трохи здорового глузду.


4
Я не думаю, що це просто міський міф. Підтримка Fortran для операцій з цілим масивом, функцій PURE / ELEMENTAL тощо може допомогти компіляторам легко оптимізувати / векторизувати або навіть паралелізувати. Для наприклад, див thinkingparallel.com/2007/08/14 / ... . Що компілятори насправді роблять, це інша історія (залежить від постачальника).
stali

@stali: Це залежить від постачальника. Це залежить від програми, що складається. Я бачив, як люди узагальнюють "існує програма, за якою Fortran може швидко працювати" до "Fortran є швидшим за будь-якої програми". Якщо ви вказуєте на це, люди можуть почати підшивати, сіяти та розщеплювати волоски, і те, що це насправді зводиться до кінця, - це в основному не більше ніж те, що люди хочуть думати.
Майк Данлаве
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.