Восьмая версия компиляторов Intel

Введение


В конце 2003 года корпорация Intel представила версию 8.0 своей коллекции компиляторов. Новые компиляторы призваны повысить производительность приложений, работающих на серверах, настольных ПК и мобильных системах (ноутбуки, мобильные телефоны и карманные компьютеры) на базе процессоров Intel. Приятно отметить, что данный продукт создан при активном участии сотрудников нижегородского Центра Intel по разработке ПО и специалистов Intel из Сарова.

Новая серия включает компиляторы Intel для языков C++ и Fortran для ОС Windows и Linux, а также компиляторы Intel для языка C++ для ОС Windows CE .NET. Компиляторы ориентированы на системы на базе следующих процессоров Intel: Intel Itanium 2, Intel Xeon, Intel Pentium 4, процессоров с архитектурой Intel Personal Internet Client Architecture для мобильных телефонов и карманных ПК и процессора Intel Pentium M для мобильных ПК (компонент технологии Intel Centrino для мобильных ПК).

В компиляторе Intel Visual Fortran для ОС Windows реализованы технологии компиляции нового поколения для высокопроизводительных вычислительных решений. Он соединяет в себе функциональность языка Compaq Visual Fortran (CVF) и повышение производительности, ставшее возможным благодаря технологиям оптимизации компиляции и генерации кода корпорации Intel, и упрощает задачу переноса исходного кода, разработанного с помощью CVF, в среду Intel Visual Fortran. В этом компиляторе функции CVF впервые реализованы как для 32-разрядных систем Intel, так и для систем на базе процессоров семейства Intel Itanium, работающих в среде Windows. Кроме того, этот компилятор позволяет реализовать языковые функции CVF в системах под управлением ОС Linux на базе 32-разрядных процессоров Intel и процессоров семейства Intel Itanium. В 2004 году планируется выпустить расширенную версию этого компилятора - компилятор Intel Visual Fortran Compiler Professional Edition для ОС Windows, в состав которой будет включена библиотека IMSL Fortran 5.0 Library, разработанная компанией Visual Numerics, Inc.

"Новые компиляторы поддерживают также будущие процессоры Intel, известные под кодовым названием Prescott, в которых предусмотрены новые команды для повышения производительности графики и видео, а также другие средства увеличения производительности. Они также поддерживают новую технологию Mobile MMX(tm), аналогичным образом повышающую производительность графических, звуковых и видеоприложений для мобильных телефонов и карманных ПК, - отметил со-директор Центра Intel по разработке ПО в Нижнем Новгороде Алексей Одиноков. - Эти компиляторы предоставляют разработчикам приложений единый комплекс инструментальных средств для построения новых приложений для беспроводных сетей на основе архитектуры Intel. Новые компиляторы Intel также поддерживают технологию Hyper-Threading корпорации Intel и отраслевую спецификацию OpenMP 2.0, определяющую использование директив высокого уровня для управления потоками инструкций в приложениях".

Среди новых инструментов, включенных в компиляторы - средства Intel Code Coverage и Intel Test Prioritization. Вместе эти средства позволяют ускорить разработку приложений и повысить их качество за счет улучшения процесса тестирования программного обеспечения.

Средство Code Coverage в ходе тестирования приложения предоставляет полные сведения об использовании логики приложения и о расположении используемых участков в исходном коде приложения. В случае, если в приложение вносятся изменения или если данный тест не позволяет проверить часть приложения, интересующую разработчика, средство Test Prioritization позволяет проверить работу выбранного участка программного кода.

Новые компиляторы Intel выпускаются в разных комплектациях стоимостью от 399 до 1499 долларов. Их можно приобрести уже сегодня в корпорации Intel или у реселлеров по всему миру, список которых расположен на сайте http://www.intel.com/software/products/reseller.htm#Russia.

Поддержка процессоров Prescott


Поддержка процессора Intel Pentium 4 (Prescott) в восьмой версии компилятора заключается в следующем:

1. Поддержка команд SSE3 (или PNI, Prescott New Instructions). Здесь стоит выделить три способа:

а. Ассемблерные вставки (Inline assembly). Например, компилятор распознает нижеследующее использование команды из набора SSE3 _asm{addsubpd xmm0, xmm1}. Таким образом пользователи, заинтересованные в низкоуровневой оптимизации, могут получить прямой доступ к ассемблерным командам.

б. В С/C++ компиляторе новые инструкции доступны и с более высокого уровня, чем использование ассемблерных вставок. А именно, посредством встроенных функций (intrinsic functions):

Встроенные функции
 Встроенная функция Генерируемая команда
 _mm_addsub_ps Addsubps
 _mm_hadd_ps Haddps
 _mm_hsub_ps Msubps
 _mm_moveldup_ps Movsldup
 _mm_movehdup_ps Movshdup
 _mm_addsub_pd Addsubpd
 _mm_hadd_pd Haddpd
 _mm_hsub_pd Hsubpd
 _mm_loaddup_pd movddup xmm, m64
 _mm_movedup_pd movddup reg, reg
 _mm_lddqu_si128 Lddqu

В таблице показаны встроенные функции и соответствующие ассемблерные команды из набора SSE3. Такая же поддержка существует и для команд из наборов MMX\SSE\SSE2. Это позволяет программисту осуществлять низкоуровневую оптимизацию кода, не прибегая к программированию на ассемблере: компилятор сам заботится об отображении (mapping'е) встроенных функций на соответствующие команды процессора и оптимальном использовании регистров. Программист может сконцентрироваться на создании алгоритма, эффективно использующего новые наборы команд.

в. Автоматическая генерация новых команд компилятором. Предыдущие два способа предполагают использование программистом новых команд. Но компилятор способен также (при использовании соответствующих опций - см. секцию 3 ниже) автоматически генерировать новые команды из набора SSE3 для программного кода на языках С/C++ и Fortran. Например, оптимизированную команду невыровненной загрузки (lddqu), использование которой позволяет получить выигрыш по производительности до 40% (например, в задачах видео- и аудиокодирования). Другие команды из набора SSE3 позволяют получить существенное ускорение в задачах 3D графики или расчетных задачах с использованием комплексных чисел. Например, график в секции 3.1 ниже показывает, что для приложения 168.wupwise из набора SPEC CPU2000 FP ускорение, полученное от автоматической генерации команд SSE3 составило ~25%. Производительность этого приложения существенно зависит от скорости работы арифметики комплексных чисел.

2. Использование микроархитектурных преимуществ процессора Prescott. При генерации кода компилятор учитывает микроархитектурные изменения в новом процессоре. Например, выполнение некоторых операций (таких как целочисленные сдвиги, умножение целых чисел или преобразования чисел между различными форматами с плавающей точкой в SSE2) ускорилось на новом процессоре по отношению к предыдущим версиям (скажем, целочисленный сдвиг занимает теперь один процессорный такт против четырех для предыдущей версии процессора Intel Pentium 4). Более интенсивное использование таких команд позволяет получить существенное ускорение работы приложений.
Другим примером микроархитектурных изменений служит улучшенный механизм store forwarding (быстрой загрузки данных, сохраняемых ранее в памяти); реальное сохранение происходит даже не в кэш-память, а в некоторый промежуточный буфер сохранения, что позволяет осуществить затем очень быстрый доступ к данным. Такая особенность архитектуры дает возможность, например, осуществить более агрессивную автоматическую векторизацию программного кода.
Компилятор также учитывает возросший объем кэш-памяти первого и второго уровня.

3. Улучшенная поддержка технологии Hyper-Threading. Данный пункт вполне может быть отнесен к предыдущему - микроархитектурным изменениям и их использованию в компиляторе. Например, библиотека времени исполнения, в которой реализуется поддержка отраслевой спецификации OpenMP, была оптимизирована для выполнения на новом процессоре.

Производительность


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


1.1 Оптимизация программ с помощью перекомпиляции и изменения настроек компилятора

Зачастую первым шагом в переходе на новый оптимизирующий компилятор является его использование с настройками по умолчанию. Следующий логичный шаг - использование опций для более агрессивной оптимизации. На рисунках 1, 2, 3 и 4 показан эффект от перехода на интеловский компилятор версии 8.0 по сравнению с использованием других лидирующих в отрасли продуктов (-O2 - настройки компиляторов по умолчанию, base - настройки на максимальную производительность). Сравнение проводится на 32- и 64-битных архитектурах Intel. В качестве тестового набора используются приложения из SPEC CPU2000.


Рисунок 1



Рисунок 2



Рисунок 3



Рисунок 4

Ниже перечислены некоторые опции (далее по тексту опции приведены для семейства ОС Windows; для семейства ОС Linux существуют опции с тем же действием, но название может отличаться; например, -Od или QxK для Windows оказывают аналогичное действие с -O0 или -xK для Linux соответственно; более подробную информацию можно найти в руководстве по использованию компилятора), поддерживаемые компилятором Intel.


Контроль уровней оптимизации: Опции -Od (отсутствие оптимизаций; применяется для отладки программ), -O1 (максимальная скорость при минимизации размера кода), -O2 (оптимизация по скорости исполнения кода; применяется по умолчанию), -O3 (включает наиболее агрессивные оптимизации по скорости исполнения кода; в некоторых случаях может приводить к обратному эффекту, т.е. к замедлению; нужно отметить, что на IА-64 использование -O3 ведет к ускорению в большинстве случаев, тогда как положительный эффект на IA-32 менее ярко выражен). Примеры оптимизаций, включаемых по -O3: перестановка порядка вложенных циклов (loop interchange), слияние циклов (loop fusion), разделение цикла(-ов) (loop distribution; оптимизация, обратная loop fusion), программная предвыборка (software prefetch) данных. Причина, по которой возможно замедление при использовании -O3, может заключаться в том, что компилятор использовал эвристический подход к выбору агрессивной оптимизации для конкретного случая, не имея достаточной информации о программе (например, сгенерировал команды предвыборки для данных, используемых в цикле, полагая, что цикл выполняется большое количество раз, тогда как на самом деле он имеет лишь несколько итераций). Интерпроцедурная оптимизация по профилированию, а также разнообразные "подсказки" программиста (см. секцию 3.2) могут помочь в данной ситуации.

Интерпроцедурная оптимизация: -Qip (в рамках одного файла) и -Qipo (в рамках нескольких или всех файлов проекта). Включает такие оптимизации, как, например, инлайн-подстановка часто использующегося кода (сокращение расходов на вызов функции/процедуры). Представляет информацию другим стадиям оптимизации - например, информацию о верхней границе цикла (скажем, если это константа времени компиляции, определенная в одном файле, а используемая во многих) или информацию о выравнивании данных в памяти (многие команды MMX\SSE\SSE2\SSE3 работают быстрее, если операнды выровнены в памяти на границу в 8 или 16 байт). Анализ процедур аллокации памяти (реализованных\вызванных в одном из файлов проекта) передается в те функции\процедуры, где эта память используется (это может помочь компилятору отказаться от консервативного предположения, что данные не выровнены в памяти должным образом; а предположение должно быть консервативным при отсутствии дополнительной информации). Еще одним примером может служить анализ пересечений по памяти (disambiguation, data aliasing analysis): при отсутствии дополнительной информации и невозможности доказать отсутствие пересечений, компилятор исходит из консервативного предположения, что пересечения есть. Такое решение может негативно сказаться на качестве таких оптимизаций, как, например, автоматическая векторизация на IA-32 или программная конвейеризация (software pipelining или SWP) на IA-64. Интерпроцедурная оптимизация может помочь в анализе наличия пересечений по памяти.

Оптимизация по профилированию: Включает в себя три стадии. 1) генерацию инструментированного кода с помощью опции -Qprof_gen. 2) полученный код запускается на репрезентативных данных, во время работы собирается информация о различных характеристиках выполнения кода (например, вероятности перехода или типичное значение для количества итераций цикла). 3) Повторная компиляция с опцией -Qprof_use, которая обеспечивает использование компилятором информации, собранной на предыдущем шаге. Таким образом, компилятор имеет возможность использовать не только статические оценки важных характеристик программы, но и данные, полученные во время реального прогона программы. Это может помочь при последующем выборе тех или иных оптимизаций (например, более эффективное расположение в памяти различных веток программы, основываясь на информации о том, какие ветки выполнялись с какой частотой; или применение оптимизации к циклу на основе информации о типичном количестве итераций в нем). Оптимизация по профилированию особенно полезна в тех случаях, когда удается подобрать небольшой, но репрезентативный набор данных (для шага №2), который хорошо иллюстрирует наиболее типичные случаи будущего использования программы. В некоторых предметных областях выбор такого репрезентативного набора вполне возможен. Например, оптимизация по профилированию используется разработчиками СУБД.

Оптимизации, перечисленные выше относятся к общему (generic) типу, т.е. сгенерированный код будет работать на всех различных процессорах семейства (скажем, в случае 32-х разрядной архитектуры - на всех нижеперечисленных процессорах: Intel Pentium-III, Pentium 4, включая ядро Prescott, Intel Pentium M). Существуют также оптимизации под конкретный процессор.

Оптимизации, ориентированные на конкретный процессор: -QxK (Pentium-III; использование команд набора SSE, особенностей микроархитектуры), -QxW и -QxN (Pentium 4; использование команд SSE и SSE2, особенностей микроархитектуры), -QxB (Pentium M; использование команд SSE и SSE2, особенностей микроархитектуры), QxP (Prescott; использование команд SSE, SSE2, и SSE3, особенностей микроархитектуры). В данном случае код, сгенерированный с использованием таких опций, может не работать на других представителях процессорной линейки (например, -QxW код может привести к исполнению недопустимой команды, если выполняется на системе на базе процессора Intel Pentium-III). Или работать не с максимальной эффективностью (например, -QxB код на процессоре Pentium 4 в силу отличий в микроархитектуре). При таких опциях возможно также использование библиотек времени исполнения, оптимизированных под конкретный процессор с использованием его системы команд. Для контроля того, что код выполняется действительно на целевом процессоре, реализован механизм диспетчеризации (cpu-dispatch): проверка процессора во время исполнения программы. В различных ситуациях этот механизм может быть либо задействован, либо нет. Диспетчеризация используется всегда, если применяется вариация опций -Qax{KWNP}. В этом случае генерируется две версии кода: оптимизированная под конкретный процессор и "общая" (generic), выбор происходит во время выполнения программы. Таким образом, за счет увеличения размера кода можно добиться выполнения программы на всех процессорах линейки и оптимального выполнения на целевом процессоре. Другой вариант состоит в использовании оптимизации кода под предыдущего представителя линейки и использование этого кода на этом и последующих процессорах. Например, -QxN код может выполняться на Pentium 4 как с ядром Northwood, так и Prescott. Увеличения размера кода не происходит. При таком подходе можно получить хорошую, но все же не оптимальную производительность на системе с процессором Prescott (т.к. не используется SSE3 и не учитываются различия в микроархитектуре) при оптимальной производительности на Northwood. Для процессоров архитектуры IA-64 также существуют подобные опции. На данный момент их две: -G1 (Itanium) и -G2 (Itanium 2; опция по умолчанию).

Приведенный ниже график (рисунок 5) показывает ускорение (за начало отсчета принята единица - отсутствие какого-либо ускорения) от использования некоторых перечисленных выше оптимизаций (а именно -O3 -Qipo -Qprof_use -Qx{N,P}) на процессоре Prescott по сравнению с установками по умолчанию (-О2). Использование -QxP помогает в некоторых случаях получить ускорение по сравнению с -QxN. Наибольшее ускорение достигается в приложении 168.wupwise, уже упоминавшемся в предыдущей секции (за счет интенсивной оптимизации комплексной арифметики с использованием команд SSE3).


Рисунок 5

На рисунке 6 ниже показано соотношение (в разах) скорости работы кода с оптимальными настройками по сравнению с вовсе неоптимизированным кодом (-Od) на процессорах Pentium 4 и Itanium 2. Видно, что Itanium 2 гораздо сильнее зависит от качества оптимизации. Особенно ярко это выражено для вычислений с плавающей точкой (FP), где отношение составляет примерно 36 раз. Вычисления с плавающей точкой являются сильной стороной архитектуры IA-64, но при этом надо тщательно подходить к использованию максимально эффективных настроек компилятора. Полученный выигрыш в производительности окупает трудозатраты на их поиск.


Рисунок 6. Ускорение при применении лучших опций оптимизации SPEC CPU200

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

График на рисунке 7 показывает ускорение от использования явного распараллеливания на инженерном (pre-production) образце системы на базе процессора Intel Pentium 4 (Prescott) с поддержкой технологии Hyper-Threading: 2.8GHz, 2GB RAM, 8K L1-Cache, 512K L2-Cache. В качестве набора тестов используется SPEC OMPM2001. Этот набор ориентируется на малые и средние SMP системы, расход памяти составляет до двух гигабайт. Приложения скомпилированы с помощью Intel 8.0 C/C++ и Fortran c двумя наборами опций: -Qopenmp -Qipo -O3 -QxN и -Qopenmp -Qipo -O3 -QxP, с каждым из которых приложения запускались с включенной и выключенной технологией Hyper-Threading. Значения ускорений на графике нормализованы на производительность однопотоковой версии при выключенной технологии Hyper-Threading.


Рисунок 7: Приложения из набора SPEC OMPM2001 на процессоре Prescott

Видно, что в 9-ти из 11-ти случаев использование явного распараллеливания с помощью OpenMP дает прирост производительности при включении технологии Hyper-Threading. В одном из приложений (312.swim) наблюдается замедление. Это известный факт: данное приложение характеризуется высокой степенью зависимости от пропускной способности памяти. Так же, как и в случае со SPEC CPU2000, приложение wupwise значительно выигрывает от применения оптимизаций под Prescott (-QxP).


1.2 Оптимизация программ с внесением изменений в исходный текст и использованием диагностики компилятора

В предыдущих секциях мы рассматривали влияние компилятора (и его настроек) на скорость выполнения программного кода. В то же время компиляторы Intel представляют более широкие возможности для оптимизации кода, чем просто изменения настроек. В частности, компиляторы дают возможность программисту делать "подсказки" (hints) в коде программы, которые позволяют осуществлять генерацию более эффективного кода с точки зрения производительности. Ниже - некоторые примеры для языка С/C++ (для языка Fortran существуют аналогичные средства, отличающиеся лишь синтаксисом).

#pragma ivdep (где ivdep означает ignore vector dependencies) применяется перед программными циклами, чтобы сообщить компилятору, что внутри нет зависимостей по данным. Эта подсказка работает в том случае, когда компилятор (на основе анализа) консервативно предполагает, что такие зависимости могут быть (если компилятор в результате анализа может доказать, что зависимость существует, то "подсказка" не оказывает никакого действия), тогда как автор кода знает, что таких зависимостей не может возникнуть. С помощью этой подсказки компилятор может сгенерировать более эффективный код: автоматическая векторизация для IA-32 (использование векторных команд из наборов MMX\SSE\SSE2\SSE3 для программных циклов на С/C++ и Fortran; более подробно познакомится с этой техникой можно, например, в следующей статье в Intel Technology Journal), программная конвейеризация (SWP) для IA-64.

#pragma vector always применяется, чтобы компилятор изменил решение о неэффективности векторизации цикла (как автоматической для IA-32, так и SWP для IA-64), сделанное на основе анализа количественных и качественных характеристик работы на каждой итерации.

#pragma novector оказывает действие, обратное #pragma vector always.

#pragma vector aligned используется, чтобы сообщить компилятору, что данные, используемые в цикле, выровнены на границу в 16 байт. Это позволяет генерировать более эффективный и/или компактный (из-за отсутствия проверок во время исполнения) код.

#pragma vector unaligned оказывает действие, обратное #pragma aligned. О выигрыше в производительности в этом случае говорить сложно, но можно рассчитывать на более компактный код.

#pragma distribute point используется внутри программного цикла, для того, чтобы компилятор мог разбить цикл (loop distribution) в этой точке на несколько более мелких. Например, подобная "подсказка" может быть использована в том случае, когда компилятору не удается сделать автоматическую векторизацию исходного цикла (например, из-за зависимости по данным, которую нельзя игнорировать даже при наличии #pragma ivdep), тогда как каждый (или часть) из вновь образованных циклов может быть эффективно векторизован.

#pragma loop count (N), применяется для того, чтобы сообщить компилятору, что наиболее вероятное значение количества итераций цикла будет равно N. Эта информация помогает принять решение о наиболее эффективной оптимизации для этого цикла (например, нужно ли делать развертку, нужно ли делать SWP или автоматическую векторизацию, нужно ли использовать команды программной предвыборки данных, ...)

"Подсказка" _assume_aligned(p, base) применяется для того, чтобы сообщить компилятору, что область памяти, ассоциирующаяся с указателем p, выровнена на границу в base = 2^n байт.

Это далеко не полный список различных "подсказок" компилятору, которые могут существенно повлиять на эффективность генерируемого кода. Может возникнуть вопрос о том, как определить, что компилятору требуется подсказка.

Во-первых, можно использовать диагностику компилятора в виде отчетов, которые он предоставляет программисту. Например, при использовании опции -Qvec_reportN (где N изменяется от 0 до 3 и означает уровень детализации) можно получить отчет об автоматической векторизации. Программисту будет доступна информация о том, какие циклы были векторизованы, а какие - нет. В отрицательном случае компилятор указывает в отчете причины, по которым векторизация не удалась. Предположим, что причиной явилась консервативно предполагаемая зависимость по данным. В таком случае, если программист уверен, что зависимости возникнуть не может, то возможно применение #pragma ivdep. Аналогичные (сравнивая с Qvec_reportN для IA-32) возможности компилятор представляет на IA-64 для контроля наличия и эффективности SWP. В целом, компиляторы Intel представляют широкие возможности для диагностики оптимизаций.

Во-вторых, другие программные продукты (такие, например, как профилировщик Intel VTune) могут использоваться для поиска "узких мест" в коде с точки зрения производительности. Результаты анализа могут помочь программисту сделать необходимые изменения.

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


Рисунок 8

Выше на рисунке 8 показан пошаговый процесс оптимизации приложения с помощью компилятора (и других программных продуктов) Intel на языке Fortran для архитектуры IA-64. В качестве примера рассматривается неадиабатическая региональная схема прогноза на 48 часов Росгидрометцентра (можно прочитать о ней, например, в этой статье. В статье говорится о времени расчета порядка 25 минут, но со времени ее написания произошли значительные изменения. В качестве точки отсчета взята производительность кода на системе Cray-YMP. Неизмененный код с опциями компилятора по умолчанию (-O2) показал прирост производительности в 20% на четырехпроцессорной системе на базе процессора Intel Itanium 2 900 MHz. Применение более агрессивной оптимизации (-О3) привело к ускорению в ~2.5 раза без изменения кода в основном за счет SWP и предвыборки данных. Анализ с помощью диагностики компилятора и профилировщика Intel VTune выявил некоторые "узкие места". Например, компилятор не сделал программную конвейеризацию нескольких важных для производительности циклов, сообщив в отчете, что предполагает зависимость по данным. Небольшие изменения кода (директива ivdep) помогли добиться эффективной конвейеризации. С помощью профилировщика VTune удалось обнаружить (а отчет компилятора это подтвердил), что компилятор не сделал изменения порядка вложенных циклов (loop interchange) для более эффективного использования кэш-памяти. Причиной опять явились консервативные предположения о зависимости по данным. Изменения были сделаны в исходном тексте программы. В итоге удалось добиться 4-кратного ускорения по отношению к начальной версии. Использование явного распараллеливания с помощью директив стандарта OpenMP, а затем переход на систему с процессорами более высокой частоты позволили сократить время счета до показателя менее 8 минут, что дало более чем 16-кратное ускорение по сравнению с начальной версией.

Intel Visual Fortran


В Intel Visual Fortran 8.0 используются front-end (часть компилятора, отвечающая за преобразование программы из текста на языке программирования во внутреннее представление компилятора, которое во многом не зависит ни от языка программирования, ни от целевой машины) технологии компилятора CVF и компоненты интеловского компилятора, отвечающие за набор оптимизаций и генерацию кода.


Рисунок 9



Рисунок 10

На рисунках 9 и 10 даны графики сравнения производительности Intel Visual Fortran 8.0 с предыдущей версией Intel Fortran 7.1 и с другими популярными в отрасли компиляторами с этого языка, работающими под управлением ОС семейств Windows и Linux. Для сравнения использовались тесты, исходные тексты которых, удовлетворяющие стандартам F77 и F90, доступны на сайте http://www.polyhedron.com/. На этом же сайте доступна более детальная информация о сравнении производительности компиляторов (Win32 Compiler Comparisons -> Fortran {77, 90} Execution Time Benchmarks и Linux Compiler Comparisons -> Fortran {77, 90} Execution Time Benchmarks): показано больше различных компиляторов, а геометрическое среднее дано в сочетании с индивидуальными результатами каждого теста.