SPEC CPU2000. Часть 5 — Компиляторы


В пятом материале, посвященном SPEC CPU2000, будет рассмотрена зависимость теста от используемых для создания исполняемых модулей компиляторов. Второй целью является определение эффекта от автоматической (средствами самого компилятора) оптимизации под SIMD наборы инструкций современных процессоров.

Тесты SPEC CPU2000 поставляются в исходных кодах, написанных на языках программирования высокого уровня C, C++, Fortran. Последовательность работы с тестом включает в себя этапы:

  1. написание конфигурационных файлов
  2. компиляция тестов
  3. запуск

Самым важным, пожалуй, является первый этап. В конфигурационных файлах указываются правила, по которым компилируются тесты. Основные из них:

  • используемый компилятор
  • ключи оптимизации компилятора
  • опции по подстройке совместимости для отдельных тестов

Мы сейчас рассматриваем в base метрики, которые имеют более сильные (чем peak) ограничения на компиляцию, в том числе:

  • только один компилятор для каждого языка программирования
  • не более четырех опций оптимизации

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

Сегодня мы постараемся сравнить качество различных компиляторов. Обычно в слово "качество" вкладывается более широкий смысл. В данном случае это наличие среды, удобство работы, встроенные файлы помощи, безусловно, и скорость собственно компиляции. Однако в этой статье основным критерием оценки будет скорость работы полученного кода на тестах SPEC CPU2000.

Сравнивать компиляторы мы будем между собой на нескольких платформах под современные процессоры. Для процессора Intel Pentium 4 была взята материнская плата на чипсете i850. Для AMD Athlon и Athlon XP — плата на VIA KT333. Также будут приведены результаты системы с Intel Pentium III на плате с чипсетом i815. Отметим, что выбор платформ не сильно влияет на рассмотрение именно особенностей компиляторов. Ситуация, когда на одной платформе лучше работает один компилятор, а на второй — другой, представляется маловероятной.

Наиболее часто используемые компиляторы (для x86 конечно) в конфигурациях на www.spec.org — безусловно, продукты компании Intel. Во-первых, они используют все возможные оптимизации для процессоров Pentium III и Pentium 4 (включая MMX/SSE/SSE2), ну а во вторых, они доступны в качестве триал версий на сайте производителя. Причем именно их использует даже компания AMD при публикации результатов своих последних процессоров.

Будут рассмотрены только Win32 версии компиляторов, хотя многие производители одновременно предлагают версии для других операционных систем, включая Linux.

В состав пакета SPEC CPU2000 входит файл конфигурации для компиляторов Microsoft Visual C++ 6.0 SP5 и Compaq Visual Fortran 6.0, и он может быть использован в качестве простейшего примера работы с тестом. Вместе с опубликованными на www.spec.org, он и послужил основой для построения наших собственных файлов.

Конфигурационные файлы для всех компиляторов построены по общему принципу: сначала идут общие установки, потом флаги компиляции, и в конце — опции совместимости (хотя, конечно, этот порядок не фиксирован). При этом по возможности для каждого компилятора создаются версии с оптимизацией для разных процессоров/SIMD инструкций.

Опции оптимизации можно грубо разделить на два класса: общая высокоуровневая оптимизация кода и использование специальных SIMD инструкций для данного процессора. Первая работает на любых процессорах и, естественно, желательная для использования всегда, тогда как вторая имеет более частный характер и поэтому в тестах мы использовали для каждого процессора все возможные наборы.

Рассмотрим для примера конфигурационный файл для Compaq Visual Fortran 6.5 с оптимизацией для Pentium III:

tune= base
output_format= asc
ext=ixbt.cf65p3
check_md5=1

default=default=default=default:
FC=f90
ONESTEP=YES

default=base=default=default:
FOPTIMIZE=-fast -optimize:5 -tune:pn3 -architecture:pn3

178.galgel=default=default=default:
EXTRA_FFLAGS=-fixed 
LDOPT=-Fe$@ -link -stack:300000000

Версии для Pentium 4 и AMD K7 будут отличаться только строками "ext" и "FOPTIMIZE".

Для Microsoft Visual C++ были использованы ключи оптимизации -Ox -G6:

tune= base
output_format=asc
ext=ixbt.msvc6
check_md5=1

default=default=default=default:
CC= cl
CXX=cl

default=base=default=default:
COPTIMIZE=-Ox -G6
CXXOPTIMIZE=-Ox -G6

176.gcc=default=default=default:
EXTRA_CFLAGS=-Dalloca=_alloca -Op
EXTRA_LDFLAGS= -F10000000 

178.galgel=default=default=default:
EXTRA_FFLAGS=-fixed 
LDOPT=-Fe$@ -link -stack:300000000

186.crafty=default=default=default:
EXTRA_CFLAGS= -DNT_i386

252.eon=default=default=default:
SOURCE_PREFIX_CXX=-Tp

253.perlbmk=default=default=default:
EXTRA_CFLAGS= -DSPEC_CPU2000_NTOS -DPERLDLL /MT

254.gap=default=default=default:
EXTRA_CFLAGS=-DSYS_HAS_MALLOC_PROTO -DSYS_HAS_CALLOC_PROTO

Файл для Intel немного сложнее, поскольку использует компиляцию в два прохода для межмодульной оптимизации (версия для SSE2):

tune= base
ext=ixbt.060202.sse2

check_md5=1
reportable=1

default=default=default=default:
CC= icl
CXX=icl
F77=ifl
FC=ifl
OBJ=.obj

int=base=default=default:
PASS1_CFLAGS=-Qprof_gen
PASS2_CFLAGS=-QxW -Qipo -Qprof_use 
PASS1_LDFLAGS=-Qprof_gen 
PASS2_LDFLAGS=-QxW -Qipo -Qprof_use 

fp=base=default=default:
PASS1_CFLAGS=-Qprof_gen
PASS2_CFLAGS=-Qipo -QxW -O3 -Qprof_use
PASS1_FFLAGS=-Qprof_gen 
PASS2_FFLAGS=-Qipo -QxW -O3 -Qprof_use
PASS1_LDFLAGS=-Qprof_gen
PASS2_LDFLAGS=-Qipo -QxW -O3 -Qprof_use

176.gcc=default=default=default:
CPORTABILITY=-Dalloca=_alloca /F10000000
EXTRA_LDFLAGS= /F10000000 

178.galgel=default=default=default:
EXTRA_FFLAGS=-FI
EXTRA_LDFLAGS= /F32000000

186.crafty=default=default=default:
CPORTABILITY= -DNT_i386

253.perlbmk=default=default=default:
CPORTABILITY= -DSPEC_CPU2000_NTOS -DPERLDLL /MT
EXTRA_LDFLAGS=/MT

254.gap=default=default=default:
CPORTABILITY=-DSYS_HAS_CALLOC_PROTO -DSYS_HAS_MALLOC_PROTO

252.eon=base=default=default:
OPTIMIZE=-QxW -Qipo -GX -GR 
feedback=no

Компиляторы Fortran

Язык программирования Fortran, несмотря на свой заслуженный возраст, остается одним из наиболее популярных решений для вычислительных задач, требующих операций с вещественными числами. Полтора десятка лет назад существовало множество интересных компиляторов для него. При этом продукция гиганта Microsoft далеко не всегда была самой быстрой. Но до 21 века дожили не все. В настоящее время наиболее известными являются компиляторы от Compaq и Intel. Хотя уже ходят слухи, что они скоро объединятся.

Первый имеет возможность оптимизации под архитектуры как Intel, так и AMD. Это достигается использованием ключей -tune и -architecture. Мы будем сравнивать варианты Generic, P2, P3, P4, K7 (для AMD K6 и выше). Компиляторы от Intel также имеют возможность использования SIMD в генерируемом коде (без SIMD, MMX, SSE, SSE2). Отметим, что поддержка набора SIMD компании AMD 3DNow! явно нигде не указана.

Использовались версии компиляторов 6.6 и 5.01 соответственно. Отметим, что сегодня уже выпущены более новые версии (6.6A и 6.0), но по предварительным данным особых отличий по скорости нет. Мы постараемся рассмотреть их в следующих материалах, может, к этому времени и появится и PGI Workstation 4.0, от которого ожидаются хорошие результаты с процессорами AMD.

Начнем с платформы Intel Pentium 4. Последний набор (GEOMEAN) представляет собой среднее геометрическое по всем подтестам на языке Fortran.

Итак, посмотрим на первые результаты. Во-первых, не очень понятным моментом является столь разное поведение компиляторов при выборе целевой архитектуры. В то время как Intel показывает заметный рост показателей при использовании SSE/SSE2, Compaq остается к этому равнодушен. Возможно, тесты на других процессорах прояснят ситуацию.

Во-вторых, есть подтесты, скорость работы которых почти не зависит от использования SIMD (например 189.lucas, 301.apsi). Далее, в большинстве представленных случаев код от Intel быстрее, чем от Compaq. Однако есть тест (178.galgel), на котором преимущество CVF составляет более 50% на коде без SSE/SSE2. К этому же классу, видимо, стоит отнести и 171.swim, в котором только использование SSE/SSE2 позволяет Intel Fortran догнать Compaq Visual Fortran. Одно из объяснений, почему это у него получается, может заключаться в том, что с этими SIMD используются и специальные команды работы с памятью, к скорости которой этот тест наиболее критичен.

Однако по интегральной оценке выигрывает компилятор от Intel — преимущество составляет 17% и 27% при генерации кода с SSE и SSE2. А если не использовать SIMD, то результаты показаны практически равные.

С процессором AMD Athlon XP ситуация также очень интересна. Сначала отметим, что итоговые средние оценки снова практически совпадают. Первая неожиданность подстерегает нас в тесте 171.swim. При использовании ключей с аргументом "k7" компилятор от Compaq вдруг показал почти 8% роста. Скорее всего, это результат оптимизации работы с памятью, а не применение арифметических команд 3DNow!. Отметим и значительный отрыв кода от Intel при использовании SSE (но в относительных цифрах он меньше, чем с Pentium 4). Так что можно сказать, что SSE для Athlon XP очень даже полезно, даже если код создан Intel :)

Следующий интересный тест — 178.galgel. Мы уже видели, что в этом подтесте компиляторы от Compaq показывают некоторое преимущество перед Intel. На Athlon XP это стало еще более заметно. На нем использование SSE (в коде от Intel) оказывает минимальное влияние на скорость работы на Athlon XP, в то время как для Pentium 4 это являлось спасением для IFC. Также отметим 11% рост скорости исполнения кода CVF при использовании оптимизации под Athlon. Недаром компания AMD при расчете peak метрик для публикации на www.spec.org использует именно CVF 6.6 для подтеста 178.galgel.

Отметим также изменение по сравнению с первой диаграммой расстановки сил в тестах 200.sixtrack и 301.apsi. Если на Pentium 4 компиляторы показывали примерно равные результаты, то здесь в первом тесте вперед вышел продукт Intel, а во втором — Compaq.

Несмотря на то, что Pentium III уже устарел как морально, так и физически, он продолжает использоваться в том числе и для научных расчетов. С этим процессором компиляторы показывают более "прямолинейные" результаты. Ранее использование не максимально поддерживаемого набора SIMD часто приводило к снижению результатов. Особенно это касается оптимизации под MMX — иногда она оказывается даже вредной.

Средние цифры у двух компиляторов отличаются не сильно, кроме некоторого преимущества SSE оптимизированной версии кода от Intel.

Здесь мы также видим, что Compaq положительно реагирует на ключи оптимизации под Pentium III, чего ранее практически не наблюдалось. Однако тесты, в которых наблюдается такое поведение, не всегда совпадают с аналогичными по версии Intel.

Ну и последняя диаграмма показывает нам, что для процессоров AMD Athlon для научных расчетов лучше использовать компилятор от Compaq, особенно с оптимизацией "k7". Эффект от нее может достигать 55%.

Выводы по компиляторам Fortran

Проведенные тесты еще раз подтвердили, что от компиляторов действительно зависит очень многое. Для достижения наивысших результатов можно наращивать мощность центральных процессоров и памяти, оптимизировать алгоритмы. Но даже просто выбор компилятора и ключей оптимизации может увеличить скорость расчетов в 2 раза. Что касается использования SIMD, то наибольший эффект был от кода с использованием SSE2 для процессора Intel Pentium 4 в тестах 171.swim и 187.facerec. При этом отметим, что первый из этих тестов показывает такой рост в основном из-за оптимизации работы с памятью, а вот второй — именно благодаря векторизации расчетов. Безусловно, при ручном программировании алгоритмов для SIMD эффект может быть гораздо больше, но и получившийся в наших тестах рост показывает отличное качество компилятора от Intel.

Использование SSE с процессором Athlon XP можно назвать успешным, хотя таинственная опция "k7" у компилятора CVF тоже дает заметный положительный эффект. Напомним, что SSE — это работа с вещественными числами одинарной точности, тогда как в большинстве случаев для научных расчетов требуется двойная.

Что касается компилятора компании Compaq, то его можно также рекомендовать для расчетов на платформах AMD.

Компиляторы C и C++

В этом разделе будет тоже два участника — Microsoft Visual C++ 6.0 SP5 и Intel C/C++ Compiler 5.01. При появлении других интересных компиляторов мы постараемся обновить эти результаты. Кстати, если учесть, что Visual C++ является самым популярным компилятором C/C++ сегодня, то становится интересно, стоит ли доверять знаменитому качеству Microsoft…

Печальная картина :( Скорость кода, генерируемого компилятором Microsoft, совсем не впечатляет — преимущество Intel составляет от 13 до 350(!)%. При этом минимальная разница достигается в тесте 179.art, который очень требователен к пропускной способности памяти. Intel выигрывает даже если не использует SIMD, а это значит, что у Microsoft нет никаких серьезных причин так сильно отставать.

Отметим также поведение компиляторов в тесте 252.eon. Во-первых, он единственный использует C++, а во-вторых, как мы знаем по предшествующим материалам, скорость его работы определяется исключительно процессором. Тем более грустно видеть такую разницу между участниками. Интересно, а на чем компилировался Microsoft Office? :) Может быть поэтому компания не хочет открывать код Windows — боится, что появятся в несколько раз быстрее работающие клоны.

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

Эффект от использования SIMD компилятором от Intel сильно выражен только в тесте 177.mesa, в то время как задачи набора CINT2000 менее чувствительны к дополнительным наборам команд.

Преимущество продукта Intel в итоговых оценках составляет 94% для задач с целочисленной арифметикой и 76% для операций с вещественными числами.

Для процессора AMD Athlon XP ситуация в целом повторяется — значительное преимущество продукта от Intel. Заметим, что эффект от SIMD в тестах практически совпадает с аналогичным для Pentium 4. Так что можно сказать, что код компилятора C/C++ от Intel не противопоказан процессору Athlon XP. 



В тестах с процессорами Intel Pentium III и AMD Athlon мы также видим преимущество компиляторов компании Intel. Отметим большой эффект от использования MMX в тесте 252.eon с процессором Athlon.

Выводы по компиляторам C/C++

Тесты компиляторов C/C++ показали, что продукт компании Intel позволяет получить значительно более быстрый код, чем Microsoft Visual C++. Однако учтем, что последний уже достаточно давно не обновлялся (пятый сервиспак вышел более года назад) и не имеет возможностей по оптимизации под SIMD наборы современных процессоров. Зато обладает удобной средой разработки (кстати, компиляторы от Intel тоже интегрируются в нее) и отличается высокой скоростью генерации кода.

Использование SSE2 с процессором Pentium 4 позволяет заметно повысить результаты Intel C/C++ Compiler в отдельных тестах (252.eon на 26%, 177.mesa на 77%). Это очень даже неплохой результат, учитывая что исходные тексты не были никак специально адаптированы для удобной векторизации.

Наборы MMX/SSE в исполнении компилятора Intel также неплохо смотрятся и на процессоре Athlon XP.

Так что с учетом этого можно отлаживать программы с Visual C++, а готовый продукт компилировать с использованием Intel C/C++ Compiler :)

Оптимизация распределения памяти

Если вы внимательно посмотрите на конфигурационные файлы опубликованных на www.spec.org результатов, то безусловно заметите, что во многих из них используется библиотека shlW32M.lib. Она является продуктом компании www.microquill.com и используется для оптимизации управления памятью. Ее стоимость составляет более $700. Нам удалось получить триал версию этой библиотеки и провести несколько тестов. Поскольку по лицензионному соглашению мы можем использовать ее не более 60 дней, то тесты были проведены на единственной конфигурации ПК с целью узнать реальный эффект от использования shlW32M.lib . Что касается компиляторов, то мы использовали нашу конфигурацию для компиляторов Intel в качестве базовой. Отметим также, что использование SP5 для MSVC заметно меняет расклад — если его не использовать, то эффект от SmartHeap будет немного выше. 

Таким образом, здесь мы приведем только результаты системы на Intel Pentium 4 1.7 i850 RDRAM с и без этой библиотеки. На графиках представлен % отличий результатов при использовании Smartheap:



Как вы видите, в некоторых тестах она дает прирост, а в некоторых — наоборот. Для peak метрики можно использовать shlW32M.lib только для тех подтестов, где она дает прирост и таким образом повысить результат CINT2000 примерно на десяток баллов..

Учитывая стоимость продукта, мы отказались в дальнейшем от его использования в тестах. Это является еще одним объяснением отличия наших результатов от опубликованных Intel и AMD на сайте www.spec.org .

Выводы

Мы рассмотрели несколько популярных компиляторов с языков программирования C/C++/Fortran в тестах SPEC CPU2000. Это последний существенный момент, от которого зависят результаты этого пакета. Конечно мы, как и большинство участников SPEC, будем в дальнейшем использовать компиляторы компании Intel для публикации данных, но выяснить, почему стоит делать именно так, мы были обязаны :)

Из сегодняшнего исследования можно сделать несколько выводов. Некоторые из них относятся не только к SPEC CPU2000:

  • результаты SPEC CPU2000 зависят от компиляторов (и их настроек) более всего
  • хороший компилятор (читай — Intel :) позволяет получить значительный эффект от использования SIMD даже на неоптимизированном исходном коде
  • к сожалению, набор AMD 3DNow! не имеет широкой поддержки у производителей компиляторов
  • Microsoft Visual C++, конечно, хорош, удобен и приятен, но не стоит на этом останавливаться :), есть и другие компиляторы



Дополнительно

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.