Несмотря на то, что десктопные процессоры семейства Intel Core 2 с ядром «Conroe» на сегодняшний день по-прежнему представлены исключительно инженерными образцами, их производительность и микроархитектурные особенности исследованы уже достаточно хорошо с помощью различных синтетических тестов и реальных приложений. Самое время дополнить эту картину результатами тестирования производительности указанных процессоров (на примере инженерного образца процессора Intel Core 2 Duo E6700 с тактовой частотой 2.66 ГГц) в тестовом пакете SPEC CPU2000. Тем более что совсем недавно вышла новая версия компиляторов Intel C++/Fortran Compiler 9.1, в которой добавлена оптимизация кода под процессоры семейства Intel Core 2 (пока что не совсем официально :) — так, например, поставляемая с компиляторами документация умалчивает по этому поводу).
Итак, мы перекомпилировали задачи тестового пакета SPEC CPU2000 с помощью следующих версий компиляторов:
- Intel(R) C++ Compiler for 32-bit applications, Version 9.1 Build 20060323Z Package ID: W_CC_P_9.1.022
- Intel(R) Fortran Compiler for 32-bit applications, Version 9.1 Build 20060323Z Package ID: W_FC_C_9.1.024
Во всех случаях (различные варианты оптимизации кода) использовались одинаковые общие ключи компиляции кода, соответствующие «двухпроходной» компиляции кода с оптимизацией по профилю приложения (profile-guided optimization, PGO):
PASS1_CFLAGS= -Qipo -O3 -Qprof_gen
PASS2_CFLAGS= -Qipo -O3 -Qprof_use
Процессор Intel Core 2 E6700 (Engineering sample)
Как обычно, сначала изучим производительность кода задач SPEC CPU2000 в чистом виде, т.е. в абсолютных величинах, при применении всех возможных вариантов оптимизации кода, включая новый специфический вариант для процессоров Intel Core 2. Для этого используем «обычный» однопоточный вариант запуска тестов (метрику base).
Уже после нашего предыдущего исследования 65-нм процессоров, основанных на ядрах Presler и Yonah, нами была выявлена причина неработоспособности задачи 255.vortex — она заключалась в наличии ошибок в наборе входных данных для этой задачи в этой версии тестового пакета. В настоящем исследовании эта ошибка была устранена замещением набора входных данных на таковой из предыдущей версии SPEC CPU2000 1.2, так что результаты измерения производительности этой задачи также присутствуют в приведенной ниже таблице. Тем не менее, «неоптимизированные» варианты задач 175.vpr и 176.gcc, как и во всех предыдущих исследованиях (включая таковые с применением более ранней версией SPEC CPU2000 1.2), некорректно завершают свою работу, в связи с чем рейтинг их производительности в приведенной ниже таблице по-прежнему отсутствует.
Без опт. | -QxK | -QxW | -QxN | -QxB | -QxP | -QxT | |
164.gzip | 1461 | 1644 | 1656 | 1637 | 1647 | 1646 | 1645 |
175.vpr | — | 1980 | 2075 | 2076 | 2097 | 2136 | 2083 |
176.gcc | — | 3064 | 3084 | 3089 | 3068 | 3097 | 3089 |
181.mcf | 3952 | 3611 | 3620 | 4846 | 4877 | 4863 | 4869 |
186.crafty | 2123 | 2145 | 2467 | 2470 | 2450 | 2438 | 2465 |
197.parser | 1509 | 1515 | 1484 | 1509 | 1500 | 1514 | 1512 |
252.eon | 2700 | 2956 | 3410 | 3442 | 3251 | 3430 | 3313 |
253.perlbmk | 2951 | 2984 | 2975 | 3009 | 3014 | 2991 | 2999 |
254.gap | 2696 | 2691 | 2838 | 2854 | 2833 | 2834 | 2832 |
255.vortex | 4419 | 4318 | 4456 | 4301 | 4311 | 4522 | 4548 |
256.bzip2 | 2259 | 2152 | 2057 | 2104 | 2052 | 2076 | 2081 |
300.twolf | 2356 | 2821 | 2904 | 2878 | 2844 | 3012 | 3017 |
SPECint_base2000 | 2495 | 2542 | 2626 | 2694 | 2672 | 2715 | 2706 |
Легко заметить, что в приведенных выше таблицах появился новый вариант оптимизации кода «-QxT». Также легко догадаться, что соответствует он именно процессорам семейства Intel Core 2, хотя и имеет не совсем очевидное буквенное обозначение. Учитывая, что все предыдущие варианты оптимизации кода основывались на кодовых названиях соответствующих процессорных ядер (Katmai, Willamette, Northwood, Banias, Prescott), для процессоров семейства Core 2 (ядра Conroe) было бы разумно ожидать опцию «-QxC». Тем не менее, новая опция записывается именно как «-QxT», что, предположительно, отвечает так и не увидевшему свет процессорному ядру «Tejas».
Как бы там ни было, рассмотрим полученные результаты как таковые. По интегральной оценке целочисленных задач SPECint_base2000 они располагаются следующим образом: «без оптимизации» < -QxK < -QxW < -QxB < -QxN < -QxT < -QxP. Отметим следующие особенности: лучшим вариантом оптимизации, пусть и с небольшим перевесом, все-таки является вариант «-QxP», который все же не следует воспринимать буквально как «вариант оптимизации кода под процессорное ядро Prescott». Так, последняя версия документации гласит, что применение опции -QxP приводит к созданию кода, оптимизированного под процессоры Intel Core Duo, Intel Core Solo и Intel Pentium 4 с поддержкой SSE3, а также всех «совместимых процессоров Intel» с поддержкой вышеназванных инструкций. Иными словами, оптимизация проводится именно под указанные наборы инструкций, а не конкретную процессорную микроархитектуру. В этом ключе, наилучшие результаты с опцией -QxP на процессорах Intel Core Duo и Intel Core 2 неудивительны. А что касается последних — будем надеяться, что будущие ревизии компиляторов 9.1 все же смогут «вытянуть максимум» на данных процессорах именно с «родной» для них опцией -QxT. Вторая характерная особенность полученных результатов заключается в том, что (на этот раз — специфический) вариант оптимизации кода под процессорное ядро Banias (-QxB) также оказывается несколько хуже по сравнению с неспецифическим вариантом оптимизации кода под процессоры с набором инструкций SSE2 (-QxN). Т.е. рассмотренная выше картина (-QxP vs. -QxT) здесь в точности повторяется.
Без опт. | -QxK | -QxW | -QxN | -QxB | -QxP | -QxT | |
168.wupwise | 3709 | 3514 | 3790 | 4408 | 4134 | 4499 | 4487 |
171.swim | 2763 | 3189 | 3227 | 3227 | 3224 | 3225 | 3207 |
172.mgrid | 1330 | 1682 | 1756 | 1763 | 1722 | 1763 | 1762 |
173.applu | 1558 | 1642 | 1685 | 2186 | 2037 | 2195 | 2193 |
177.mesa | 1758 | 2479 | 2602 | 2604 | 2284 | 2614 | 2466 |
178.galgel | 2521 | 4587 | 5557 | 6341 | 5769 | 6365 | 6075 |
179.art | 7465 | 8341 | 8455 | 8460 | 8421 | 7679 | 7682 |
183.equake | 2636 | 2595 | 2647 | 2645 | 2609 | 3051 | 3037 |
187.facerec | 2194 | 2723 | 2745 | 2717 | 2692 | 2768 | 2772 |
188.ammp | 1794 | 1794 | 1944 | 1918 | 1844 | 1934 | 1840 |
189.lucas | 2450 | 2393 | 2903 | 2847 | 2440 | 2847 | 2867 |
191.fma3d | 1637 | 1639 | 2106 | 2124 | 1835 | 2100 | 2135 |
200.sixtrack | 696 | 678 | 1061 | 1043 | 661 | 1034 | 1055 |
301.apsi | 1600 | 1597 | 1683 | 1730 | 1731 | 1695 | 1685 |
SPECfp_base2000 | 2101 | 2351 | 2610 | 2710 | 2486 | 2722 | 2697 |
Перейдем к результатам измерения производительности задач SPEC CPU2000 с вещественными числами. По усредненной оценке SPECfp_base2000 результаты здесь располагаются несколько иным образом: «без оптимизации» < -QxK < -QxB < -QxW < -QxT < -QxN < -QxP. Однако общая тенденция сохраняется, причем оказывается еще больше выраженной: «родной» вариант -QxT оказывается хуже как наилучшего варианта -QxP, так и варианта оптимизации под SSE2 для «новых» процессоров (Northwood и выше) -QxN. А вариант специфической оптимизации кода под процессорное ядро Banias (-QxB) оказывается хуже как неспецифического варианта -QxN, так и «старой» версии неспецифического варианта оптимизации под SSE2 -QxW. Таким образом, дорабатывать компиляторы Intel C++/Fortran для осуществления более тщательной оптимизации под процессоры семейства Intel Core 2 явно стоит. А пока можно ограничиться лучшим вариантом -QxP, тем более что сравнивать результаты производительности Core 2 Duo E6700 с результатами тестирования других процессоров по варианту -QxT пока что не представляется возможным.
Сопоставление с Intel Pentium Extreme Edition 965
После некоторых размышлений, полученные выше результаты измерений было решено сравнивать с результатами тестирования именно вышеназванного процессора. Дело в том, что, несмотря на значительное различие в микроархитектурах данных процессоров и их тактовых частотах, показатели производительности задач набора SPEC CPU2000 на процессоре Intel Pentium Extreme Edition 965 оказываются… наименее отстающими от результатов, полученных в настоящем тестировании!
Итак, целочисленные тесты SPEC CPU2000. Все без исключения задачи показывают явное преимущество на процессоре Intel Core 2 Duo, несмотря на значительно меньшую тактовую частоту (2.66 ГГц против 3.73 ГГц, т.е. в 1.4 раза меньше). Минимальное преимущество наблюдается в задаче 164.gzip (28-31%), максимальное (87-105%) — в задаче 181.mcf. Значительного разброса в относительных величинах, соответствующих разным вариантам оптимизации кода, практически не наблюдается. Особенно четко это видно по усредненному результату SPECint_base2000 — он очень четко попадает в интервал 54-55%. Если учесть разницу в тактовых частотах, преимущество новой микроархитектуры Intel Core над NetBurst в целочисленных задачах SPEC CPU2000 оказывается более чем двухкратным! (2.17 раз, чтобы быть точным).
Тесты с вещественными числами показывают менее однозначную, но в целом все равно выигрышную картину преимущества Conroe над Presler. Здесь можно отметить большую зависимость результатов от применяемого варианта оптимизации кода и задачи, практически не получающие преимущества на Intel Core 2 (например, 171.swim). Интересный результат показывают задачи 168.wupwise и, в особенности, 179.art, достигающие до 145% и 184% преимущества, соответственно. Что характерно, наименьшее преимущество в этих задачах наблюдается с вариантом -QxP, что, возможно, все-таки говорит о большей эффективности применения этого варианта на процессорных ядрах микроархитектуры NetBurst с поддержкой расширений SSE3. В интегральной оценке SPECfp_base2000 этот вариант получает наименьшее преимущество на Intel Core 2 — порядка 26%, тогда как остальные варианты показывают от 33 до 38% преимущества. Если снова учесть различие в тактовых частотах сопоставляемых процессоров, преимущество микроархитектуры Intel Core над NetBurst в задачах SPEC CPU2000 с вещественными числами также оказывается почти двухкратным (до 1.93 раз).
Эффективность «двухъядерного» исполнения
Напоследок, поскольку процессор Intel Core 2 Duo E6700 является двухъядерным, оценим эффективность параллельного запуска двух копий задач SPEC CPU2000, используя для этой цели метрику «rate». При этом в качестве эталона будем использовать величины, полученные в этой метрике с количеством копий, равным 1.
Эффективность параллельного запуска двух копий целочисленных задач оказывается весьма высокой практически во всех случаях, за исключением задачи 181.mcf. По нашим предыдущим исследованиям, эта задача не отличается высокой эффективностью «распараллеливания» и на других двухъядерных процессорах, таких как Intel Pentium Extreme Edition (Presler) и Intel Core Duo (Yonah). В нашем предыдущем исследовании, в частности посвященном процессорному ядру Yonah, мы сделали предположение, что столь низкая эффективность параллельного исполнения этой задачи связана с уменьшением доступного объема L2-кэша в пересчете на одно ядро (в данном случае — с 4 МБ до 2 МБ) при высокой требовательности данной задачи к пропускной способности кэша/памяти. Тем не менее, важно отметить, что на процессоре Intel Core 2 Duo (Conroe) эта задача все же отличается более высокой эффективностью при «параллельном» запуске по сравнению с таковым на процессоре Intel Core Duo (Yonah). По крайней мере, в большинстве вариантов оптимизации кода относительный результат оказывается неотрицательным. По-видимому, сказывается значительно больший суммарный объем L2-кэша процессора (4 МБ против 2 МБ у Yonah). Разумно также предположить, что именно больший объем L2-кэша оказывает положительное влияние и на относительные результаты, полученные во всех остальных задачах, которые оказываются лучшими по сравнению с полученными ранее на Yonah. Так, усредненный результат по SPECint_rate2000 показывает 78-82% прироста при запуске двух копий целочисленных задач SPEC CPU2000 на Conroe, тогда как на Yonah в этих условиях наблюдается лишь 67-70% прироста.
Заметно лучшая картина, по сравнению с Yonah, наблюдается и в задачах SPEC CPU2000 с вещественными числами. Во-первых, здесь совершенно отсутствуют результаты «отрицательного прироста» (что наблюдалось на процессорном ядре Yonah, например, в задаче 179.art). Во-вторых, общая эффективность параллельного запуска двух копий задач также оказывается выше в большинстве случаев. По усредненной оценке SPECfp_rate2000, прирост в скорости при запуске двух копий задач на Conroe составляет 54-63%, что также выше по сравнению с результатом, достигнутым на Yonah (48-53%).
Заключение
По результатам тестирования производительности задач тестового пакета SPEC CPU2000 новый процессор Intel Core 2 Duo E6700, представленный инженерным образцом, на сегодняшний день не имеет себе равных. По сравнению с предыдущим рекордсменом в виде Intel Pentium Extreme Edition 965, новый процессор показывает примерно 55% преимущества в целочисленных задачах и 26-38% преимущества в задачах с вещественными числами. Если учесть соотношение частот сравниваемых процессоров, преимущество новой микроархитектуры Intel Core над устаревающей NetBurst оказывается более чем двухкратным в первом случае, и почти двухкратным — во втором. Новый процессор также отличается весьма высокой эффективностью исполнения двух копий задач SPEC CPU2000, которая оказывается ощутимо выше по сравнению с таковой, в данном случае, на его ближайшем аналоге — процессоре Intel Core Duo.
Исследования доступных на сегодняшний момент ревизий компиляторов Intel C++/Fortran 9.1 показали, что наилучшим вариантом оптимизации кода под процессоры семейства Intel Core 2 пока что по-прежнему является вариант -QxP, соответствующий процессорным ядрам Yonah и Prescott (Smithfield, Presler), поддерживающим инструкции SSE3. Новый, специфический вариант оптимизации кода -QxT под процессоры семейства Intel Core 2 с поддержкой SSE4, пока что немного уступает ему в производительности задач SPEC CPU2000 и, очевидно, требует дальнейших усовершенствований рассматриваемых компиляторов.