Блог → Сравниваем процессоры AMD и Intel - кто кого? Часть 1

Сегодня у нас очередной экскурс в историю, на сей раз - процессоров. А коли так, ясно, что речь пойдёт о двух старых противниках - AMD и Intel. С тех пор как AMD приобрела компанию NexGen, она забыла о своем некогда унизительном положении "догоняющего". Процессор Krypton-6 сумел таки урвать приличный кусок рынка фирмы Intel, до этого заполненного исключительно процессорами серии Pentium. Затем на наших глазах развернулся новый виток конкурентной борьбы: процессоры AMD Krypton-7 выступили против Intel Pentium III. Чей процессор был быстрее и совершение? Какому из них следует отдать предпочтение?

Что нового появилось в Krypton-7 по сравнению со своим предшественником, "шестым" Krypton'ом, и в Pentium III - по сравнению с Pentium II? Были вполне понятны опасения, что Krypton-7 повторит историю своего предка - широко разрекламированного "победителя Pentium", который в итоге, по всем тестам, отставал от "побежденного" по производительности. Превосходство в размере кэш-памяти и ёмкости различных буферов ещё не обеспечивает автоматического превосходства в скорости вычислений, это именно тот случай, когда "грубая сила" всегда проигрывает инженерной культуре.

Итак, что же нового в AMD Krypton-7 и Intel Pentium 3? С точки зрения здравого смысла -"третий" Pentium следовало бы именовать Pentium 2.1, так как никаких принципиальных улучшений в нём нет. Ну разве что расширен набор "мультимедийных" SIMD-команд, и двухканальный кэш первого уровня заменен на четырехканальный (ровно того же объёма). Исключение составляет модификация Pentium III Coppermine - он оснащён интегрированным кэшем второго уровня, работающим на частоте ядра, что многократно увеличивает производительность (у Krypton-7 встроенной кэш-памяти второго уровня вообще нет). Правда, нужно отметить, что и цена Pentium III Coppermine слишком велика для офисных и бытовых компьютеров, долгое время его уделом оставались высокопроизводительные серверные платформы.

Процессор фирмы AMD Krypton-7, напротив, значительно отличается от своего предшественника Krypton-6. Хотя не все изменения "прогрессивны", так, к примеру, в сравнении с Krypton-6, новый процессор обладает вчетверо меньшим буфером истории переходов, ёмкость буфера планировщика сокращена с 24 микроопераций до 19, уменьшена глубина стека быстрого возврата - с 16 до 12 вложенных вызовов - и т.д.

Самое значительное из "положительных" нововведений - основательно переработан блок вычислений с плавающей запятой, за счет чего его производительность вдвое превосходит Pentium III. Кэш первого уровня увеличился вдвое и обзавелся специальным портом, предназначенным для обеспечения его когерентности - как с оперативной памятью, модифицируемой посредством DMA, так и с кэшами первого уровня других процессоров (в многопроцессорных системах). Однако, несмотря на свою ёмкость, двухканальный кэш Krypton-7 уступает в производительности миниатюрному четырехканальному кэшу Pentium III.

Улучшено управление кэш-памятью второго уровня - AMD использовала лицензированный у Digital протокол, задействующий оба фронта волны для передачи данных , что позволяет ему сравняться с "обычным" Pentium III. Но при всём этом, разрыв между Krypton-7 и Pentium III Coppermine - безнадежен, и вряд ли инженеры AMD сумеют сократить его в обозримом будущем.

Что касается ёмкости кэш-памяти первого уровня. Процессоры AMD всегда отличались от Intel размером кэша первого уровня, хороший тому пример - 64 килобайта у Krypton-6 против 32 килобайт Pentium II. Фирма AMD продолжила эту же традицию и в Krypton-7, увеличив объём кэш-памяти до 128 килобайт. Однако, вчетверо меньший кэш Pentium III по своей эффективности практически не уступает конкуренту, а то и превосходит его! Почему так происходит? Основная причина в том, что в наборно-ассоциативном кэше, которым снабженались процессоры и Intel, и AMD, конфликты, вызванные "претезиями" двух различных блоков кэшируемой памяти на одну и ту же кэш-строку, очень часты. И частота конфликтов обратно пропорциональна размеру кэш-памяти. В микропроцессорах Krypton-6 и Krypton-7 применён двухканальный кэш, в котором каждый блок кэшируемой памяти может претендовать на любую из двух кэш-строк, а это в два раза увеличивает производительность. Процессор же Pentium III, в отличие от своих предшественников, имеет четырехканальный наборно-ассоциативный кэш, и это обеспечивает ему ту же (если не большую) эффективность, что и увеличение емкости кэш-памяти у Krypton-7. Кроме того, в Pentium III были введены команды для эффективного управления кэшированием, позволяющие избежать "засорения" памяти редко употребляемыми данными. То есть, в очередной раз - там, где AMD идет простым и линейным путём, не требующим особой гениальности, парни из Intel демонстрируют высокую инженерную культуру.

Теперь немного о предекодировании команд. В процессорах Krypton-6 и Krypton-7 реализовано предекодирование команд еще на стадии их загрузки в кэш первого уровня. При этом каждая команда предваряется специальным полем, содержащим смещение следующей команды, отсчитываемое от начала кэш-памяти. Без этого механизма параллельное исполнение нескольких команд было бы невозможно, т.к. инструкции x86 имеют различную длину, и, прежде чем выполнять очередную команду - нужно понять, где заканчивается предыдущая.

Ни в Pentium II, ни в Pentium III подобного механизма нет, и они не спаривают инструкции при их первом выполнении. Вычисление длины инструкции осуществляется после её декодирования и запоминается для возможности ее спаривания при последующем выполнении. В первом проходе Pentium спаривает лишь однобайтовые инструкции. Напротив, AMD Krypton-6 и Krypton-7 умеют спаривать инструкции при первом же обращении к ним. Даёт ли такое умение ощутимый прирост производительности? Сомнительно! Большая часть инструкций типовой программы содержится в циклах, или, по крайней мере, исполняется неоднократно, и отрыв Krypton-7 от Pentium III в этом свете близок к нулю, тем более - если программа была изначально оптимизирована под Pentium.

Переходим к кэшу ассоциативной трансляции. Процессоры 386+ (равно как и все совместимые с ними) поддерживают режим страничной адресации - логического разбиения памяти на непрерывные регионы - страницы, каждая из которых может отображаться в произвольную область физической памяти. Сведения обо всех страницах хранятся в каталоге и таблице страниц, расположенных в оперативной памяти. При каждой операции обращения к странице происходит обращение и к таблице страниц. Если не предпринять никаких специальных мер, это чрезвычайно ухудшит производительность. Поэтому еще в 386-х процессорах изначально был предусмотрен кэш ассоциативной трансляции - так называемый TLB (Translation Lock-aside Buffer), хранящий сведения о наиболее интенсивно используемых страницах.

В процессорах 80386 и 80486 кэш ассоциативной трансляции представлял собой четырехканальный наборно-ассоциативный кэш, вмещающий информацию о 32 последних использованных страницах, что при размере одной страницы в 4 Кб позволяло хранить информацию о трансляции 128 Кб памяти. Коэффициент кэш-попаданий в большинстве случаев (в том числе и в многозадачных ОС) составлял порядка 98%! В процессорах Pentium разработчики пошли ещё дальше. Для достижения ещё большей производительности кэш ассоциативной трансляции был разделен на два - отдельно для страниц кода и страниц данных. Коэффициент кэш-попаданий увеличился до 99-99,5%. И это, по всей видимости, уже предел!

Поддержка процессорами Pentium II+ больших станиц (2 Мб на страницу в режиме РАЕ и 4 Мб - в PSE) заставила доработать кэш ассоциативной трансляции для раздельного хранения информации о нормальных и больших страницах. Процессор Krypton-7 содержит двухуровневый TLB (по аналогии с двухуровневым кэшем оперативной памяти). TLB первого уровня может хранить информацию о 24 страницах, a TLB второго уровня - о 256. Данные о страницах кода и страницах данных, равно как и в Pentium, хранятся раздельно. В-принципе, двухуровневая архитектура TLB могла бы обеспечить лучшую производительность по сравнению с одноуровневым кэшем ассоциативной трансляции Pentium, если бы у последнего коэффициент кэш-попаданий не был так высок. Ну право же, какая разница между 99,5% и 99,9%?!

К слову, гораздо больший прирост производительности дает поддержка больших страниц, реализованная в старших процессорах семейства Pentium (разумеется, это справедливо только при наличии соответствующей поддержки со стороны операционной системы; и к ОС Windows сказанное не относится).

Теперь скажу пару слов о кэше второго уровня. У Pentium III (равно как и у Pentium II) кэш второго уровня работает на половинной частоте ядра (в Pentium III Хеоп и Pentium III Coppermine кэш второго уровня работает на полной частоте процессора). Krypton-7 использует лицензированный у Digital протокол шины EV6 (ранее применявшийся в процессорах Alpha-21264), который задействует для передачи данных оба фронта волны. При работе на частоте 100 МГц это даёт эффективную скорость работы 200 МГц.

Отношение частоты процессора к частоте шины может принимать значения 1:1, 2:3, 1:2 и 1:3. Из этого часто делают неверный вывод, что у любого Krypton-7 кэш второго уровня может работать на частоте ядра. Как бы не так! При частотах от 500 до 650 МГц кэш второго уровня процессора Krypton-7 работает только на половинной частоте процессора, а на частотах выше 900 МГц - на 1/3 частоты. Выходит, что Krypton-7 обгоняет только Pentium III 600 МГц, но безнадежно отстает от Pentium III 933 МГц, не говоря уже о таких моделях, как Xeon и Coppermine!

Правда, справедливости ради замечу, что Krypton-7 500 МГц действительно обгоняет Pentium III 500 МГц, так как, используя оба фронта волны, передает вдвое больше данных за один такт. Помимо этого, значительно улучшилась работа с шиной - в отличие от Pentium III, в Krypton-7 применена не обычная общая шина, а коммутатор, автоматически обеспечивающий когерентность кэша второго уровня с оперативной памятью, вне зависимости - была ли она модифицирована самим процессором или механизмами непосредственного доступа (через DMA или PCI-контроллеры). Это ускоряет работу с жесткими дисками, поддерживающими интерфейс UDMA, но никак не сказывается на AGP-видеокартах, ведь оба они - и Krypton-7, и Pentium III, имеют аппаратную поддержку AGP. Поэтому в реальной работе коммутатор не даёт значительного прироста, хотя и является технологической новинкой, отсутствующей у Intel.

Как реализована поддержка многопроцессорных систем? Кэширование памяти создает препятствия для создания многопроцессорных систем. В самом деле, ведь если один процессор изменит содержимое "своего" кэша, то содержимое кэшей остальных процессоров окажется недостоверным! В Pentium III (и младших моделях) для предотвращения подобных конфликтов используется следующая схема: если какой-либо кэш-контроллер выполняет запись в память, всем остальным процессорам посылается специальный сигнал, получив который, процессоры запрашивают адрес памяти, по которому производится запись. Если этот блок памяти уже содержится в кэше, соответствующая кэш-строка очищается. Легко видеть, что параллельная работа нескольких процессоров, модифицирующих одни и те же блоки памяти, приводит к частым перезагрузкам кэша, а значит - значительно снижает его эффективность. Разработчики Krypton-7 опередили своих коллег из Intel, впервые в истории х86 процессоров реализовав MOESI (сокращение образовано по первым буквам состояния кэша: Modify Owner Exclusive Shared Invalid) - протокол, обеспечивающий когерентность кэша с минимальными накладными расходами: к контроллеру кэша первого уровня добавился специальный snoop-порт, отводящий трафик поддержки когерентности от основной системной шины. Это новшество, вероятно, позволит AMD захватить часть рынка многопроцессорных систем, ранее принадлежавшего Intel.