Прошло уже четыре месяца с тех пор, как мы тестировали 64-бит компиляторы на платформе AMD64. Сегодня мы продолжим наши исследования и посмотрим, изменилось ли что-то за это время, поскольку 32-х битный продукт от Intel часто был впереди 64-х битных компиляторов. А главной интригой будет появление 64-бит компилятора от Intel. Конечно, первоначально он создавался для процессоров этой компании с поддержкой технологии EM64T, однако и на AMD64 работает замечательно.
Тестирование проводилось на ПК следующей конфигурации:
- процессор AMD Athlon 64 3500+ (2,2 ГГц, 512 КБ L2, Socket 939)
- материнская плата Gigabyte K8NSNXP-939
- два модуля памяти Kingston HyperX KHX4000/512 (работала как DDR400)
- операционная система SuSE Linux 9.1 x86-64 (ядро 2.6.5-7.108, компилятор gcc 3.3.3-33)
Использовались компиляторы:
- GNU gcc
- PGI Workstation 5.2-2
- Pathscale EKO Compiler Suite 1.3-108
- Intel Compilers 8.0 (C/C++ 8.0.070, Fortran 8.0.050)
- Intel Compilers 8.1 for EM64T (C/C++/Fortran 8.1.020)
Для тех, кто не следит за нашими публикациями, коротко расскажем об участниках.
Стандартный для Linux систем компилятор gcc остается самым популярным для некоммерческих применений. Мы использовали версию из поставки (точнее обновления) SuSE, поскольку новая (на момент проведения тестов) версия (мы попробовали 3.4.2) не дала существенного роста скорости в тестах SPEC CPU2000.
PGI является первым 64-битным коммерческим компилятором для AMD64. В комплект PGI Workstation 5.2 входят компиляторы с языков C, C++, Fortran и Fortran90 (а также отладчик и профайлер). Есть поддержка OpenMP и MPI. За время своего существования он сменил несколько (под)версий и сейчас остановился на 5.2-2. Отметим однако, что на самом деле новые версии PGI выходят чуть ли не каждый день, но производитель, к сожалению, не нумерует их и определить «свежесть» можно только по дате файла дистрибутива. Компилятор с языка Fortran из этого пакета используется и в коммерческих приложениях. В частности им скомпилирована 64-бит версия LS-DYNA для платформы AMD64.
PathScale EKO Compiler Suite появился относительно недавно, релиз первой (1.0) версии был весной этого года. Интересно, что этот продукт создавался сразу для работы именно на AMD64. В комплект входят компиляторы C, C++ и Fortran 77/90/95. Отладчиков и других утилит нет. Компилятор работает только под 64-х битными версиями Linux (заявлена поддержка RedHat, Fedora, SuSE). В конце августа была представлена версия 1.3 пакета. Производитель пытается привлечь внимание к качеству (скорости получаемого кода) своего продукта устраивая конкурсы типа «You'll Win if Your Code Runs 10% Faster». Кроме того на сайте приводятся многочисленные результаты тестирования в различных приложениях (партнером часто выступает «64bit Commercial Compiler» :) ). Поскольку у этого компилятора нет явной 32-х битной версии (но возможность получить 32-х битный код есть, более того, она используется в peak метрике), а компания любезно предоставляет в поставке полный конфигурационный файл для SPEC CPU2000, то для него дополнительно были получены peak метрики. Отметим, что эти результаты идут вне конкурса, поскольку для остальных компиляторов мы использует только base метрики.
Компиляторы компании Intel всегда показывали высокое качество оптимизации кода как на синтетических тестах, так и в жизни. Крупнейший производитель процессоров смог составить серьезную конкуренцию чисто софтверным компаниям. Конечно, можно посетовать на то, что он был в курсе всех тонкостей работы своих железных продуктов, однако и значительные инвестиции в R&D тоже сыграли роль. Мы тестируем компиляторы Intel начиная с версии 5.0 и каждая новая версия приносит значимые улучшения в скорости получаемого кода.
Во многом благодаря именно этим компиляторам, процессоры Intel Pentium 4 показывают высокие результаты на ресурсоемких задачах, если разработчик не поленился использовать компиляторы Intel :). Ну и конечно широкое распространение SIMD тоже можно приписать им.
Интересно, что и на процессорах других :) компаний компиляторы Intel показывают отличную скорость. Правда с версии 8.0 компания ввела проверку на производителя CPU, однако возможность оптимизации (включая векторизацию и SIMD) под «generic» процессор осталась. Кстати только недавно 64-бит компиляторы для AMD64 смогли обойти в SPECfp_base2000 32-х битный компилятор Intel, а в SPECint_base2000 он продолжает быть лидерами.
Выхода компиляторов для EM64T — версии Intel 64-бит технологии, расширяющей IA32 — ждали все. Поскольку процессоры с EM64T были представлены этим летом, то компания не могла оставить их без программной поддержки и уже осенью увидел свет соответствующий компилятор. В этой специальной версии компилятора предусмотрена генерация кода как для процессоров Intel с EM64T (ядра Prescott, SSE3) так и для совместимых с 64-х битным режимом процессоров других компаний (уже без SSE3 и некоторых тонких оптимизаций работы с памятью). Конечно под последними следует понимать AMD Athlon 64/Opteron :).
При проведении тестов использовались следующие ключи оптимизации:
- gcc/g++/g77: -O3 -funroll-all-loops +PGO (-fprofile-arcs/-fbranch-probabilities), дополнительный ключ -m32 для теста 32-х битного кода;
- PGI: -fastsse -Mipa=fast (два прохода компилятора для использования IPA);
- Pathscale: конфигурационный файл из поставки пакета
- Intel 8.0: -xW -O3 -ipo +FDO
- Intel 8.1/EM64T: -xW -O3 -ipo +FDO
Как и ранее, результаты следует отнести по терминологии SPEC к «estimated», поскольку не все компиляторы смогли отработать полный комплект тестов (у gcc нет компилятора Fortran 90, а Intel/EM64T не смог скомпилировать 252.eon). Однако все остальные формальные требования были выполнены.
gcc32 | gcc64 | pgi32 | pgi64 | psc1.3 | psc1.3 peak | ic80.xW | ic81e.xW | |
164.gzip | 1006 | 1164 | 777 | 1009 | 1347 | 1351 | 1192 | 1214 |
175.vpr | 871 | 930 | 801 | 804 | 910 | 936 | 982 | 897 |
176.gcc | 1190 | 1217 | 1105 | 1062 | 1218 | 1219 | 1047 | 1156 |
181.mcf | 1029 | 667 | 977 | 670 | 665 | 1043 | 1041 | 683 |
186.crafty | 1284 | 1873 | 1013 | 1498 | 1881 | 1898 | 1542 | 1930 |
197.parser | 1028 | 974 | 748 | 707 | 927 | 1110 | 1175 | 838 |
252.eon | 1173 | 1868 | 293 | 390 | 2035 | 2184 | 1589 | |
253.perlbmk | 1438 | 1507 | 1234 | 1217 | 1490 | 1597 | 1486 | 1450 |
254.gap | 1200 | 1162 | 967 | 977 | 1386 | 1383 | 1497 | 1221 |
255.vortex | 1513 | 1575 | 1308 | 1381 | 2139 | 2331 | 2064 | 2040 |
256.bzip2 | 979 | 1078 | 893 | 962 | 1125 | 1133 | 1070 | 1076 |
300.twolf | 1005 | 868 | 960 | 827 | 926 | 1108 | 1074 | 883 |
SPECint_base2000 (est.) | 1128 | 1186 | 875 | 907 | 1261 | 1380 | 1280 |
В SPECint_base2000 все компиляторы ведут себя примерно одинаково, кроме PGI, рекордно низкий результат которого в 252.eon не позволяет получить достойную интегральную оценку (спорный вопрос — стоит ли глубоко «копаться» в синтетике, или проще ограничиться интегральными оценками — предлагается решать в частном порядке). Если же искать лидера, то по интегральной оценке им является 32-х битный компилятор от Intel (напомним, что peak результат Pathscale идет вне конкурса). С ним серьезно соперничает Pathscale, по отдельным тестам разница варьируется от -36% до +28%. Интегральная оценка у него меньше всего на 1,5%.
gcc и PGI в общем не так уж и плохи, на некоторых задачах они показывают хорошую скорость. Intel/EM64T (пока?) проигрывает своему предшественнику и может рассматриваться сейчас только как потенциально интересный компилятор.
Так что резюме по CINT2000 будет в этот раз таким: если вам важна скорость, то стоит попробовать на своей задаче все описанные компиляторы, очень может быть, что один из них сможет существенно поднять скорость выполнения кода.
С точки зрения совместимости, уверенная компиляция двенадцати разнообразных приложений (за единственным исключением) не дает повода сомневаться в качестве рассмотренных продуктов.
gcc32 | gcc64 | pgi32 | pgi64 | psc1.3 | psc1.3 peak | ic80.xW | ic81e.xW | |
168.wupwise | 1089 | 1245 | 1456 | 1668 | 1694 | 1965 | 1713 | 1863 |
171.swim | 1413 | 1443 | 2041 | 2111 | 2372 | 2433 | 2026 | 1983 |
172.mgrid | 749 | 857 | 1138 | 1236 | 1465 | 1470 | 1165 | 1237 |
173.applu | 836 | 949 | 1253 | 1335 | 1512 | 1820 | 1234 | 1356 |
177.mesa | 1063 | 1626 | 983 | 1198 | 1668 | 1869 | 1708 | 1532 |
178.galgel | 2027 | 2264 | 2202 | 2421 | 1786 | 1815 | ||
179.art | 600 | 1129 | 1200 | 1169 | 1315 | 1858 | 1367 | 2197 |
183.equake | 1471 | 1380 | 1193 | 1193 | 1496 | 1525 | 1412 | 1620 |
187.facerec | 1481 | 2124 | 1751 | 1929 | 1456 | 1436 | ||
188.ammp | 825 | 1022 | 843 | 981 | 1015 | 1083 | 910 | 996 |
189.lucas | 1557 | 1613 | 1535 | 1774 | 1625 | 1774 | ||
191.fma3d | 1346 | 1461 | 1358 | 1441 | 1309 | 1384 | ||
200.sixtrack | 455 | 550 | 654 | 673 | 665 | 669 | 558 | 550 |
301.apsi | 680 | 828 | 1042 | 1169 | 1201 | 1211 | 1020 | 1083 |
SPECfp_base2000 (est.) | 1245 | 1373 | 1455 | 1598 | 1317 | 1414 |
В тестах CFP2000 лидером остается Pathscale. На втором месте идет новый продукт от Intel, который только в одном подтесте существенно проиграл своему собрату. При этом интегральная оценка возросла на 7,4%. Однако этого оказалось мало, чтобы занять позицию лидера, от которого его отделяет всего около 3%.
PGI отстает от лидера на 5,6% по SPECfp_base2000, однако по отдельным тестам идет разброс от -28% до +21%.
Судя по результатам, срочно бежать менять компилятор конечно не стоит. Однако, как и для CINT2000, можно сказать, что и для счетных задач есть смысл попробовать другие компиляторы, благо разброс скорости исполнения различных подтестов достаточно велик.
Кроме тестов на платформе AMD64 мы смогли провести несколько измерений и на Intel Xeon/Nocona. Использовались те же самые версии ОС от SuSE. Причем инсталлировались именно первоначальные релизы — от апреля 2004 года. Конечно, после установки мы обновили ОС, однако никаких проблем с работоспособностью замечено не было. Следует отметить, что использовалась не сильно нагруженная машина (2 х Intel Xeon 3.0 ГГц (Nocona), Supermicro X6DA8-G2 (Intel E7525), 2x512 МБ DDR2-400 SDRAM и жесткий диск Western Digital WD360 (SATA)) и, на наш взгляд, не следует воспринимать результат как «100% железно все работает!», однако этот факт совместимости, безусловно, положительный.
На этой системы были проведены тесты SPEC CPU2000 с компиляторами gcc, PGI и Intel. К сожалению Pathscale не успели прогнать, но постараемся исправиться в следующем материале :).
Ключи оптимизации и остальные настройки аналогичны приведенным выше для AMD64 (конечно для IC использовался ключ -xP вместо -xW). Отметим, что в таблице нет результатов для ic81e.xP для тестов 252.eon, 253.perlbmk, 254.gap и 255.vortex. Скорее всего, по 252.eon его не будет никогда (тест использует старый метод работы с потоками, который, видимо, не будет поддерживаться новыми версиями компиляторов), а вот для других трех тестов, возможно, что-то и получится в новых релизах.
Абсолютные результаты рассматривать в рамках вечного спора Intel vs AMD практически нет смысла — процессор использовался не самый быстрый, да и использование DDR2 пока играет скорее отрицательную роль.
gcc32 | ic80.xP | pgi32 | gcc64 | ic81e.xP | pgi64 | |
164.gzip | 729 | 984 | 737 | 846 | 1016 | 791 |
175.vpr | 739 | 822 | 685 | 708 | 743 | 658 |
176.gcc | 1378 | 1593 | 1224 | 1244 | 1366 | 1123 |
181.mcf | 845 | 853 | 806 | 498 | 564 | 488 |
186.crafty | 868 | 1109 | 698 | 1249 | 1305 | 940 |
197.parser | 840 | 1096 | 704 | 841 | 881 | 634 |
252.eon | 756 | 1167 | 188 | 1168 | 208 | |
253.perlbmk | 1201 | 1531 | 1192 | 1268 | 1130 | |
254.gap | 1182 | 1588 | 1148 | 1239 | 1087 | |
255.vortex | 1239 | 2125 | 1195 | 1449 | 1245 | |
256.bzip2 | 776 | 935 | 795 | 893 | 964 | 810 |
300.twolf | 1004 | 1147 | 986 | 791 | 850 | 716 |
SPECint_base2000 (est.) | 940 | 1197 | 790 | 974 | 749 | |
gcc32 | ic80.xP | pgi32 | gcc64 | ic81e.xP | pgi64 | |
168.wupwise | 1042 | 2314 | 1241 | 1016 | 2561 | 1026 |
171.swim | 1559 | 1919 | 1949 | 1453 | 1909 | 1915 |
172.mgrid | 714 | 1226 | 1116 | 695 | 1317 | 1035 |
173.applu | 752 | 1227 | 1276 | 816 | 1287 | 1063 |
177.mesa | 769 | 1300 | 934 | 1324 | 1526 | 1030 |
178.galgel | 2063 | 2197 | 2030 | 2100 | ||
179.art | 413 | 891 | 846 | 800 | 2725 | 807 |
183.equake | 1555 | 1538 | 1409 | 1413 | 1814 | 1282 |
187.facerec | 1571 | 1275 | 1643 | 1590 | ||
188.ammp | 561 | 669 | 712 | 736 | 846 | 660 |
189.lucas | 1704 | 1534 | 1648 | 1353 | ||
191.fma3d | 1177 | 1143 | 1352 | 1039 | ||
200.sixtrack | 286 | 539 | 514 | 406 | 530 | 339 |
301.apsi | 582 | 911 | 864 | 620 | 972 | 816 |
SPECfp_base2000 (est.) | 1260 | 1136 | 1461 | 1050 |
Как видно по результатам, наиболее предпочтительным для Xeon/Nocona является компилятор от Intel. Впрочем, это можно было предположить и до тестирования :). Однако то, что одна из первых 64-х битных версий вполне работоспособна безусловно радует.
Отметим, что код, полученный с помощью gcc и PGI работал на новом процессоре Intel безо всяких плясок с бубном, что очень приятно и вселяет надежду, что и другое ПО, уже портированное на AMD64, сможет заработать на EM64T без особых проблем.
Интересно сравнить эффект от перехода на 64-бит на разных платформах. Безусловно, в таком сравнении очень много условностей — далеко не однозначен выбор процессоров, платформ, опций компилятора, и поэтому рекомендуем не делать далеко идущих выводов, а скорее рассматривать эти цифры как еще один кусочек информации о 64 vs 32, Intel vs AMD, gcc vs IC и так далее. Тем более что все параметры все равно никогда не выровнять, так что в любом случае придется ориентироваться именно на такие цифры. В следующей таблице приводится % изменений от перехода с 32- на 64-бит ПО.
gcc/Intel | gcc/AMD | ic/Intel | ic/AMD | pgi/Intel | pgi/AMD | |
164.gzip | 16,05 | 15,71 | 3,25 | 1,85 | 7,33 | 29,86 |
175.vpr | -4,19 | 6,77 | -9,61 | -8,66 | -3,94 | 0,37 |
176.gcc | -9,72 | 2,27 | -14,25 | 10,41 | -8,25 | -3,89 |
181.mcf | -41,07 | -35,18 | -33,88 | -34,39 | -39,45 | -31,42 |
186.crafty | 43,89 | 45,87 | 17,67 | 25,16 | 34,67 | 47,88 |
197.parser | 0,12 | -5,25 | -19,62 | -28,68 | -9,94 | -5,48 |
252.eon | 54,50 | 59,25 | 10,64 | 33,11 | ||
253.perlbmk | 5,58 | 4,80 | -2,42 | -5,20 | -1,38 | |
254.gap | 4,82 | -3,17 | -18,44 | -5,31 | 1,03 | |
255.vortex | 16,95 | 4,10 | -1,16 | 4,18 | 5,58 | |
256.bzip2 | 15,08 | 10,11 | 3,10 | 0,56 | 1,89 | 7,73 |
300.twolf | -21,22 | -13,63 | -25,89 | -17,78 | -27,38 | -13,85 |
SPECint_base2000 | 3,62 | 5,14 | -5,19 | 3,66 | ||
gcc/Intel | gcc/AMD | ic/Intel | ic/AMD | pgi/Intel | pgi/AMD | |
168.wupwise | -2,50 | 14,33 | 10,67 | 8,76 | -17,32 | 14,56 |
171.swim | -6,80 | 2,12 | -0,52 | -2,12 | -1,74 | 3,43 |
172.mgrid | -2,66 | 14,42 | 7,42 | 6,18 | -7,26 | 8,61 |
173.applu | 8,51 | 13,52 | 4,89 | 9,89 | -16,69 | 6,54 |
177.mesa | 72,17 | 52,96 | 17,38 | -10,30 | 10,28 | 21,87 |
178.galgel | -1,60 | 1,62 | -4,42 | 11,69 | ||
179.art | 93,70 | 88,17 | 205,84 | 60,72 | -4,61 | -2,58 |
183.equake | -9,13 | -6,19 | 17,95 | 14,73 | -9,01 | 0,00 |
187.facerec | 4,58 | -1,37 | 24,71 | 43,42 | ||
188.ammp | 31,19 | 23,88 | 26,46 | 9,45 | -7,30 | 16,37 |
189.lucas | -3,29 | 9,17 | -11,80 | 3,60 | ||
191.fma3d | 14,87 | 5,73 | -9,10 | 8,54 | ||
200.sixtrack | 41,96 | 20,88 | -1,67 | -1,43 | -34,05 | 2,91 |
301.apsi | 6,53 | 21,76 | 6,70 | 6,18 | -5,56 | 12,19 |
SPECfp_base2000 | 15,98 | 7,37 | -7,57 | 10,28 |
Из цифр видно, что gcc в практически одинаково ведет себя на разных процессорах — если есть существенный рост или падение, то он наблюдается (почти всегда) на обеих платформах. Так что для готовых дистрибутивов Linux эффект от перехода на 64 бит не будет зависеть от того, на какую версию 64 бит переходить.
Для компиляторов Intel ситуация интереснее. Во-первых отметим значительное снижение показателей во многих тестах CINT2000 на обеих платформах. Хочется надеяться, что в новых версиях компилятора это поправят. При этом на AMD иногда эффект иногда «чуть более положительный». Что касается CFP2000, то почти +16% в интегральной оценке смотрятся неплохо. На AMD эффект похуже, но с этим уже ничего не сделаешь :(. Остается только использовать другие компиляторы.
PGI на процессоре Intel в режиме 64-бит показал себя совсем плохо. Увы, эта комбинация не может быть рекомендована для использования на счетных задачах. Хотя стоит отметить, что с распространением процессоров с EM64T компилятор могут и «подправить». А для AMD продукт Portland Group на тестах CFP2000 показывает рост на подавляющем числе задач.
Заключение
Появление нового конкурента на рынке 64-х битных компиляторов для платформы AMD64/EM64T оживило наметившийся было застой. Конечно Intel 8.1/EM64T при работе на платформе AMD не раскрывает полных возможностей процессора, однако это не мешает ему уверенно занять второе место после Pathscale по SPECfp_base2000 на AMD Athlon 64. С тестами SPECint_base2000 дело обстоит хуже — к сожалению новый продукт от Intel отстает даже от своего 32-х битного партнера.
Что касается версии 64-битного процессора от компании Intel, то первые испытания показали, что существующее 64-х битное ПО для платформы AMD64 вполне работоспособно и на новом процессоре конкурента. Особенно радует наличие полного комплекта компиляторов и их совместимость с AMD64. Так что скорее всего портирование на EM64T будет заключаться всего лишь в проверке функционирования ПО на новом ядре от Intel.