Развитие технологии SSE в новых процессорах Intel Prescott

Вступление


На проходившем недавно очередном Intel Developers Forum был официально представлен Prescott – новый процессор фирмы Intel, предназначенный для применения в персональных компьютерах. Он представляется как next generation processor - процессор нового поколения. Процессор выполнен по технологии 90 нанометров, что позволит достичь тактовых частот 4-5 GHz. Размер КЭШа второго уровня увеличен до 1MB - видимо, такое увеличение стало оправдано с точки зрения себестоимости благодаря новому техническому процессу. Размер КЭШа первого уровня так же удвоился, и тут заметно положительное влияние улучшенной технологии. Частота системной шины возросла до 800MHz. В целом, все блоки процессора претерпели небольшие улучшения. Но что этот вылизанный до блеска Pentium 4 несёт нового для разработчиков программного обеспечения? Увеличенный КЭШ – это, конечно, хорошо, надо несколько меньше думать о скорости чтения-записи данных из памяти, что часто является серьёзным лимитирующим производительность фактором. Но, всё равно, всех проблем не снимает, когда объём данных велик, увеличение КЭШа даже в два раза не принципиально.
Возросшая частота системной шины уверяет нас, что новый процессор от Intel будет достаточно сбалансированным, в нём не будет явно узких мест, тормозящих общую производительность системы. Как это, увы, было с некоторыми прошлыми процессорами, когда увеличение частоты не давало пропорционального прироста скорости.
Однако, такая вещь, как новый семислойный дизайн процессора мало интересует разработчиков ПО. Им гораздо важнее, какие новые процессорные команды стали доступны, какие оптимизационные приёмы предстоит применить для достижения максимальной производительности, или хотя бы, чтобы не было медленнее, чем на старом. Прошлый процессор фирмы Intel – Pentium 4 – требовал существенную оптимизацию программного обеспечения для увеличения производительности. На широком классе задач Pentium 4 проигрывал Pentium III не только равной частоты, но и значительно меньшей, до двух раз. Ниже мы детально разберёмся, почему это происходило, можно только сразу отметить, что глобальная причина состояла в необходимости существенного изменения ядра в целях наращивания частоты.
В целом, процессорное ядро не претерпело кардинальных изменений. Всё, что не любит Pentium 4 – в первую очередь, ветвления – всё досталось в наследство модификации на 90 нанометровом технологическом процессе. Даже несколько усилилось. В целях увеличения частоты глубина конвейера Prescott’а была увеличена, поэтому можно ожидать большие потери при ведущем к сбросу конвейера неправильном предсказании условных переходов.
Но есть и приятные новости, главная, это расширение набора процессорных инструкций. Введение MMX, SSE, SSE2 было приятно разработчикам программного обеспечения тем, что задавало им дополнительную работу по оптимизации программ. Иначе многие программы отказывались быстро выполняться. Однако, появившиеся в Prescott 13 новых инструкций существенно облегчают долю разработчиков.

MMX, 3DNow! SSE, SSE2 – принцип работы и оптимизации


Прежде, чем мы рассмотрим новые инструкции, совершим краткий обзор предыдущих SIMD-расширений набора процессорных команд, в первую очередь, оценим возможный прирост производительности при использовании того или иного набора инструкций. Те, кто хорошо знаком с предметом, могут пропустить данный раздел и сразу перейти к описанию новых команд Prescott.
Вот, иногда в тестовых обзорах говорится, что данная программа хорошо оптимизирована под SSE, и, благодаря этому, такой-то процессор показывает хорошие результаты. А что такое SSE? Само название говорит о природе этого набора инструкций. SSE – Streaming SIMD Extension. Потоковое SIMD расширение. А что такое SIMD? SIMD – Single Instruction Multiple Data. Одна инструкция – несколько данных-операндов.
Как обычно работают процессоры, как работали процессоры вроде 486, первого Pentium? Просто. Есть несколько ячеек-регистров, в них хранятся числа, в одной ячейке – одно число, процессор выполняет команды: сложить содержимое двух регистров, получится новое число, сравнить это число с содержимым третьего регистра, если больше, выполнить переход по списку инструкций. Однако, при таком подходе постепенно стали возникать трудности с увеличением производительности. Дело в том, что процессор не может начать выполнять следующую инструкцию до того, как будут вычислены предыдущими инструкциями нужные операнды. Можно поместить в процессор хоть сто блоков умножения, он считать быстрее не станет, всё время будет работать только один блок, а другие ждать результатов его вычислений. И, вот, придумали производить операции не с одной парой операндов, а сразу с несколькими парами. Как это выглядит на примере первого современного SIMD расширения в персональных компьютерах – MMX.

 Операция часть 3 часть 2 часть 1 часть 0 Регистр
  70 50 30 10 1 регистр
 +     
  80 60 40 20 2 регистр
 =     
  150 110 70 30 результат

Одновременно складывается не одна пара чисел, а четыре. Так же можно вычитать, умножать и т.п. сразу несколько пар операндов, каждый из которых находится в одном регистре. Введение этой технологии позволяет легко увеличить производительность процессора путём увеличения количества вычислительных модулей, без увеличения тактовой частоты. Более точно, не количество модулей увеличивается, а у них появляется способность работать сразу с несколькими парами операндов. Но для программирования это не важно.
Однако, для применения SIMD технологии, требуется поддержка на уровне самого кода программы. Процессор сам не может разместить несколько данных со сходными операциями в одном регистре. Программист должен, как говорится, ручками при написании программы явно указать, что процессор загружает такие-то данные из памяти в MMX регистры и производит с ними такие-то SIMD операции. Для этого он должен сам подготовить данные в памяти надлежащим образом, чтобы они хорошо «ложились» в регистры. В некоторых случаях возможно эффективное использование специальных SIMD-оптимизирующих компиляторов, которые автоматически создают код, использующий высокоэффективные SIMD-команды. Но, как правило, для эффективной компиляции код программы уже должен быть написан с соблюдением определённых правил.
Но не все алгоритмы в принципе могут быть хорошо адаптированы к SIMD расширениям. Попробуйте вычислить такое выражение – (a+b*c)*d. Меньше, чем тремя командами не обойтись. В те же три команды можно уложить нахождение суммы четырёх векторов вида (x,y,z,w). (x1+x2+x3+x4, y1+y1+y3+y4, z1+z2+z3+z4, w1+w2+w3+w4). При условии, что SIMD операции выполняются примерно с такой же скоростью, что и обычные, что реально, поскольку процессору всё равно нечего делать, можно увидеть многократное увеличение скорости при исполнении программ, хорошо оптимизированных под SIMD.
С точки зрения разработчика, можно выделить несколько типов SIMD-оптимизации. Прямая ручная оптимизация кода, высокоэффективная и достаточно трудоемкая. «Уговор» компилятора генерировать вместо обычного SIMD-код, что получается с переменным успехом. И использование предоставляемых производителями процессоров заранее оптимизированных библиотек функций, выполняющих стандартные распространённые операции. Понятно, что последний вариант наиболее предпочтителен.
Чем же отличаются SIMD расширения, чем MMX отличается от 3DNow! и SSE и т.п.? В первую очередь, они отличаются типами поддерживаемых данных, размером и количеством регистров и наборами возможных операций. Тип данных – это самое важное отличие, поскольку остальные параметры более-менее сходны у различных расширений.
Процессор работает с числами в нескольких форматах, в первую очередь, данные делятся на числа с плавающей десятичной точкой и целые числа. Разные задачи требуют различного представления данных. Второй параметр – это размер в байтах. Данные в виде чисел с плавающей точкой с некоторой точностью приближают произвольные вещественные числа, чем больше байт отводится на одно число, тем выше точность. Чем больше байт отводится на целое число, тем большему диапазону значений оно может принадлежать.

MMX


Расширение MMX появилось уже довольно давно и стало стандартным для персональных компьютеров. MMX расшифровывается как Multi Media Extensions. Расширение, предназначенное для работы с мультимедийными данными, с изображением и звуком.
В процессорах с технологией MMX есть 8 MMX регистров, каждый размером в 64 бит = 8 байт. MMX работает только с целыми числами; поддерживаются данные размером в 1, 2, 4 или 8 байт. То есть, один MMX регистр может содержать 8, 4, 2 или 1 операнд.

 байт7 байт6 байт5 байт4 байт3 байт2 байт1 байт0
 -128 127 100 70 60 -50 20 10

 слово3 слово2 слово1 слово0
 15000 -30000 20000 10000

И т.д. Данные, содержащиеся в MMX регистрах, можно покомпонентно складывать, умножать, вычитать, выполнять разнообразные специфические, необходимые для multi media приложений, операции, вроде сложения без переполнения, вычисления среднего арифметического и производить логические операции с битами. Побитовый and, or, xor. Делить, правда, нельзя, есть ещё ограничения. Но многие операции можно делать на порядок быстрее, даже больше. Однако, применение MMX в особенности требует специальной ручной оптимизации, никакой компилятор тут существенно не поможет. Под MMX, например, оптимизируются разнообразные кодеки аудио файлов, алгоритмы работы которых хорошо сочетаются с MMX. Причём, не вся программа целиком, а небольшая часть, выполняющая основную работу, и это обстоятельство упрощает оптимизацию.

SSE2 – целочисленные операции


Как это мы сразу перескочили с MMX, которое появилось бог знает когда, на новшество, пришедшее относительно недавно вместе с Pentium 4? Минули и SSE, и 3DNow! Просто SSE2 включает в себя две принципиально разные части – продолжение SSE и продолжение MMX. Продолжение SSE работает с вещественными числами, продолжение MMX – с целыми. В SSE2 регистры по сравнению с MMX удвоились, то есть, там стало помещаться не, например, 8 чисел, а 16. Поскольку скорость выполнения инструкций не изменилась, при оптимизации под SSE2 программа запросто получала двукратный прирост производительности. Надо отметить ещё следующее обстоятельство. Если программа уже была оптимизирована под MMX, то оптимизация под SSE2 даётся сравнительно легко в силу сходности системы команд.
В Athlon XP нет поддержки SSE2, поэтому можно было наблюдать интересную картину, когда сначала Pentium 4 при кодировании проигрывал Athlon XP, а после оптимизации кодека под SSE2 начинал выигрывать. Можно признать удачной идею расширения MMX в SSE2, поскольку под MMX оптимизируется не очень много программ, а те, которые оптимизируются, оптимизируются как следует. Следует отметить, что Intel отличилась в предоставлении разработчикам программного обеспечения почти бесплатно уже оптимизированных под SSE2 библиотек функций, выполняющих некоторые типовые для кодирования операции. И это обстоятельство сыграло немаловажную роль в «спасении» производительности процессоров Pentium 4.

SSE


Рассмотрим теперь набор инструкций SSE. Он появился вместе с процессорами Pentium III, но полностью «расцвёл» после выпуска Pentium 4, на котором использование SSE давало радикальную прибавку к производительности.
SSE интересно прежде всего тем, что оперирует с данными вещественного типа, которые используются в геометрических расчётах, то есть, приложениях трёхмерной графики, компьютерных играх, редакторах вроде 3DStudioMax, и многих других. С тех пор как в компьютерных играх вроде Quake текстурирование треугольников стало производиться при помощи видеоускорителей, большая надобность в целочисленных вычислениях отпала. На первое место вышла скорость операций с плавающей точкой, вроде перемножения вещественного вектора на вещественную матрицу. Посмотрим теперь, что же может предложить SSE разработчику.
При внедрении SSE процессор получил в дополнение к стандартным регистрам архитектуры x87 8 новых больших регистров размером по 128 бит, в каждом из которых содержится 4 32-битных вещественных числа.

 часть 3 часть 2 часть 1 часть 0 
     регистр 7
     регистр 6
     регистр 5
     регистр 4
     регистр 3
 * * * * регистр 2
 2 55.9 -1.9e10 1.567e-6 регистр 1
 0.7 -100.0 11.2 0.5 регистр 0

С четвёрками операндов можно покомпонентно производить следующие операции: сложить две четвёрки чисел, вычесть, перемножить, разделить. Вычислить одновременно 4 (обратных) квадратных корня, точно или приближённо. Ещё можно тасовать содержимое регистров, перекладывать данные из одних частей регистра в другие и производить некоторые другие аналогичные операции. Однако перемещение данных происходит не быстрее их сложения, так что эффективное использование SSE возможно только на подготовленных правильно упакованных данных.
И на процессоре Pentium 4 одна SSE операция выполняется столько же, сколько аналогичная обыкновенная. То есть при оптимизации можно получить прирост производительности в 4 раза. Если быть более точным, то даже несколько больше, за счёт использования новых больших регистров. Однако, далеко не все вычисления можно эффективно оптимизировать под SSE. Как пример «хорошей» задачи следует привести умножение четырёхмерной матрицы на четырёхмерный вектор. Ускорение четырёхкратное без особых затрат.
В первую очередь использование SSE позволяет современным процессорам при выполнении трансформации вершин треугольников, составляющих трёхмерную сцену, успешно соревноваться с самыми новейшими видеоускорителями. Другое дело, что у процессора много других задач, и лучше его по возможности разгрузить, чтобы он работал параллельно с видеоускорителем.
А что же Athlon XP? Собственно, одним из главных новшеств по сравнению с обычным Athlon было именно внедрение технологии SSE. Можно ожидать примерно двухкратное ускорение по сравнению с обычным кодом. Нужно, однако, отметить, что это не SSE реализовано у Athlon XP «хуже», а выполнение обычного кода происходит крайне эффективно. На одной частоте при использовании только SSE инструкций Athlon XP и Pentium 4 имеют сходную производительность. Athlon XP ещё имеет преимущество при выполнении условных переходов, так что совсем для него хорошо получается. Но Pentium 4 достигает более высоких частот, что, при использовании SIMD инструкций позволяет ему иногда значительно выигрывать в скорости.

3DNow! и 3 ошибки стратегии AMD


Рассмотрим теперь в некотором смысле конкурента SSE – фирменное расширение процессорных команд от AMD. Может быть, скорее правильнее назвать SSE конкурентом 3DNow! поскольку оно позже появилось. Напомню, 3DNow! впервые было реализовано в процессорах AMD k6-2-3D, конкурентах Intel Pentium II. Собственно, они и получили в силу введения 3DNow! приставку или, если угодно, постфикс 3D. Почему 3DNow! можно смело назвать конкурентом SSE? Дело не только в различной «фирменной» принадлежности этих расширений, в конце концов, они могли быть созданы и одним изготовителем процессоров. Оба этих расширения оперируют с вещественными числами и рассчитаны для применения в геометрических приложениях.
Итак, 3DNow! Это расширение во многом сходно с SSE, но так же имеет и значительные отличия. Регистров так же 8, но они размером не 128 бит, а 64. Соответственно, в них помещается не 4 числа, а только 2. Имеется аналогичный SSE набор арифметических операций с регистрами. Сложить-умножить-разделить две пары операндов и т.п. Есть и операции нахождения (обратного) квадратного корня, точные и более быстрые приближённые.

 часть 1 часть 0 
   регистр 7
   регистр 6
   регистр 5
   регистр 4
 * * регистр 3
 10000.1 6.7 регистр 2
 -0.5 1.5e7 регистр 1
 2.0 1.0 регистр 0

Как можно догадаться, на участках кода, полностью оптимизированных под 3DNow!, можно ожидать двухкратного прироста производительности за счёт одновременного выполнения операций с двумя парами операндов. Вроде бы менее перспективно, чем при использовании SSE. Действительно, если уж взяться оптимизировать, тем более, вручную, то лучше искать максимальный прирост производительности. Это обстоятельство вкупе с традиционно большей долей процессоров Intel на рынке стало одним из важных факторов, помешавших распространению 3DNow! среди разработчиков.
Конечно, «доля» фактора большей доли SSE-процессоров по влиянию на распространение 3DNow! максимальна. Простите за каламбур. Тем более, что прирост от использования SSE в Pentium III - прошлых конкурентах процессоров Athlon c 3DNow! - примерно вдвое ниже, чем на Pentium 4. И аналогичен эффекту от использования 3DNow! в AMD Athlon.
Однако, есть ещё одно важное отличие расширения 3DNow! Можно складывать между собой содержимое одного регистра. То есть, производить не только «вертикальные» операции, но и горизонтальные. Попробуйте выполнить на SSE одну из основных геометрических операций – скалярное произведение двух трёхмерных векторов. Ничего хорошего не получится. Элементы длинного SSE регистра просто не сложить, надо задействовать дополнительные регистры. Получится ничуть не быстрее, чем без всякого SSE, может, даже медленнее. А скалярное произведение очень часто встречается, в том числе, при нахождении нормы вектора, расстояния между точками. В этом отношении 3DNow! выглядит более предпочтительным благодаря большей гибкости.
Другое важное обстоятельство, говорящее в пользу 3DNow!, это возможность достаточно эффективной автоматической оптимизации средствами компилятора. SSE слишком громоздко - размеры регистров большие - для автоматической организации данных. На коде, наполненном вычислениями с плавающей точкой, можно было бы бесплатно получить примерно полуторный прирост производительности. Но AMD не озаботилась созданием такого компилятора, в то время, как Intel усиленно продвигала свой собственный оптимизирующий компилятор, поддерживающий SSE, и, естественно, ни о каком 3DNow! не знающий. Дело дошло до того, что AMD использовала Intel’овский компилятор для компиляции исходных кодов процессорных тестов Spec (www.spec.org). Своего нет, приходится для достижения максимальной производительности тестового приложения использовать наиболее эффективный компилятор.
Разработчики, естественно, не стремились лишний раз оптимизировать программы, и так полно хлопот с желательной оптимизацией под наиболее распространённые процессоры фирмы Intel. Получалось, что либо вообще не было SIMD-оптимизации, тогда процессор Athlon показывал себя отлично, особенно, по сравнению с Pentium 4. Либо была оптимизация под SSE(2), тогда Athlon условно говоря проигрывал.
Можно сказать, что AMD серьёзно просчиталось с 3DNow!, конечно, был некий локальный эффект при первой презентации. В основном, рекламный, поскольку из оптимизированных популярных приложений можно было отметить разве что OpenGL драйвера, в которых наблюдался существенный прирост скорости. Лучше бы они, раз уж не могут «пробить» своё расширение команд, строго реализовывали бы в своих процессорах все нововведения Intel. Реализовали бы вместо не используемого 3DNow! в Athlon XP систему команд SSE2, пусть даже не так эффективно. Золотой был бы процессор, почти без слабых мест.
Забегая вперёд, скажу, что, наконец, жизнь заставила AMD озаботиться компилятором для своих процессоров. Поскольку новая архитектура AMD x86-64 требует перекомпиляции существующих приложений для использования новых возможностей. В процессорах AMD Athlon 64 так же сохранилась 3DNow!, так что появилась возможность сравнить эффективность автоматической оптимизации под SSE и 3DNow! Будет, действительно, интересно.

SSE2


И, наконец, рассмотрим SSE2 - последнее из существующих сейчас на рынке x86-совместимых персональных компьютеров SIMD-расширение. Целочисленную составляющую мы уже обсудили ранее. Но в составе SSE2 появились не только инструкции для работы с целыми числами. Те же 8 больших 128-битных регистров теперь можно интерпретировать как содержащие не четыре 32-битных вещественных числа, а два 64-битных вещественных числа повышенной точности. Числа с повышенной точностью используются в тех случаях, когда вычисления с обычной точностью приводят к большим погрешностям. Все операции перенеслись с SSE, только работают не с четвёркой пар операндов, а с двойкой пар операндов. Правда, приближённое вычисление квадратного корня пропало, естественно.

 часть 1 часть 0 
   регистр 7
   регистр 6
   регистр 5
   регистр 4
   регистр 3
 * * регистр 2
 -1.5e10 0.00001 регистр 1
 1e-25 5.5 регистр 0

Получился как бы аналог 3DNow!, но без гибкой операции сложения между собой содержимого одного регистра.
А что насчёт скорости? Один научный сотрудник как-то спросил меня, как ему лучше оптимизировать свою расчётную функцию под SSE, он где-то услышал, что можно достичь ускорения на порядок. Я заинтересовался, какой тип данных он использует? Оказалось, что с повышенной точностью, чтобы лишний раз быть уверенным в корректности вычислений. Тогда ему следует использовать для оптимизации SSE2 и довольствоваться «всего лишь» двухкратным увеличением производительности.
Можно вывести простое правило для оценки производительности расчётных программ, если программа специально оптимизирована под SSE2, то будет более-менее быстро выполняться на процессорах Pentium 4 относительно Athlon XP. На самой высокой частоте перегонять. Если нет специальной оптимизации, будет проигрывать процессору Athlon XP с соответствующим рейтингом.

Новые инструкции Prescott


Настало время познакомиться с нововведениями в обычный набор команд, которые будут реализованы в процессоре Prescott, и оценить их полезность.
Прежде всего, а что мы, собственно, хотим? Я имею в виду в первую очередь разработчиков программного обеспечения.
Практически у всех разработчиков трёхмерных программ, в первую очередь, компьютерных игр, есть небольшая мечта: иметь удобную быструю библиотеку классов, представляющих геометрические объекты, вектора и матрицы.

class Vector
{
float x,y,z;

public:

inline friend Vector operator +(const Vector &a, const Vector &b); //сложение

inline float norm() const; // длина вектора
inline float norm2() const; // длина вектора в квадрате

inline friend float Dot(const Vector &a, const Vector &b); // скалярное произведение
};


Чтобы можно было просто писать a=b+c, а не муторно набирать a.x=b.x+c.x; a.y=b.y+c.y; a.z=b.z+c.z; И всегда на пути этого что-то находилось. Либо плохой компилятор так плохо компилировал вызовы функции сложения векторов, что накладные расходы производительности перевешивали удобства написания. Потом оказалось, что с помощью SSE удобно складывать вектора, а считать скалярное и векторное произведение совсем неудобно и медленно.
И вот случилось небольшое чудо, новые инструкции должны сделать существенно более лёгкой оптимизацию под SSE и SSE2, в том числе, и векторной математики.
Рассмотрим более предметно.
Самое главное: наконец появилась возможность довольно эффективно складывать элементы одного SSE регистра между собой.

  w2 z2 y2 x2
 сложить (haddps)    
  w1 z1 y1 x1
 получилось    
  z1+w1 x1+y1 z2+w2 x2+y2

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

  y2 x2
 ADDSUBPD  
  y1 x1
 =  
  y1+y2 x1-x2

Появление этой инструкции обязано природе умножения комплексных чисел. (a+bi)*(c+di)=a*c-b*d+(b*c+a*d)i Теперь значительно упростилась оптимизация под SSE2 вычислений с комплексными числами. По сути, SSE2 стало аналогично 3DNow!, только работает с числами с повышенной точностью.

Приведём таблицу новых инструкций.

 Инструкция Описание
 Горизонтальные операции с регистрами 
 HADDPS горизонтальное сложение содержимого SSE регистров
 HSUBPS горизонтальное вычитание содержимого SSE регистров
 HADDPD сложение двух элементов одного SSE2 регистра
 HSUBPD вычитание одного из другого двух элементов SSE2 регистра
 Во всех отношениях полезные команды, которых давно ждали разработчики, серьёзно упрощающие автоматическую и ручную оптимизацию. 
 Команды загрузки данных 
 MOVSHDUP загружает данные в регистр-приёмник, копируя только 2 и 4 32- битный элемент
 MOVSLDUP загружает данные в регистр-приёмник, копируя только 1 и 2 32-битный элемент
 MOVDDUP загружает данные в регистр-приёмник, копируя и удваивая первую половину регистра-источника
 Полезно для автоматической и ручной оптимизации. 
 Комбинированное сложение-вычитание 
 ADDSUBPS (x1,y1,z1,w1) * (x2,y2,z2,w2) =
(x1-x2,y1+y1,z1-z2,w1+w2)
 ADDSUBPD (x1, y1) * (x2, y2) =
(x1-x2, y1+y2)
 Значительно упрощает реализацию операций с комплексными числами. Помогает в автоматической оптимизации программ. 
 Специальная загрузка данных 
 LDDQU оптимизированная загрузка не выровненных данных
 Для относительно редкой тонкой ручной и автоматической оптимизации. 
 Преобразование данных 
 FISTTP Единственная новая x87 инструкция. Осуществляет быстрое преобразование содержимого стека сопроцессора к целому типу.
 Полезно для автоматической оптимизации программы при компиляции. Когда-то давным-давно эту инструкцию забыли добавить в стандартный набор x87 инструкций, и теперь это упущение восполнено. 
 Улучшение поддержки Hyper-threading 
 MONITOR/MWAIT Процессор отслеживает событие записи в указанный диапазон памяти и активирует «уснувший» поток.
 Упрощает оптимизацию программ и сервисов операционной системы для поддержки технологии Hyper-Threading и, в целом, multi-threading. 


Оценка нововведений и сравнение с AMD x86-64


Глядя на дополнения к системам команд, можно смело сказать, что набор инструкций процессора Prescott приобрёл некоторую стройность и завершённость. С ним можно жить длительное время, до появления радикальных нововведений. Жаль, количество регистров не увеличилось, но это было трудно сделать без потери совместимости в силу ограничений формата машинных инструкций архитектуры x86. Доделаны всякие приятные мелочи, вроде команды эффективной конвертации fisttp. Значительно упрощена автоматическая генерация SIMD-оптимизированного кода. У процессора, помимо неизвестной цены, может быть только одно слабое место – большая глубина конвейера и, следовательно, сильная «нелюбовь» к условным переходам. Однако, удлинение конвейера это, видимо, неизбежное зло перехода к более высоким частотам. Мне лично кажется, что это наиболее красивый процессор от Intel за последние годы. Мы сейчас не касаемся вопросов потребления мощности, требования к охлаждению - будем надеяться, что с этим проблем не будет. А что касается цены, есть основания полагать, что она не будет чрезмерной. Взглянем на объём КЭШа второго уровня – 1MB, что же тогда будет представлять соответствующий Celeron? Он, что, будет иметь 512KB КЭШа? Это будет уже не Celeron, а какой-то карманный монстр. Для многих приложений достаточно и 256KB КЭШа, так что имеется большой запас снижения себестоимости. Что и говорить, переход к новому технологическому процессу сулит большие выгоды.
Однако, есть одно обстоятельство, которое может резко поднять цену процессора. Будут ли у него достойные конкуренты? В лице такого конкурента нам хотелось бы видеть новый 64-битный процессор от AMD – Athlon 64. Про его технические характеристики уже много сказано, посмотрим, чем он может привлечь разработчиков.
AMD, наконец, реализовала поддержку SSE2, это приятно. Теперь у процессоров Intel не будет выигрыша только за счёт одного факта использования в программе SSE2. Как известно, Athlon 64 имеет несколько режимов работы – режим совместимости и 64-битный режим, открывающий, собственно, все возможности новой архитектуры AMD x86-64. В режиме совместимости новый процессор представляется с точки зрения разработчика ПО Pentium’ом 4 с прикрученным 3DNow! И лишенным некоторых специфических недостатков, как-то отвратительное исполнение не SIMD-оптимизированного кода и большая не любовь к ветвлениям. Можно смело сказать, что новый процессор AMD будет достойным соперником обычному Pentium 4, если, конечно, сможет добраться до ринга.
Можно даже определённо предсказать, что обычному процессору Pentium 4 потребуется очень существенное превосходство в частоте, чтобы сравняться по производительности с новым Athlon в интегральных тестах, охватывающих широкий спектр приложений. Да, собственно, хотя процессора ещё нет на рынке, полно тестов опытных образцов, где коэффициент производительности на частоту вдвое выше у Athlon 64.
Но что же предлагает разработчику новый эксклюзивный 64-битный режим? Помимо приятной перекомпиляции всего и вся, есть три главные вещи – удвоение количества регистров, 64-битная арифметика и расширенное за пределы 2GB виртуальное адресное пространство приложения. 64-битная арифметика приятна сама по себе, но на сегодняшний день имеет довольно узкую область применения в настольных системах. Подавляющему числу приложений вполне достаточно 32 бит. AMD нашла одно достаточно актуальное поле применения 64-битной целой арифметики – выполнение некоторых задач криптографии ускоряется в разы.
Расширение адресного пространства, безусловно, будет востребовано в недалёком будущем и в настольных приложениях, но в ближайшие годы персональных компьютеров с объёмом памяти больше 2GB будет, скорее всего, не очень много.
Осталось увеличение вдвое количества регистров. Появляются дополнительные возможности по хранению используемых переменных в регистрах без лишнего обращения к памяти. Можно будет более эффективно передавать при помощи регистров параметры функций. Причём, разработчику не нужно об этом беспокоится, все сделает оптимизирующий компилятор. Увеличение количества регистров так же позволит более эффективно размещать в коде независимые команды, что позволит более плотно загрузить процессор. И это тоже ляжет на выносливые плечи компилятора. Мне последнее представляется наиболее весомым преимуществом. Дело в том, что у современных процессоров есть большое количество так называемых буферов отложенной записи, которые позволяют достаточно эффективно организовать swap регистров без загрузки памяти. Данные, отправленные в память и тут же востребованные, не ожидаются из памяти, а мгновенно загружаются из буфера. У Prescott, кстати, количество таких буферов увеличено.
Да, можно смело предположить хорошие перспективы нового процессора AMD в серверных системах. Ветвления его не пугают, адресное пространство большое, регистров достаточно, умеет быстро шифровать. Всё это очень не плохо для сервера какой-нибудь базы данных. Относительно невысокая цена может сделать его идеальным в определённой нише.
Однако, рассмотрим его перспективы в вычислительно тяжёлых графических приложениях для персональных компьютеров, в первую очередь, в трёхмерных компьютерных играх. Собственно, из чего складывается производительность в современной игре? Из двух основных компонент: высокоуровневой интеллектуальной обработки сцены, отсечении невидимых примитивов при помощи портальной технологии и т.п., расчёта AI и физической модели. И вторая компонента – умение быстро затолкать данные в видеоускоритель. Огромная тактовая частота и высокая частота системной шины не должны подвести новый процессор от Intel в проблеме «кормления» VPU. С производительностью собственно игрового движка всё сложнее. На стороне AMD более лояльное отношение к ветвлениям, которые в коде такого сорта встречаются очень часто. Большое количество случайных ветвлений может нивелировать любое преимущество в частоте. И, наконец, должно проявить себя 3DNow!, достаточно удобный набор инструкций для оптимизации геометрических расчётов, которыми полны современные игры. Причём, поскольку для AMD Athlon 64 желательна перекомпиляция приложений для использования новых возможностей x86-64, оптимизация под 3DNow! будет производиться автоматически оптимизирующим компилятором, не требуя усилий разработчика.
Не появись в процессоре Intel Prescott новых удобных инструкций, существенно облегчающих оптимизацию, я бы отдал предварительное предпочтение процессору AMD, лишённому, на первый взгляд, откровенно слабых мест, присущих Pentium 4. А так – посмотрим, тяжело заранее сказать.
Корпорация Intel предоставляет разработчикам большой набор оптимизированных функций, они точно получат максимальное ускорение от применения новых инструкций. AMD тоже пошла по этому пути, анонсировав свой набор библиотек, полностью использующих возможности x86-64.
Мне вот что подумалось, ходили странные слухи, что Intel собирается внедрить в процессорах Prescott архитектуру AMD x86-64, особенно, в случае успеха оной. Это немного невероятно, такого никогда не было. Наоборот, почему бы AMD, раз уж она всё равно задерживает выпуск процессоров, не включить в новые Athlon дополнительные инструкции процессора Prescott? Тогда все оптимизированные для Intel библиотеки функций будут прекрасно работать на процессорах AMD. У процессора Prescott не будет никакого преимущества за счёт удобных инструкций. Тем более, что это на первый взгляд не очень сложно сделать, процессоры AMD выполняют же уже давно гибкие операции 3DNow! Скорее, можно было ожидать от AMD введения подобных «горизонтальных» операций с данными, в силу более подходящей архитектуры процессорного ядра, в первую очередь, меньшей частоты, большего количества исполняющих модулей и т.п.
Я надеюсь, что это значительное упущение будет исправлено, тем более что всё равно потом AMD придётся, как это всегда было, реализовывать в своих процессорах расширения SSE.