В свое врем появление у процессоров Pentium набора команд MMX было воспринято чуть ли не как революция. Правда, оказалось, что повышение производительности было не таким уж впечатляющим...
Чего же стоит ожидать от хваленых (компанией Intel) инструкций SIMD, поддерживаемых третьим поколением процессоров Pentium?

Рис. 1. Воссоздание трехмерного ландшафта с помощью инструкций KNI и без них
Как известно, процессор Pentium III (Katmai) поддерживает 70 новых команд (Katmai New Instructions - KNI.): инструкции SIMD (Single Instruction, Multiple Data - "одна инструкция, много данных", произносится сим-ди.) для работы с вещественными числами, управлени состоянием процессора и сохранения данных в кэше. Инструкции 3D-Now! и MMX нельзя использовать одновременно со "стандартными" командами математического сопроцессора. Приходилось заставлять ЦПУ выполнять специальную команду для перехода из одного состояния в другое. (Именно поэтому выполняющие интенсивные вычисления с вещественными числами игры, например, Quake, не оптимизированы для MMX.) Команды KNI лишены этого недостатка. Правда, нос вытянул - хвост увяз: одновременно выполнять инструкции KNI, MMX и команды процессора можно, введя новый режим работы ЦПУ - разрешив инструкциям x86 и MMX обращаться к регистрам KNI. В результате инструкции x86/MMX/KNI могут использовать данные совместно, и скорость вычислений будет намного выше. С другой стороны, чтобы воспользоватьс всеми возможностями инструкций KNI, ПО должно быть в состоянии активизировать нужный режим. Это значит, что существующие приложения надо переписывать (помните ситуацию с технологией MMX?).
Инструкции KNI позволяют выполнять вычисления с плавающей точкой намного эффективнее, ведь они могут одновременно работать с четырьмя числами стандартной точности. Строго говоря, инструкции 3DNow выполняют тот же объем работы, но за два такта. Однако процессор Katmai отличается от K6-2 тем, что он может одновременно работать с вещественными числами стандартной точности (с помощью инструкций SIMD) и двойной (с помощью «обычных» инструкций x87), при условии, что ПО сумело перевести процессор в нужный режим. Основные приложения, производительность которых можно намного увеличить, используя инструкции SIMD, это алгоритмы:
- расчета положения и освещения трехмерных объектов и текстур, оперирующие вещественными числами;
- оперативной обработки и высокоточной генерации сигналов - вещественными числами;
- растрирования видеоприложений - целыми числами;
- кодирования/декодирования - блоками данных;
- фильтрации - потоками данных большого объема.
На Web-узле компании Intel можно найти графические изображения, на которых видны преимущества использования инструкций SIMD в приложениях воссоздания трехмерных объектов (рис. 1). Инструкции KNI можно разделить на четыре логические категории - команды SIMD для работы с вещественными и с целыми числами, для управлени кэшированием и режимом работы процессора.
"Вещественные" команды KNI
Название команды |
Синтаксис |
Назначение |
addps, addss |
addps xmm1, xmm2 |
Сложение двух операндов и запись результата в первый из них. |
subps, subss |
subps xmm1, xmm2 |
Вычитание двух операндов и запись результата в первый из них. |
mulps, mulss |
mulps xmm1, xmm2 |
Умножение двух операндов и запись результата в первый из них. |
divps, divss |
divps xmm1, xmm2 |
Деление двух операндов и запись результата в первый из них. |
sqrtps, sqrtss |
sqrtps xmm1, xmm2 |
Вычисление квадратного корня второго операнда и запись результата в первый. |
rcpps, rcpss |
rcpps xmm1, xmm2 |
Вычисление обратной величины первого операнда и запись результата во второй. |
rsqrtps, rsqrtss |
rsqrtps xmm1, xmm2 |
Вычисление обратной величины квадратного корня первого операнда и запись результата во второй. |
maxps, maxss |
maxps xmm1, xmm2 |
Сравнение операндов. Большее значение записывается в первый операнд. |
minps, minss |
minps xmm1, xmm2 |
Сравнение операндов. Меньшее значение записывается в первый операнд. |
shufps |
shufps xmm1, xmm2, ìàñêà |
«Перетасовка» содержимого операндов в соответствии с заданной маской. |
unpcklps, unpckhps |
unpcklps, xmm1, xmm2 |
«Распаковка» младшей или старшей части операндов. Результат записывается в первый операнд. |
movaps, movups, movhps, movlps, movss |
movaps xmm1, [eax] movaps [edi], xmm2 |
Копирование данных, находящихся по адресу [eax] или в регистре xmm2, в регистр xmm1 или по адресу [edi]. |
movhlps, movlhps |
movhlps xmm1, xmm2 |
Пересылка старшей (младшей) части первого операнда в младшую (старшую) часть второго. |
movmskps |
movmskps eax, xmm1 |
Создание из самых старших битов вещественных элементов регистра XMM четырехбитовой маски в EAX. 28 старших битов EAX при этом обнуляются. |
cmpltps, cmpltss |
cmpltps xmm1, xmm2 |
единицами. В противном случае первый операнд заполняется нолями. Сравнение операндов «меньше чем». Если условие выполняется, первый операнд заполняется |
andps, andnps, orps, xorps |
andps xmm1, xmm2 |
Выполнение одной из логических операций с записью результата в первый операнд. |
comiss, ucomiss |
comiss xmm1, xmm2 |
Сравнение операндов и установка соответствующих флагов в регистре EFLAGS. |
cvtps2pi, cvttps2pi |
cvtps2pi mm1, xmm1 |
Преобразование вещественных чисел в целые с округлением или отбрасыванием дробной части. |
cvtss2pi, cvttss2pi |
cvtss2pi eax, xmm1 |
Преобразование вещественных чисел в целые с округлением или отбрасыванием дробной части. |
cvtpi2ps, cvttsi2ss |
cvtpi2ps xmm1, mm1 cvttsi2ss xmm1, eax |
Преобразование целого числа в вещественное. |
Команды SIMD FP для работы с вещественными числами

Рис. 2. Формат данных инструкций KNI, работающих с вещественными числами

Рис. 3. Пакетный режим выполнения команд KNI

Рис. 4. Скалярный режим выполнения комманд KNI
Набор инструкций KNI содержит группу универсальных команд SIMD FP, оперирующих с новым типом вещественных данных, для хранения которых предназначен набор новых регистров. За один такт инструкции SIMD FP успевают обработать четыре 32разрядных числа стандартной точности, используя для этого восемь новых 128-разрядных универсальных регистров с именами XMM0 - XMM7. Формат 32-разрядных данных стандартной точности с плавающей точкой соответствует стандарту IEEE754 (рис. 2). Стандартные сопроцессоры x87 представляют вещественные числа в виде 80-разрядных значений двойной точности, а процессоры Pentium III - в виде 32-разрядных значений стандартной точности. Поэтому в некоторых случаях, возможно, результаты работы ПО, будут мало отличаться, независимо от того, оптимизировано оно для инструкций KNI или нет. Команды KNI для вещественных чисел могут выполняться в одном из двух режимов - пакетном или скалярном. В пакетном режиме вычисления выполняются "вертикально", сразу над всеми четырьмя элементами 128-разрядных регистров (рис. 3). Мнемонические названия пакетных инструкций дополняются суффиксом ps (например, addps). В скалярном режиме вычисления выполняютс только над младшими элементами операндов (рис. 4). Старшие элементы операндов не участвуют в вычислениях (кроме команды присвоения). Мнемонические названия скалярных инструкций дополняются суффиксом ss (например, addss). В таблице 1 перечислены команды KNI для работы с вещественными числами, их назначение и синтаксис. Операндом - источником команды может быть один из регистров XMM или операнд в памяти. Целевым операндом должен быть один из регистров XMM.
Команды SIMD для работы с целыми числами
Команды KNI для целых чисел - это словно логическое расширение уже известного набора команд MMX (таблица 2). Как и команды MMX, инструкции SIMD оперируют с целыми числами, упакованными в 64-разрядном формате (рис. 5). Для хранения операндов используются те же "псевдорегистры" MMX c именами MM0MM7, которые располагаются в 80-разрядных регистрах сопроцессора. Но если раньше программисты были вынуждены обнулять регистры сопроцессора после выполнения инструкций MMX, чтобы в них не оставалось результатов целочисленных вычислений, то теперь (в соответствующем режиме процессора) об этом можно не заботиться. Мнемонические имена «целочисленных» инструкций SIMD содержат суффикс и префикс, указывающие на режим выполнения инструкции и тип операндов:
- Префикс p указывает на пакетный режим выполнения команды.
- Суффиксы b, w, d и q определяют тип данных, участвующих в вычислениях.
- Суффиксы s и u определяют наличие знака у операндов.
Команды SIMD для управления кэшированием
Технология SIMD определяет набор инструкций для управления кэшированием данных. Он позволяет повысить эффективность обращения к области временного хранения данных (кэшу) и уменьшить количество прямых обращений к памяти, а также выполнять предварительную загрузку данных в кэш (prefetch). В частности, инструкции оперативного сохранения (streaming store) позволяют записывать данные, которые будут нужны еще не скоро, сразу в память, не обновляя содержимое кэша. Инструкции movntq и movntps позволяют записывать в память содержимое регистров MMX и XMM, соответственно. Инструкция maskmovq позволяет выборочно, в соответствии с маской в самом старшем байте, записать байты регистра MMX в память. Регистр EDI содержит при этом целевой адрес для записи байтов. Для предварительного считывания областей памяти в кэш предназначены команды prefetcht0 (одновременное считывание в кэш первого и второго уровней), prefetcht1 и prefetcht2 (считывание только в кэш второго уровня), а также prefetchnta (считывание сразу в кэш первого уровня, минуя второй). Инструкция sfetch осуществляет принудительную синхронизацию данных в кэше и оперативной памяти. Это стоит сделать перед обработкой «потенциально опасных» фрагментов кода, которые могут вызвать уничтожение накопленных в кэше данных до того, как они попадут в оперативную память.
Команды SIMD для управления состоянием процессора
Рис. 5. Форматы данных

Рис. 6. Регистр MXCSR
Чтобы приложения и операционные системы могли использовать все поддерживаемые процессором Pentium III состояния, разработчики Intel создали несколько новых регистров и команд. Среди них регистр MXCSR (рис. 6), предназначенный для отслеживания исключений (exceptions), определения режима округления чисел и потери значимости. Флагами регистра MXCSR манипулируют с помощью команд ldmxcsr и stmxcsr. Перва предназначена для загрузки в регистр значений флагов, вторая - для выгрузки. Для того чтобы программное обеспечение корректно восприняло переход процессора из одного состояния в другое, информацию о содержимом регистров следует сохранить в памяти. Естественно, после перехода сохраненные значения нужно восстановить. Содержимое регистров XMM, FP/MMX и MXCSR помещается в область памяти объемом 512 байтов. Для сохранени и восстановления этой области используютс команды fxsave и fxrstor.
Полезные ресурсы Web
Воспользоваться преимуществами новых инструкций для "параллельных" вычислений можно только с помощью соответствующих средств разработки. Компания Intel предлагает компилятор C/C++, который распространяется в виде подключаемого к Microsoft Visual Studio модуля. Описание этого и других средств разработки можно найти на страницах Web-узла Intel (developer.intel.com/drg/Pentiumiii/tools/adr.htm). На этом же узле можно разжиться очень полезным обучающим мультимедийным приложением, посвященным возможностям инструкций SIMD и способам их использования.
"Целочисленные" команды KNI
Название команды |
Синтаксис |
Назначение |
pextrw |
pextrw eax, mm1, маска |
В соответствии с заданной маской копирует 16-битовое слово упакованных данных из регистра MMX в младшую часть 32-битового целочисленного регистра. |
pinsrw |
pinsrw mm1, eax, маска |
В соответствии с заданной маской копирует младшее слово 32-битового целочисленного регистра в регистр MMX. |
pminsw, pminub, pmaxsw, pmaxub |
pminsw mm1, mm2 |
Выполняют сравнение операндов, состоящих из слов со знаком или беззнаковых байтов. |
pmovmskb |
pmovmskb eax, mm1 |
Создает из самых старших битов восьми байтов регистра MMX маску в EAX. 24 старших бита EAX при этом обнуляются. |
pmulhuw |
pmulhuw mm1, mm2 |
Перемножает беззнаковые слова, из которых состоят 64-разрядные операнды, и записывает в первый операнд только старшие слова полученных произведений. |
pshurw |
pshurw mm1, mm2, маска |
В соответствии с заданной маской выбирает данные из второго операнда в первый. |
Сформулировав для любой поисковой машины критерий SIMD, вы найдете немало ссылок на самые разные описания и статьи о новой технологии. Особый интерес представляет обсуждение новых инструкций на игровых Web-узлах. Здесь можно встретить самые противоречивые мнения о том, что готовит нам новый набор инструкций.