У нас всегда: бесплатный софт, вэб-сервисы, ресурсы по раскрутке и дизайну, заработок и спонсоры, техническая документация, свежие номера журнала "Internet Zone"- все это на http://www.izone.com.ua/ 

6n_2_1.jpg (4473 bytes) Сергей МУРАШКИН
НОВЫЕ КОМАНДЫ PENTIUM_III

В свое время появление у процессоров Pentium набора команд MMX было воспринято чуть ли не как революция. Правда, оказалось, что повышение производительности было не таким уж впечатляющим...


    Чего же стоит ожидать от хваленых (компанией Intel) инструкций SIMD, поддерживаемых третьим поколением процессоров Pentium?

6n_2_2.jpg (7526 bytes)

Рис. 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 для работы с вещественными и с целыми числами, для управления кэшированием и режимом работы процессора.

Таблица 1

Вещественные команды 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 для работы с вещественными числами

6n_2_3.gif (3888 bytes)
Рис. 2. Формат данных инструкций KNI, работающих с вещественными числами
6n_2_4.gif (5039 bytes)
Рис. 3. Пакетный режим выполнения команд KNI
6n_2_5.gif (4319 bytes)
Рис. 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 для управления состоянием процессора

6n_2_6.gif (2383 bytes)
Рис. 5. Форматы данных
6n_2_7.gif (1443 bytes)
Рис. 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 и способам их использования.

Таблица 2

Целочисленные команды 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-узлах. Здесь можно встретить самые противоречивые мнения о том, что готовит нам новый набор инструкций.

Сергей МУРАШКИН,
К + П, smurash@comizdat.com

Использованы материалы: http://www.cp.comizdat.com

 


Copyright © 1999-2000гг. "Internet Zone" & Nik Romanov. nikspase@mail.ru, nikspase@hotmail.ru,  http://www.izone.com.ua/
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone" как на источник получения информации, при этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izone.com.ua/.