Fortran, двоеточие-неразумным язык?

Original version:http://www.ifremer.fr/ditigo/molagnon/fortran90/f90col.html


Многие авторы рекомендуют для хорошего стиля кодирования использовать A (:) для обозначения всего массива, а не A. Так что я, и я так быстро привык к этому соглашению, что теперь я злюсь, когда пытаюсь читать программы, где он Не используется.

Наилучшим образом, большинств люди сказали бы что использование таких конвенций не может сделать никакой вред. Или не так ли?

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

Тест прост: нужно просто вызвать DDOT настроенный BLAS любым способом в цикле измерения производительности. И вот некоторые результаты, собранные с помощью некоторых читателей новостных групп Comp.lang.Fortran:

система BLAS А (:) / А отношение замедления
Лаи LF90 2,01 г / WinNT, P90 =
SGI R8000 / IRIX 6.1 Sgimath =
NagAcef90 / Solaris 2,5 настроенный =
Наг f90 v2.2 / Любые = (Теперь исправлено)
Cray C94 / Уникальных 9 LibSc 2.25
V5.2-достаточно высокий / декабрь Альфа DXML =
CVF / WinNT 4.0 – Pentium II =
J90 3.0
xlf90 6.1 / IBM RS6000 ESSL =
Наг f90 v2.1 / SunOS 4.1.3 настроенный 4.0
Вс f90 / Solaris 2,5 sunperf =
Наг f90 v2.1 / декабрь Альфа DXML 11.25
HP f90 2,3 / PA 2,0 Блас =
IBM SP2 (широкие узлы) ESSL 23.5
МС Powerstation 4.0 бесконечность

Вышеприведенные цифры все же лучше, чем то, что было бы получено, если бы не был предоставлен блок INTERFACE для DDOT: замедление – это эффект копирования массивов аргументов во временные файлы, как если бы они были подразделами массива. Поскольку входные массивы объявляются с атрибутом INTENT (IN), они копируются только один раз перед вызовом во временный. Если атрибут INTENT (IN) не указан, копирование также происходит после вызова, а замедление почти удваивается!

MS Powerstation 4.0 не смог завершить тест, так как он, похоже, не освобождает временное. Количество используемой памяти, таким образом, увеличивается по мере выполнения цикла, пока не исчерпает доступный ресурс.

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

К сожалению также, что при стандартном уровне оптимизации «O или», а также для простой программы без риска сглаживания и с четким указанием на то, что секция массива не изменяется в функции, компилятор не должен перемещать временное распределение И копирование из цикла. Улучшение такого «высокого уровня», в отличие от языка ассемблера, очень важно для оптимизации.

Я также хотел бы отметить, что распространенное мнение состоит в том, что оптимизация – это вопрос нескольких процентов и обычно не стоит времени программиста, кроме нескольких очень важных приложений, таких как модели метеорологических прогнозов. Fortran 90 и недавняя эволюция в системах, возможно, сделали это заявление устаревшим. Небольшие изменения, которые могут быть внесены в течение нескольких секунд, могут теперь привести к значительному улучшению производительности программы. Например, наши самые требовательные приложения тратят около 50-80% своего времени в BLAS. В системах, которые мы используем, удаление (:) обеспечивает ускорение от 2 до 3!

Благодаря Яну Дж. Бушу (IJBush@dl.ac.uk), Арно Деситтеру (NAG), Марку Дьюину (Университет Иллинойса в Урбане, США), Юхе Хаатадже (Центр научных вычислений, Финляндия), Суне Карлссон (Стокгольм) Школы экономики, Швеция), Джонатана Уилера (Лаборатория Резерфорда Эпплтона, Великобритания) за помощь в эталонном тестировании, а также Стефано Барони (Центр европейского дечислителя атомной и молекулярной физики, Франция / Scuola Internazionale Superiore di Studi Avanzati, Италия) за первоначальную идею Приводя к этим испытаниям. Настроенный BLAS, используемый с SunOS 4.1.3 и NagAce Solaris 2.5, предоставил Ханс Олссон (Университет Лунда, Швеция).

Для тех, кто хотел бы попробовать себя, доступна тестовая программа.

Leave a Reply

Your email address will not be published. Required fields are marked *