Идя навстречу нашим читателям, мы решили дополнить тесты компиляторов и результатами работы под операционной системой Linux. Отмечу, что я не считаю себя специалистом по ОС Linux, однако имею некоторый опыт общения с ней и, благодаря поддержке посетителей нашей конференции, практически все получилось сделать :)
В качестве дистрибутива был взят Red Hat Linux 7.3. На жестком диске было освобождено порядка 4Gb, и на него была произведена установка операционной системы с графической оболочкой GNOME. Тесты запускались из окна терминала. Напомню еще раз, что исследуется только скорость работы кода, получаемого различными компиляторами на тестах SPEC CPU2000, а не их "личные" качества в плане собственно компиляции. Еще одним моментом, который не стоит забывать, является ориентация теста на вычислительные приложения.
Конфигурация ПК аналогична прошлому дополнению:
- Intel Pentium 4 1.7GHz
- Epox 4T2A i850
- 256MB PC800 RDRAM
В сравнении участвовали компиляторы:
- gcc версий 2.96 (из поставки Red Hat 7.3), 2.95.3, 3.1
- Intel C/C++/Fortran Compilers 6.0 for Linux
- PGI Workstation 4.0.2 for Linux
Также на диаграммах вы увидите и результаты компиляторов от Intel при работе под Windows 2000 Pro.
gcc 2.95.3 и gcc 3.1 устанавливались в отдельные директории с компиляцией из исходных текстов. Отметим, что в состав этих пакетов не входит компилятор для языка Fortran 90, так что четыре теста из состава CFP2000 с gcc не могли быть проверены в принципе. Компиляторы Intel и PGI, в отличие от gcc, поставляются в виде исполняемых файлов и были установлены в систему согласно руководству.
Кстати, для анализа результатов полезно вспомнить, какие языки программирования в каких подтестах использовались:
CINT2000 | CFP2000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Напомним, что SPEC CPU2000 проверяет и качество работы кода, сравнивая результаты с эталоном (например, побитное сравнение получаемого архива или рассчитанных коэффициентов и т.п.). Некоторые варианты оптимизации могут привести к отличиям в численных расчетах и иногда приходится их запрещать. Поскольку задачи получить любой ценой результаты этих компиляторов не стояло, то некоторые из подтестов не были выполнены по разным причинам. Это будет указано ниже.
Использовались ключи оптимизации:
- gcc 2.95.3: -O3 -fomit-frame-pointer
- gcc 2.96: -O3 -fomit-frame-pointer
- gcc 3.1: -O3 -fomit-frame-pointer
- gcc 3.1 /P4 (версия для Pentium 4): -O3 -march=pentium4 -ffast-math -fomit-frame-pointer
- Intel 6.0 полностью аналогичны тесту под Win32 (используется SSE2, IPO)
- pgi fast: -fast
- pgi fastsse: -fastsse
Ключи были выбраны по рекомендациям из документации для компиляторов, другим источником информации послужила конференция на сайте.
Если с последними двумя компиляторами никаких проблем не возникло, то gcc показали себя немного хуже, и это необходимо учесть при анализе результатов:
- тест 252.eon проходил проверку на качество только при компиляции с ключом -O0
- gcc 3.1 /P4 не смог скомпилировать 176.gcc
- тест 200.sixtrack с gcc 3.1 и gcc 3.1 /P4 не прошел проверку на качество
Сначала мы сравним производительность разных версий компилятора gcc между собой:


В целом, как и ожидалось, версия 2.96 является промежуточной. 2.95.3 - одна из лучших версий прошлого года. Последний майский релиз компилятора, версия 3.1, показывает лучшие результаты во всех тестах. Однако отметим, что попытка получить оптимизированный для Pentium 4 код в большинстве подтестов привела к незначительному снижению производительности. Только на 177.mesa мы видим пользу от SSE2 (напомним, что и компилятор Intel в наших прошлых тестах также успешно применил SIMD именно в этом тесте).
Перейдем к компиляторам PGI. У нас есть только одна версия, зато можно попробовать использовать различные опции оптимизации. Использование -fastsse включает генерацию кода для SIMD инструкций процессора Pentium 4, а также некоторые другие флаги оптимизации.


Как видно из диаграмм, на все тесты CINT2000 оптимизация под SIMD не повлияла никак. Видимо, компания не использует возможности SSE2 по работе с векторами из целых чисел. Что касается CFP2000, то 171.swim получил более чем 100% прирост, два других (177.mesa и 187.facerec) прибавили более 50%. А интегральная оценка подросла на 8%. Причем реальное использование SIMD — это не специфика только компилятора с языка Fortran, так как 177.mesa написан на C.
Теперь сравним компиляторы разных компаний между собой:


Как видно по диаграммам, в целом заметно лидирует Intel. И только в подтесте 256.bzip2 gcc 3.1 с ним сравнялся. К сожалению, тест 252.eon во всех версиях gcc работал только при компиляции без оптимизации, так что его низким результатам не стоит уделять много внимания.
PGI при работе с целыми числами практически везде отстает от gcc 3.1. На вещественной арифметике он ведет себя заметно лучше, и в некоторых тестах приближается к Intel, а на 191.fma3d даже опережает его. Особенно хочется отметить их близкие результаты в подтестах 171.swim и 179.art.
На последней паре диаграмм приведены результаты сравнения компиляторов Intel при работе в двух совершенно разных операционных системах — Windows 2000 Pro (win32) и Linux. Версии компиляторов одинаковые, ключи оптимизации — тоже, и поэтому сравнение можно расценить как исследование влияния операционной системы на скорость работы счетных задач.


Коротко результаты я бы прокомментировал так: "Природу не обманешь" :) Да, есть тесты, в которых разница превышает 30%, но для других она составляет менее 5%! Удивительное единодушие для нашего непостоянного времени.
Ну а в целом мы видим, что компилятор от Intel лучше себя чувствует в среде win32, чем в linux. По интегральным оценкам версия для linux проигрывает 7% и 3% в CINT2000 и CFP2000 соответственно. Наиболее заметно она опережает своего win32 собрата в подтесте — 183.equake — на 18%.
Заключение
Возвращаясь к основной теме этого цикла, тесту SPEC CPU2000, следует отметить, что мы еще раз убедились, что компиляторы от Intel по праву занимают первое место по цитируемости на www.spec.org для x86 систем.
Что касается собственно рассмотренных в этой статье компиляторов, то можно констатировать, что gcc в целом не сильно проигрывает своему коммерческому конкуренту — продукту компании Intel. Компилятор от PGI имеет некоторые положительные качества, но при работе с целочисленной арифметикой проигрывает бесплатному компилятору gcc.
Такие современные способы увеличения производительности, как использование SIMD, хорошо даются только автору этого набора команд — компании Intel.