Команды sse ( начиная с pentium iii )


Содержание

Технологии и инструкции,
используемые в процессорах

Люди обычно оценивают процессор по количеству ядер, тактовой частоте, объему кэша и других показателях, редко обращая внимание на поддерживаемые им технологии.

Отдельные из этих технологий нужны только для решения специфических заданий и в «домашнем» компьютере вряд ли когда-нибудь понадобятся. Наличие же других является непременным условием работы программ, необходимых для повседневного использования.

Так, полюбившийся многим браузер Google Chrome не работает без поддержки процессором SSE2. Инструкции AVX могут в разы ускорить обработку фото- и видеоконтента. А недавно один мой знакомый на достаточно быстром Phenom II (6 ядер) не смог запустить игру Mafia 3, поскольку его процессор не поддерживает инструкции SSE4.2.

Если аббревиатуры SSE, MMX, AVX, SIMD вам ни о чем не говорят и вы хотели бы разобраться в этом вопросе, изложенная здесь информация станет неплохим подспорьем.

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

Аббревиатура образована от MultiMedia eXtensions (мультимедийные расширения). Это набор инструкций процессора, предназначенных для ускорения обработки фото-, аудио- и видеоданных. Разработан компанией Intel, используется в процессорах с 1997 года и на момент внедрения обеспечивал до 70% прироста производительности. Сегодня вам вряд ли удастся встретить процессор без поддержки этой технологии. Подробнее.

3DNow!

Технология впервые была использована в 1998 году в процессорах AMD и стала развитием технологии MMX, значительно расширив возможности процессора в области обработи мультимедийных данных. Ее презентацию совместили с выходом игры Quake 2, в которой 3DNow! обеспечивала до 30% прироста быстродействия. Но широкого распространения 3DNow! не получила. Сейчас она заменена другими технологиями и в новых процессорах не используется. Подробнее.

Аббревиатура от от Streaming SIMD Extensions. SIMD расшифровывается как Single Instruction Multiple Data, что значит «одна инструкция — множество данных».

SSE впервые использована в 1999 году в процессорах Pentium ІІІ и стала своеобразным ответом компании Intel на разработанную компанией AMD технологию 3DNow!, устранив некоторые ее недостатки. SSE применяется процессором, когда нужно совершить одни и те же действия над разными данными и обеспечивает осуществление до 4 таких вычислений за 1 такт, чем обеспечивает существенный прирост быстродействия.

SSE используется огромным числом приложений. Процессоров без ее поддержки сегодня уже не встретишь. Подробнее.

Этот набор инструкций был разработан компанией Intel и впервые интегрирован в процессоры Pentium 4 (2000 — 2001 гг.).

Поддержка инструкций SSE2 является обязательным условием использования современного программного обеспечения. В частности, без этого набора команд не будут работать популярные браузеры Google Chrome и Яндекс-браузер. На компьютере без SSE2 также невозможно использовать Windows 8, Windows 10, Microsoft Office 2013 и др. Подробнее.

Набор из 13 инструкций, разработанный компанией Intel и впервые использованный ею в 2004 г. в процессорах с ядром Prescott. Позволяет процессору более эффективно использовать 128-битные регистры SSE.

Инструкции SSE3 заметно упростили ряд DSP- и 3D-операций. Практическая польза от них больше всего ощущается в приложениях, связанных с обработкой потоков графической информации, аудио- и видеосигналов. Подробнее.

SSSE 3

Сокращение от «Supplemental SSE3», что значит «Дополнительный SSE3». Это набор дополнительных инструкций процессора, внедренных компанией Intel в 2006 году в продолжение развития предыдущих наборов команд SSE. По сути, это был четвертый по счету набор инструкций SSE. Но в Intel решили иначе, возможно, посчитав его лишь незначительным дополнением к предыдущему пакету.

Инструкции SSSE3 необходимы для нормальной работы многих современных приложений, в частности программ распознавания речи, используемых алгоритм DNN (Deep Neural Network). Подробнее.

SSE 4.1

Набор инструкций, разработанный компанией Intel. Используется в процессорах с 2006 года.

SSE 4.1 в значительной степени повышает эффективность процессора при компиляторной векторизации обработки данных, работе с трехмерной графикой и в играх, обработке изображений, видеоинформации и другого мультимедийного контента. Подробнее.

SSE 4.2

Набор инструкций процессора, включающий 7 команд обработки строк, подсчета CRC32 и популяции единичных бит, а также работы с векторными примитивами. Впервые использован компанией Intel в 2008 году.

На практике инструкции SSE 4.2 повышают производительность при сканировании вирусов, поиска текста, строковой обработки библиотек (ZLIB, базы данных и др.), обработки 3D информации. Подробнее.

SSE4A (SSE128)

Набор инструкций, используемый в процессорах AMD с 2007 года. Включает всего 4 команды (инструкции, ускоряющие подсчет числа нулевых/единичных битов, комбинированные инструкции маскирования и сдвига, а также скалярные инструкции потоковой записи).

Аналогичные инструкций есть также в наборе SSE 4 (4.1, 4.2.) от Intel, который является значительно более эффективным (в общей сложности 54 инструкции), см. выше. Подробнее.

Расширение системы команд процессора, разработанное в 2008 году компанией Intel с целью ускорения работы и повышения уровня защищенности программ, использующих алгоритм шифрования AES (Advanced Encryption Standard).

В США и некоторых других странах AES является официальным стандартом шифрования. Используется операционной системой Windows и многими популярными программами для защиты конфиденциальной информации (The Bat!, TrueCrypt и др.). Если процессор поддерживает инструкции AES, прирост производительности приложений, использующих этот алгоритм, может достигать 1200 %. Подробнее.

Аббревиатура образована от Advanced Vector Extensions. Это расширение системы команд процессора, разработанное компанией Intel в 2008 году. Оказывает большое влияние на мультимедийные и вычислительные возможности процессора.

Кроме набора новых инструкций, эта технология предусматривает двукратное увеличение размеров SIMD-регистров процессора, благодаря чему в интенсивных вычислениях за каждый такт он может обрабатывать до 2 раз больше информации.

Значительный прирост производительности наблюдается при работе с фото-, видеоконтентом, решении научных задач и др.). Но для этого требуется также использование соответствующей операционной системы и адаптированного программного обеспечения. В Windows поддержка AVX появилась, только начиная с Windows 7 SP1. Подробнее.

AVX 2


Набор инструкций, ставший развитием технологии AVX. Впервые использован в 2013 г. в процессорах Intel на ядре Haswell.

Практическая польза для рядового пользователя — прирост производительности при работе с видео, фотографиями, звуком, а также с программами, использующими алгоритмы распознавания голоса, лиц, жестов (при условии использования соответствующего программного обеспечения). Подробнее.

Набор инструкций процессора, ускоряющий операции умножения-сложения чисел с плавающей запятой. Аббревиатура FMA образована от англ. Fused Multiply-Add, что переводится как умножение-сложение с однократным округлением.

Операции умножения-сложения очень распространены и играют важную роль в работе вычислительной техники. Особенно, когда речь идет о цифровой обработке аналоговых сигналов (двоичное кодирование видео, звука и другие подобные операции). В связи с этим, поддержка инструкций FMA внедрена не только в центральные процессоры, но и в графические процессоры многих современных видеокарт. Подробнее.

NX (XD), EVP

Технологии NX (XD) и EVP, не смотря на разные названия, являются одним и тем же — важным компонентом любого современного процессора, обеспечивающим повышенную защиту компьютера от вирусов и хакерских атак, основанных на механизме переполнения буфера.

Названия NX (No Xecute) и XD (eXecute Disable) характерны для процессоров Intel. EVP (Enhanced Virus Protection) — для процессоров AMD. Подробнее.

AMD64, Intel64

AMD64, Intel64, EM64T, x86-64, x64, Hammer Architecture — все эти термины обозначают одно и то же — 64-битную архитектуру центрального процессора, разработанную и внедренную в 2003 году компанией AMD. До этого процессоры были 32-битными.

Для обычного пользователя главным преимуществом 64-битного процессора является возможность использования в компьютере 64-битного программного обеспечения и большого объема оперативной памяти (теоретически, до 16777216 терабайт). Максимальное количество оперативной памяти, которое может адресовать 32-битный процессор — 4 ГБ. Подробнее.

XOP (от англ. eXtended operation — «расширенная операция») — это набор инструкций микропроцессора, повышающих его быстродействие при работе с мультимедиа, а также при решении научных задач.

Инструкции XOP впервые использованы в 2011 году в процессорах AMD архитектуры Bulldozer. В этот набор входит несколько различных типов векторных инструкций, большинство из которых являются целочисленными. Однако, есть среди них также инструкции для перестановки чисел с плавающей запятой и инструкции экстракции дробной части. Подробнее.

HT, SMT

В процессорах Intel технология многопоточности называется Hyper-Threading (HT), в процессорах AMD — Simultaneous MultiThreading (SMT).

Кроме названий, эти технологии отличаются еще и многими аспектами реализации. Однако, суть их одинакова. HT и SMT повышают эффективность использования вычислительных возможностей процессора (в среднем, на 20 — 30 %) за счет параллельного выполнения каждым его ядром двух потоков вычислений. Подробнее.

Аппаратная виртуализация (VT-x, VT-d, AMD-V)

Аппаратная виртуализация значительно расширяет возможности работы компьютера с виртуальными машинами, позволяя использовать гостевые операционные системы изолировано от основной (хостовой) системы.

Кроме того, появляется возможность «проброса» в гостевую систему устройств ввода-вывода, подключаемых к компьютеру через шину PCI и некоторые другие шины (видеокарты, звуковые карты, сетевые адаптеры и др.). Подробнее.

Turbo Boost, Turbo Core

Turbo Boost и Turbo Core — похожие по своей сути технологии, автоматически повышающие тактовую частоту процессора выше номинальной, когда в этом есть необходимость. Turbo Boost используется в процессорах Intel, Turbo Core — в процессорах AMD. В целом, они обеспечивают значительный прирост быстродействия в большинстве приложений.

Несмотря на одинаковое предназначение, Turbo Boost и Turbo Core существенно отличаются. Подробнее.

TXT (англ. Trusted eXecution Technology — технология доверенного выполнения) — разработанная компанией Intel и используемая в ее процессорах технология, обеспечивающая аппаратную защиту компьютера от вредоносных программ.

Это абсолютно новая концепция безопасности. В ее основе лежит эксклюзивное использование части ресурсов компьютера каждым конкретным приложением. Она охватывает практически все подсистемы компьютера: выделение памяти, мониторинг системных событий, связь чипсета и памяти, хранение данных, устройства ввода (клавиатура и мышь), вывод графической информации. Подробнее.

TSX (Transactional Synchronization eXtensions) — набор инструкций многоядерного процессора, разработанный компанией Intel, который повышает эффективность взаимодействия ядер между собой при осуществлении общего доступа к одним и тем же данным и, в конечном счете, увеличивает общую производительность компьютера. Подробнее.

SpeedStep, PowerNow!, Cool’n’Quiet

Принцип действия этих технологий состоит в автоматическом снижении частоты процессора, а вследствие — потребляемой им энергии и выделяемого тепла, в периоды, когда компьютер не выполняет никаких задач или когда сложность этих задач является незначительной.

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

Memory Protection Extensions — технология, обеспечивающая повышенную защиту компьютера от вирусных и других угроз, использующих механизм переполнения буфера.

Процессор получает возможность дополнительно проверять границы буферов стека и буферов кучи перед доступом к памяти, чтобы приложение, обращающееся к памяти, имело доступ лишь к той ее области, которая ему назначена. Вследствие этого хакеру или вредоносной программе становится значительно сложнее через память «подставлять» процессору свой код. Подробнее.

Software Guard Extensions (SGX) — набор инструкций, разработанный компанией Intel и используемый в ее процессорах, начиная с архитектуры Skylake.

SGX позволяет организовать защищённые участки кода и данных (так называемые «анклавы»), обеспечивающие высокий уровень защиты работающих с ними программ от вредоносных приложений и хакерских атак. Подробнее.

Intel SHA

Intel Secure Hash Algorithm extensions (SHA) — набор инструкций процессора, разработанных компанией Intel для ускорения работы приложений, используемых алгоритмы шифрования SHA. Включает 7 инструкций, 4 из которых ускоряют работу SHA-1, остальные 3 — SHA-256. Ускорение может составлять 150-200 % и более (в зависимости конкретного приложения).

Эти алгоритмы используются в системах контроля версий и электронных подписей, а также для построения кодов аутентификации. SHA-1 является более распространённым и применяется в самых разнообразных криптографических программах. Подробнее.


Advanced Configuration and Power Interface (ACPI) — стандарт, разработанный компаниями HP, Intel, Microsoft, Phoenix и Toshiba. Используется в компьютерной технике с 1996 года, постепенно дополняясь и совершенствуясь. Определяет общий подход к управлению питанием и обеспечивает взаимодействие между устройствами компьютера, его операционной системой и BIOS/UEFI в целях снижения уровня энергопотребления.

Стандарт ACPI предусматривает несколько режимов работы процессора. В зависимости от модели, они могут поддерживаться процессором в полном объеме или только какая-то их часть. Подробнее.

System Management Mode (SMM) — режим, при котором процессор приостанавливает исполнение любого кода (в том числе и операционной системы) и запускает специальную программу, хранящуюся в зарезервированной области оперативной памяти.

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

Dynamic Front Side Bus Frequency Switching (DFFS) — одна из технологий снижения энергопотребления компьютерных систем. Она позволяет операционной системе компьютера, в зависимости от нагрузки, которую он испытывает, понижать частоту системной шины FSB, что влечет за собой также и снижение частоты процессора. Подробнее.

SenseMI

SenseMI — технология, разработанная компанией AMD и впервые использованная в процессорах серии Ryzen. Она представляет собой комплекс из нескольких взаимосвязанных компонентов, обеспечивающих оптимальную производительность и энергоэффективность путем прогнозирования программного кода, а также динамического изменения частоты процессора в соответствии с решаемыми задачами в каждый конкретный момент времени (Smart Prefetch, Neural Net Prediction, Pure Power, Precision Boost, Extended Frequency Range).

Некоторые из упомянутых компонентов, по сути, являются усовершенствованными вариантами технологий, используемых в предыдущих моделях процессоров AMD. Подробнее.

AMD CoolCore

AMD CoolCore — технология, осуществляющая временное отключение неиспользуемых блоков процессора в целях снижения энергопотребления и выделяемого им тепла. Впервые использована в процессорах Phenom. Подробнее.

AMD CoolSpeed

AMD CoolSpeed — технология, разработанная компанией AMD для защиты процессора от перегрева путем понижения частоты и напряжение питания. Подробнее.

AMD Enduro

AMD Enduro — технология, позволяющая переключать компьютер, оснащенный двумя графическими решениями, с одного устройства на другое, в зависимости от решаемых в конкретный момент времени задач. Поддерживается видеокартами AMD, а также гибридными (имеющими встроенное графическое ядро) процессорами этой компании.

Ценной Enduro является для мобильных компьютеров, поскольку позволяет существенно экономить заряд аккумулятора. Подробнее.

BMI, TBM, ABM

Bit Manipulation Instructions (BMI) — наборы инструкций, используемые в процессорах Intel и AMD для ускорения операций, связанных с манипулированием битами.

Операции манипулирования битами чаще всего используется приложениями, предназначенными для низкоуровневого управления устройствами, обнаружения и исправления ошибок, оптимизации, сжатия и шифрования данных. Использование BMI программами значительно ускоряет эти операции (иногда в несколько раз), однако, код программ становится более сложным для написания программистами. Подробнее.

DPM, DDPM

Dynamic Power Management и Dual Dynamic Power Management- технологии автоматического динамического изменения питания процессора. В совокупности с другими энергосберегающими технологиями, они значительно повышают его энергоэффективность, снижая уровень питания в периоды простоя или незначительных загрузок и повышая его, когда это необходимо. Подробнее.

SMEP, SMAP

Supervisor Mode Execution Prevention и Supervisor Mode Access Prevention — технологии, разработанные компанией Intel для защиты компьютера от хакерских атак и других угроз, использующих так называемый «режим супервизора». Подробнее.

F16C — набор инструкций, используемый в процессорах архитектуры x86 для ускорения преобразований между двоичными числами половинной точности (16 bit) и стандартными двоичными числами с плавающей запятой одинарной точности (32 bit).

F16C используется как в процессорах AMD, так и в процессорах Intel, значительно расширяя их возможности в плане работы с мультимедийными данными, а также данными других типов. Подробнее.

Форматы данных и команды их обработки процессоров Pentium III, Pentium IV (стр. 1 из 18)

Форматы данных и команды их обработки процессоров Intel Pentium III и Intel Pentium IV

В курсовой работе представлены данные о всевозможных форматах данных процессоров Intel Pentium III и Intel Pentium IV. Так же приведён полный список команд, реализованных в данных процессорах, с кратким описанием для обработки этих данных. Более подробно рассмотрены команды блока XMM: SSE – Pentium III и SSE2 – Pentium IV, с подробным описанием: для данных команд предсталено описание синтксиса, правила построения машинного кода, принцип действия (для многих команд принцип действия для большей наглядности представлен графически, ввиде схем), воздействие команды на флаги процессора, возможные возникаемые исключения во время выполнения команд.

1. Типы данных процессоров Pentium 3, Pentium 4 . . . . . . . . . . . . 5

2. Математический сопроцессор x87 . . . . . . . . . . . . . . . . 9

3. Технология MMX . . . . . . . . . . . . . . . . . . . . . . . 12

4. Расширение SSE и SSE2 — блок XMM. . . . . . . . . . . . . . . 14

5. Команды обработки данных. . . . . . . . . . . . . . . . . . . 15

6. Команды блока XMM (SSE и SSE2) . . . . . . . . . . . . . . . . 31


6.1. Команды блока XMM (SSE – Pentium 3) . . . . . . . . . . . 33

6.2. Команды блока XMM (SSE2 – Pentium 4) . . . . . . . . . . . 50

Целью курсовой работы «Форматы данных и команды их обработки процессоров Intel Pentium III, Intel Pentium IV» является поытка наиболее полно показать отличительные признаки современных процессоров. В данной работе автор не ставил себе задачу расписать каждую команду обработки данных существующую в данных процессорах, ведь отличительная особенность процессоров Intel заключается в том, что наиболее поздние модификации полностью совместимы с более ранними. В процессорах Intel Pentium III, Intel Pentium IV нововведением стали два блока XMM (eXtended MultiMedia) – это SSE (Streaming SIMD (Single Istruction Multiply Data) Extensions) – введённый в процессоре Intel Pentium III и SSE2 – введённый в процессоре Intel Pentium IV. Поэтому базовые команды (существующие в более ранних модификациях Intel, начиная с 8086), команды математического сопроцессора (FPU) и команды блока MMX, появившегося впервые в процессоре Intel Pentium рассмотрены лишь обзорно. Так как расширение 3Dnow! блока MMX, введённое фирмой AMD в процессорах K6-2 на данный момент отсутствует в процессорах фирмы Intel, то оно совсем не рассмотренно в курсовой работе.

1. Типы данных процессоров Pentium 3, Pentium 4

История 32-разрядных процессоров Intel Pentium 3 и Pentium 4 началась с процессора Intel386. Он вобрал в себя все черты своих 16-разрядных предшественников 8086/88 и 80286 для обеспечения совместимости с громадным объемом программного обеспечения, существовавшего на момент его появления. Процессоры могут оперировать с 8-,16- и 32-битными операндами, строками байт, слов и двойных слов, а также с битами, битовыми полями и строками бит.

Рассматриваемые процессоры непосредственно поддерживают (используют в качестве операндов) знаковые и беззнаковые целые числа, строки байт, цифр и символов, битовые строки, указатели и числа с плавающей точкой. В семействе х86 принято, что слова записываются в двух смежных байтах памяти, начиная с младшего. Адресом слова является адрес его младшего байта. Двойные слова записываются в четырех смежных байтах, опять-таки начиная с младшего байта, адрес которого и является адресом двойного слова. Этот порядок называется Little-Endian Memory Format. В других семействах процессоров применяют и обратный порядок — Big-Endian Memory Format, в котором адресом слова (двойного слова) является адрес его старшего байта, а младшие байты располагаются в последующих адресах. Для взаимного преобразования форматов слова имеется инструкция XCHG, двойного слова — BSWAP (процессор 486 и выше).

Илон Маск рекомендует:  Что такое код swffill >skewyto

На рис.1. приведены форматы данных, обрабатываемых целочисленным блоком АЛУ всех 32-разрядных процессоров:

• Бит (Bit) — единица информации. Бит в памяти задается базой (адресом слова) и смещением (номером бита в слове).

• Битовое поле (Bit Field) — группа до 32 смежных бит, располагающихся не более чем в 4 байтах.

• Битовая строка (Bit String) — набор смежных бит длиной до 4 Гбит.

• Байт (Byte) — 8 бит.

• Числа без знака: байт/слово/двойное/учетверенное слово (Unsigned Byte/ Word/Double Word/Quade Word), 8/16/32/64 бит.

• Целые числа со знаком: байт/слово/двойное/учетверенное слово (Integer Byte/ Word/Double Word/Quade Word). Единичное значение самого старшего бита (знак) является признаком отрицательного числа, которое хранится в дополнительном коде.

• Двоично-десятичные числа (BCD — Binary Coded Decimal):

• 8-разрядные упакованные (Packed BCD), содержащие два десятичных разряда в одном байте;

• 8-разрядные неупакованные (Unpacked BCD), содержащие один десятичный разряд в байте (значение бит 7:4 при сложении и вычитании несущественно, при умножении и делении они должны быть нулевыми).

• Строки байт, слов и двойных слов (Bit String, Byte String, Word String, Double Word String) длиной до 4 Гбайт.

• длинный указатель (48 бит) — 16-битный селектор (или сегмент) и 32-битное смещение;

• короткий указатель — 32-битное смещение;

• просто указатель (32 бит, единственный тип указателя для 8086 и 80286) • 16-битный селектор (или сегмент) и 16-битное смещение.

16-разрядные процессоры из приведенных типов данных не поддерживают учетверенные слова всех типов, битовые поля и строки, строки двойных слов, короткие и длинные указатели.

Числа в формате с плавающей точкой и упакованные 80-битные BCD-числа обрабатываются блоками FPU процессоров класса 486 и выше, а также сопроцессорами 8087/287/387. Упакованные 64-битные и 128-битные данные обрабатываются процессорами с ММХ и SSE. Форматы данных, обрабатываемых блоками FPU/MMX и ХММ, представлены на рис. 2.

• Действительные числа в формате с плавающей точкой:

• одинарной точности (Single Precision), 32 бит — 23 бит мантисса, 8 бит порядок;

• двойной точности (Double Precision), 64 бит — 52 бит мантисса, 11 бит порядок;

• повышенной точности (Extended Precision), 80 бит — 64 бит мантисса, 15 бит порядок.

• Двоично-десятичные 80-битные упакованные числа (18 десятичных разрядов и знак).

• Упакованные действительные числа одинарной точности в формате с плавающей точкой, обрабатываются блоком ХММ.

• Упакованные целые числа, знаковые и беззнаковые, обрабатываются блоком ММХ:

• упакованные байты (Packed byte) — восемь байт;

• упакованные слова (Packed word) — четыре слова;

• упакованные двойные слова (Packed doubleword) — два двойных слова;

• учетверенное слово (Quadword) — одно слово.

Для 16-разрядных процессоров, естественно, все форматы чисел для блоков ММХ и ХММ недоступны.


Рассмотрим более подробно блоки, упомянутые выше: блоки FPU, MMX, XMM, которые архитектуре процессоров IA-32 х86 держатся особняком. Они присутствуют не но всех процессорах и даже по схемотехнической реализации являются пристройками к центральному процессору с его набором обычных целочисленных регистров. Данные блоки предназначены для ускорения вычислений.

Математический сопроцессор (FPU) позволяет использовать несколько форматов чисел с плавающей точкой — FP-форматов. Операции с такими числами можно выполнять и программно средствами целочисленного процессора, но сопроцессор выполняет эти операции анпаратно во много раз быстрее. Блок ММХ дает ускорение целочисленных вычислений за счет одновременной обработки одной инструкцией целого пакета чисел (пар чисел). Блок ХММ комбинирует эти два приема — обрабатывает одной инструкцией пакет из четырех чисел в FP-формате. Исторически первым появился сопроцессор. Блок ММХ ради совместимости с операционными системами «спрятали» в то же оборудование, что и сопроцессор. Так появился комбинированный блок, называемый блоком FP/MMX, или FPU/ММХ. И толысо блок ХММ, используемый расширением SSE процессоров Pentium 3, стал полностью новым самостоятельным набором регистров.

Рис. 1. Типы данных, обрабатываемых целочисленным АЛУ

Рис. 2. Типы данных, обрабатываемых блоками FPU/MMX и ХММ

При отсутствии математического сопроцессора прикладная программа все-таки может использовать инструкции FPU, но для этого операционная система должна поддерживать эмуляцию сопроцессора. Эмулятор сопроцессора — это программа-обработчик прерывания от сопроцессора или исключения #NM, которая должна «выловить» код операции, сопроцессора, определить местонахождение данных и выполнить требуемые вычисления, используя целочисленную арифметику центрального процессора. Понятно, что эмуляция будет выполняться во много раз медленнее, чем те же действия, выполняемые настоящим сопроцессором. Тем не менее эмуляция позволяет все-таки пользоваться прикладными программами, требующими вычислений с плавающей точкой. Для этого в регистре CR0 должно быть установлено сочетание флагов ЕМ = 1, МР = 0. Для эмуляции в IBM PC обычно устанавливают значение NE = 0. Тогда каждая инструкция FPU автоматически будет вызывать эмулятор генерацией запроса прерывания (а не исключения #NM, как было бы при NE = 1).

Эмуляция для блоков ММХ и ХММ не предусматривается — эти блоки предназначены для ускорения вычислений в приложениях реального времени, и выполнять их с крайне низкой скоростью эмуляции было бы просто бессмысленно. Если установлен флаг эмуляции ЕМ = 1, то любая инструкция ММХ вызовет исключение #UD.

2. Математический сопроцессор x87

Математический сопроцессор предназначен для расширения вычислительных возможностей центрального процессора — выполнения арифметических операций, вычисления основных математических функции (тригонометрических, экспоненты, логарифма) и т. д. В разных поколениях процессоров он назывался по-разному — FPU (Floating Point Unit — блок чисел с плавающей точкой) или NPX (Numeric Processor eXtension — числовое расширение процессора).

Сопроцессор поддерживает семь типов данных: 16-, 32-, 64-битные целые числа; 32-, 64-, 80-битные числа с плавающей точкой и 18-разрядные числа в двоично-десятичном формате. Формат чисел с плавающей точкой соответствует стандартам IEEE 754 и 854. Применение сопроцессора повышает производительность вычислений в сотни раз. С программной точки зрения сопроцессор и процессор выглядят как единое целое. В современных (486+) процессорах FPU располагается на одном кристалле с центральным процессором. Для процессоров 386 и ниже сопроцессор был отдельной микросхемой, подключаемой к локальной нише основного процессора. В любом случае сопроцессор исполняет только свои специфические команды, а всю работу по декодированию инструкции и доставке данных осуществляет CPU. Сопроцессор может выполнять вычисления параллельно с центральным процессором, независимо от переключения задач в защищенном режиме. Как и основной процессор, сопроцессор может работать в реальном или защищенном режиме и переключать разрядность- 16 или 32. Переключение режимов влияет на формат отображения регистров сопроцессора в оперативной памяти, при этом формат используемых внутренних регистров не изменяется.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

SSE3 (Streaming SIMD Extensions 3)

SSE3 (англ. Streaming SIMD Extensions 3 ) или раннее неофициальное название PNI (англ. Prescott New Instruction ) — третья версия SIMD-расширения Intel, потомок SSE, SSE2 и MMX. Представляет собой набор из 13 дополнительных команд, позволяющих процессору более эффективно использовать 128-битные регистры SSE. Впервые представлено 2 февраля 2004 года в ядре Prescott процессора Pentium 4. В 2005 AMD предложила свою реализацию SSE3 для процессоров Athlon 64 (ядра Venice, San Diego и Newark).

Набор SSE3 содержит 13 инструкций: FISTTP (x87), MOVSLDUP (SSE), MOVSHDUP (SSE), MOVDDUP (SSE2), LDDQU (SSE/SSE2), ADDSUBPD (SSE), ADDSUBPD (SSE2), HADDPS (SSE), HSUBPS (SSE), HADDPD (SSE2), HSUBPD (SSE2), MONITOR (нет аналога в SSE3 для AMD), MWAIT (нет аналога в SSE3 для AMD). В частности, SSE3 содержит:

  • инструкцию по преобразованию чисел с плавающей точкой в целые числа;
  • три инструкции дублирования данных;
  • инструкцию загрузки невыровненных переменных;
  • две инструкции одновременного сложения/вычитания;
  • четыре инструкции горизонтального сложения/вычитания;
  • две инструкции синхронизации потоков.

Наиболее заметное изменение — возможность горизонтальной работы с регистрами. Если говорить более конкретно, добавлены команды сложения и вычитания нескольких значений, хранящихся в одном регистре. Эти команды упростили ряд DSP- и 3D-операций. Существует также новая команда для преобразования значений с плавающей точкой в целые без необходимости вносить изменения в глобальном режиме округления.

Содержание

Инструкции SSE3

  • ADDSUBPD (Add Subtract Packed Double).
  • ADDSUBPS (Add Subtract Packed Single).
  • HADDPD (Horizontal Add Packed Double).
  • HADDPS (Horizontal Add Packed Single).
  • HSUBPD (Horizontal Subtract Packed Double).
  • HSUBPS (Horizontal Subtract Packed Single).
  • FISTTP — преобразование вещественного числа в целое с сохранением целочисленного значения и округлением в сторону нуля.
  • LDDQU — загрузка 128bit невыровненных данных из памяти в регистр xmm, с предотвращением пересечения границы строки кеша.

История изменений в технологии Streaming SIMD Extensions

Потоковая передача расширений SIMD (SSE)

SSE был разработан для замены Технологии MMX™. Это расширилось в поколениях Процессоров Intel® для включения в SSE2, SSE3/SSE3S и SSE4. Каждая итерация принесла новые команды и увеличила производительность.

Потоковая передача расширений SIMD 2 (SSE2)


SSE2 расширяет набор инструкций SSE с целью полностью вытеснить MMX. Набор SSE2 добавил 144 новые команды к SSE, в котором было только 70 команд.

Потоковая передача расширений SIMD 3 (SSE3)

SSE3 является развитием технологий MMX, SSE, SSE2, представляет собой набор из 13 дополнительных команд, позволяющих процессору более эффективно использовать 128-битные регистры SSE.

Потоковая передача расширений SIMD 4 (SSE4)

Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из USWC памяти, множество инструкций для упрощения векторизации программ компиляторами. Кроме того, в SSE4.2 добавлены инструкции обработки строк 8/16 битных символов, вычисления CRC32, POPCNT. Впервые в SSE4 регистр xmm0 стал использоваться как неявный аргумент для некоторых инструкций.

Команды sse ( начиная с pentium iii )

SSE3 — Saltar a navegación, búsqueda SSE3 (también conoc >Wikipedia Español

SSE3 — SSE3, also known by its Intel code name Prescott New Instructions (PNI), is the third iteration of the SSE instruction set for the IA 32 architecture. Intel introduced SSE3 in early 2004 with the Prescott revision of their Pentium 4 CPU. In April … Wikipedia

SSE3 — SSE3, connu aussi par son nom de code interne Prescott New Instructions (PNI), est la troisième génération du jeu d instructions SSE pour l architecture IA 32. Intel a introduit SSE3 au début de l année 2004 avec la version Prescott de son… … Wikipédia en Français

SSE3 — Die Streaming SIMD Extensions 3 (kurz SSE3) ist die zweite Erweiterung des SSE Befehlssatzes. Sie ist auch unter dem Intel Codenamen Prescott New Instructions (PNI) bekannt, da sie zuerst bei der Prescott Variante des Pentium 4 ab Frühjahr 2004… … Deutsch Wikipedia

Streaming SIMD Extension 3 — SSE3 SSE3, connu aussi par son nom de code interne Prescott New Instructions (PNI), est la troisième génération du jeu d instructions SSE pour l architecture IA 32. Intel a introduit SSE3 au début de l année 2004 avec la version Prescott de son… … Wikipédia en Français

Comparison of AMD processors — This list is incomplete; you can help by expanding it. Colors of the processor code names indicate same core. Archi tecture Family Code Name Model Group Speed (MHz) Socket Process (nm) Cores FSB/HT (MHz) Cache (KiB) Memory Controller … Wikipedia

List of Intel Core 2 microprocessors — The Core 2 brand refers to Intel s x86/x86 64 microprocessors with the Core microarchitecture targeted at the consumer and business markets (except servers) above Pentium. The Core 2 solo branch covered single core CPUs for notebook computers,… … Wikipedia

Intel Core 2 Duo (Mobil) — Intel Core 2 Duo Intel Core 2 Duo Emblem Produktion: seit 2006 Produzent: Intel Prozessortakt: 1,06 GHz … Deutsch Wikipedia

Список микропроцессоров Intel — Информация в этой статье или некоторых её разделах устарела. Вы можете помочь проекту … Википедия

List of AMD Athlon 64 microprocessors — This list is incomplete; you can help by expanding it. The Athlon 64 microprocessor from AMD is an eighth generation CPU targeted at the consumer market. Contents 1 Single core desktop processors 1.1 Athlon 64 … Wikipedia

Низкоуровневая оптимизация параллельных алгоритмов или SIMD в .NET

В настоящее время огромное количество задач требует большой производительности систем. Бесконечно увеличивать количество транзисторов на кристалле процессора не позволяют физические ограничения. Геометрические размеры транзисторов нельзя физически уменьшать, так как при превышении возможно допустимых размеров начинают проявляться явления, которые не заметны при больших размерах активных элементов — начинают сильно сказываться квантовые размерные эффекты. Транзисторы начинают работать не как транзисторы.
А закон Мура здесь ни при чем. Это был и остается законом стоимости, а увеличение количества транзисторов на кристалле — это скорее следствие из закона. Таким образом, для того, чтобы увеличивать мощность компьютерных систем приходится искать другие способы. Это использование мультипроцессоров, мультикомпьютеров. Такой подход характеризуется большим количеством процессорных элементов, что приводит к независимому исполнение подзадач на каждом вычислительном устройстве.

Параллельные методы обработки:

Источник параллелизма Ускорение Усилие программиста Популярность
Множество ядер 2х-128х Умеренное Высокая
Множество машин 1х-Бесконечность Умеренно-Высокое Высокая
Векторизация 2х-8х Умеренное Низкая
Графические адаптеры 128х-2048х Высокое Низкая
Сопроцессор 40х-80х Умеренно-высокое Чрезвычайно-низкая

Способов для повышения эффективности систем много и все довольно различны. Одним из таких способов является использование векторных процессоров, которые в разы повышают скорость вычислений. В отличие от скалярных процессоров, которые обрабатывают один элемент данных за одну инструкцию (SISD), векторные процессоры способны за одну инструкцию обрабатывать несколько элементов данных (SIMD). Большинство современных процессоров являются скалярными. Но многие задачи, которые они решают, требуют большого объема вычислений: обработка видео, звука, работа с графикой, научные расчеты и многое другое. Для ускорения процесса вычислений производители процессоров стали встраивать в свои устройства дополнительные потоковые SIMD-расширения.
Соответственно при определенном подходе программирования стало возможным использование векторной обработки данных в процессоре. Существующие расширения: MMX, SSE и AVX. Они позволяют использовать дополнительные возможности процессора для ускоренной обработки больших массивов данных. При этом векторизация позволяет добиться ускорения без явного параллелизма. Т.е. он есть с точки зрения обработки данных, но с точки зрения программиста это не требует каких-либо затрат на разработку специальных алгоритмов для предотвращения состояния гонки или синхронизации, а стиль разработки не отличается от синхронного. Мы получаем ускорение без особых усилий, почти совершенно бесплатно. И в этом нет никакой магии.

Что такое SSE?

SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций. SSE включает в архитектуру процессора восемь 128-битных регистров и набор инструкций. Технология SSE была впервые введена в Pentium III в 1999 году. Со временем, этот набор инструкций был улучшен путем добавления более сложных операций. Восемь (в x86-64 — шестнадцать) 128-битовых регистров были добавлены к процессору: от xmm0 до xmm7.

Изначально эти регистры могли быть использованы только для одинарной точности вычислений (т.е. для типа float). Но после выхода SSE2, эти регистры могут использоваться для любого примитивного типа данных. Учитывая стандартную 32-разрядную машину таким образом, мы можем хранить и обрабатывать параллельно:

  • 2 double
  • 2 long
  • 4 float
  • 4 int
  • 8 short
  • 16 char

Если же использовать технологию AVX, то вы будете манипулировать уже 256-битными регистрами, соответственно больше чисел за одну инструкцию. Так уже есть и 512-битные регистры.

Сначала на примере С++ (кому не интересно, можете пропустить) мы напишем программу, которая будет суммировать два массива из 8 элементов типа float.

Пример векторизации на С++

Технология SSE в С++ реализована низкоуровневыми инструкциями, представленные в виде псевдокода, которые отражают команды на ассемблере. Так, например, команда __m128 _mm_add_ps(__m128 a, __m128 b ); преобразуется в инструкцию ассемблера ADDPS операнд1, операнд2. Соответственно команда __m128 _mm_add_ss(__m128 a, __m128 b ); будет преобразовываться в инструкцию ADDSS операнд1, операнд2. Эти две команды делают почти одинаковые операции: складывают элементы массива, но немного по-разному. _mm_add_ps складывает полностью регистр с регистром, так что:

  • r0 := a0 + b0
  • r1 := a1 + b1
  • r2 := a2 + b2
  • r3 := a3 + b3

При этом весь регистр __m128 и есть набор r0-r3. А вот команда _mm_add_ss складывает только часть регистра, так что:

  • r0 := a0 + b0
  • r1 := a1
  • r2 := a2
  • r3 := a3

По такому же принципу устроены и остальные команды, такие как вычитание, деление, квадратный корень, минимум, максимум и другие операции.
Для написания программы можно манипулировать 128-битовыми регистрами типа __m128 для float, __m128d для double и __m128i для int, short, char. При этом можно не использовать массивы типа __m128, а использовать приведенные указатели массива float к типу __m128*.
При этом следует учитывать несколько условий для работы:

  • Данные float, загруженные и хранящиеся в __m128 объекте должны иметь 16-байтовое выравнивание
  • Некоторые встроенные функции требуют, чтобы их аргумент был типа констант целых чисел, в силу природы инструкции
  • Результат арифметических операций, действующих на два NAN аргументов, не определен

Такой вот маленький экскурс в теорию. Однако, рассмотрим пример программы с использованием SSE:

  • alignas(#) — стандартный для С++ переносимый способ задания настраиваемого выравнивания переменных и пользовательских типов. Используется в С++11 и поддерживается Visual Studio 2015. Можно использовать и другой вариант — __declspec( align( #)) declarator. Данные средства для управления выравниванием при статическом выделении памяти. Если необходимо выравнивание с динамическим выделением, необходимо использовать void* _aligned_malloc(size_t size, size_t alignment);
  • Затем преобразуем указатель на массив a и b к типу _m128* при помощи reinterpret_cast, который позволяет преобразовывать любой указатель в указатель любого другого типа.
  • После динамически выделим выравненную память при помощи уже упомянутой выше функции _aligned_malloc(N*sizeof(float), 16);
  • Количество необходимых байт выделяем исходя из количества элементов с учетом размерности типа, а 16 это значение выравнивания, которое должно быть степенью двойки. А затем указатель на этот участок памяти приводим к другому типу указателя, чтобы с ним можно было бы работать с учетом размерности типа float как с массивом.

Таким образом все приготовления для работы SSE выполнены. Дальше в цикле суммируем элементы массивов. Подход основан на арифметике указателей. Так как a_simd, b_simd и с — это указатели, то их увеличение приводит к смещению на sizeof(T) по памяти. Если взять к примеру динамический массив с, то с[0] и покажут одинаковое значение, т.к. с указывает на первый элемент массива. Инкремент с приведет к смещению указателя на 4 байта вперед и теперь указатель будет указывать на 2 элемент массива. Таким образом можно двигаться по массиву вперед и назад увеличивая и уменьшая указатель. Но при этом следует учитывать размерность массива, так как легко выйти за его пределы и обратиться к чужому участку памяти. Работа с указателями a_simd и b_simd аналогична, только инкремент указателя приведет к перемещению на 128-бит вперед и при этом с точки зрения типа float будет пропущено 4 переменных массива a и b. В принципе указатель a_simd и a, как и b_simd и b указывают соответственно на один участок в памяти, за тем исключением, что обрабатываются они по-разному с учетом размерности типа указателя:

Илон Маск рекомендует:  Шаблон сайта строительство HTML, CSS, 1 страница

Теперь понятно почему в данном цикле такие изменения указателей. На каждой итерации цикла происходит сложение 4-х элементов и сохранение полученного результата по адресам указателя с из регистра xmm0 (для данной программы). Т.е. как мы видим такой подход не изменяет исходных данных, а хранит сумму в регистре и по необходимости передает ее в нужный нам операнд. Это позволяет повысить производительность программы в тех случаях, когда необходимо повторно использовать операнды.
Рассмотрим код, который генерирует ассемблер для метода _mm_add_ps:

Как видно из кода, одна инструкция addps обрабатывает сразу 4 переменных, которая реализована и поддерживается аппаратно процессором. Система не принимает никакого участия при обработке этих переменных, что дает хороший прирост производительности без лишних затрат со стороны.
При этом хотел бы отметить одну особенность, что в данном примере и компилятором используется инструкция movups, для которой не требуются операнды, которые должны быть выровнены по 16-байтовой границе. Из чего следует, что можно было бы не выравнивать массив a. Однако, массив b необходимо выровнять, иначе в операции addps возникнет ошибка чтения памяти, ведь регистр складывается со 128-битным расположением в памяти. В другом компиляторе или среде могут быть другие инструкции, поэтому лучше в любом случае для всех операндов, принимающих участие в подобных операциях, делать выравнивание по границе. Во всяком случае во избежание проблем с памятью.
Еще одна причина делать выравнивание, так это когда мы оперируем с элементами массивов (и не только с ними), то на самом деле постоянно работаем с кэш-линиями размером по 64 байта. SSE и AVX векторы всегда попадают в одну кэш линию, если они выравнены по 16 и 32 байта, соответственно. А вот если наши данные не выравнены, то, очень вероятно, нам придётся подгружать ещё одну «дополнительную» кэш-линию. Процесс этот достаточно сильно сказывается на производительности, а если мы при этом и к элементам массива, а значит, и к памяти, обращаемся непоследовательно, то всё может быть ещё хуже.


Поддержка SIMD в .NET

Впервые упоминание o поддержке JIT технологии SIMD было объявлено в блоге .NET в апреле 2014 года. Тогда разработчики анонсировали новую превью-версию RyuJIT, которая обеспечивала SIMD функциональность. Причиной добавления стала довольно высокая популярность запроса на поддержку C# and SIMD. Изначальный набор поддерживаемых типов был не большим и были ограничения по функциональности. Изначально поддерживался набор SSE, а AVX обещали добавить в релизе. Позже были выпущены обновления и добавлены новые типы с поддержкой SIMD и новые методы для работы с ними, что в последних версиях представляет обширную и удобную библиотеку для аппаратной обработки данных.

Такой подход облегчает жизнь разработчика, который не должен писать CPU-зависимый код. Вместо этого CLR абстрагирует аппаратное обеспечение, предоставляя виртуальную исполняющую среду, которая переводит свой ​​код в машинные команды либо во время выполнения (JIT), либо во время установки (NGEN). Оставляя генерацию кода CLR, вы можете использовать один и тот же MSIL код на разных компьютерах с разными процессорами, не отказываясь от оптимизаций, специфических для данного конкретного CPU.
На данный момент поддержка этой технологии в .NET представлена в пространстве имен System.Numerics.Vectors и представляет собой библиотеку векторных типов, которые могут использовать преимущества аппаратного ускорения SIMD. Аппаратное ускорение может приводить к значительному повышению производительности при математическом и научном программировании, а также при программировании графики. Она содержит следующие типы:

  • Vector — коллекцию статических удобных методов для работы с универсальными векторами
  • Matrix3x2 — представляет матрицу 3х2
  • Matrix4х4 — представляет матрицу 4х4
  • Plane — представляет трехмерную плоскость
  • Quaternion — представляет вектор, используемый для кодирования трехмерных физических поворотов
  • Vector )>)> представляет вектор указанного числового типа, который подходит для низкоуровневой оптимизации параллельных алгоритмов
  • Vector2 — представляет вектор с двумя значениями одинарной точности с плавающей запятой
  • Vector3 — представляет вектор с тремя значениями одинарной точности с плавающей запятой
  • Vector4 — представляет вектор с четырьмя значениями одинарной точности с плавающей запятой

Класс Vector предоставляет методы для сложения, сравнения, поиска минимума и максимума и многих других преобразований над векторами. При этом операции работают с использованием технологии SIMD. Остальные типы также поддерживают аппаратное ускорение и содержат специфические для них преобразования. Для матриц это может быть перемножение, для векторов евклидово расстояние между точками и т.д.

Пример программы на C#

Итак, что необходимо для того, чтобы использовать данную технологию? Необходимо в первую очередь иметь RyuJIT компилятор и версию .NET 4.6. System.Numerics.Vectors через NuGet не ставится, если версия ниже. Однако, уже при установленной библиотеке я понижал версию и все работало как надо. Затем необходима сборка под x64, для этого необходимо убрать в свойствах проекта «предпочитать 32-разрядную платформу» и можно собирать под Any CPU.
Листинг:

С общей точки зрения что С++ подход, что .NET довольно схожи. Необходимо преобразование/копирование исходных данных, выполнить копирование в конечный массив. Однако, подход с C# намного проще, многие вещи сделаны за Вас и Вам только остается пользоваться и наслаждаться. Нет необходимости думать о выравнивании данных, заниматься выделением памяти и делать это статически, либо динамически с определенными операторами. С другой стороны у вас больший контроль над происходящим с использованием указателей, но и больше ответственности за происходящее.
А в цикле происходит все так, как и в цикле в С++. И я не про указатели. Алгоритм расчета такой же. На первой итерации мы заносим первые 4 элемента исходных массивов в структуру aSimd и bSimd, затем суммируем и сохраняем в конечном массиве. Затем на следующей итерации заносим следующие 4 элемента при помощи смещения и суммируем их. Вот так все просто и быстро делается. Рассмотрим код, который генерирует компилятор для этой команды var cSimd = aSimd + bSimd:

Отличие от С++ версии только в том, что тут складываются оба регистра, в то время как там было складывание регистра с участком памяти. Помещение в регистры происходит при инициализации aSimd и bSimd. В целом данный подход, если сравнивать код компиляторов С++ и .NET не особо отличается и дает приблизительно равную производительность. Хотя вариант с указателями будет работать все равно быстрее. Хотелось бы отметить, что SIMD-инструкции генерируются при включенной оптимизации кода. Т.е. увидеть их в дизассемблере в Debug не получится: это реализовано в виде вызова функции. Однако в Release, где включена оптимизация, вы получите эти инструкции в явном(встроенном) виде.

Расширение набора команд SSE4 для архитектуры Intel

Intel уже очень давно использует практику создания специализированных наборов команд в процессорах Intel для повышения производительности специфических ресурсоемких приложений. Одним из первых примеров подобного рода разработок был набор команд для вычислений с плавающей запятой, впервые реализованный в процессоре 8086 в далеком 1978 году. Более современный пример — технология Intel MMX для одновременной обработки данных большего объема, загружаемых в специальные регистры MMX. Эта технология ускоряла работу мультимедийных приложений, например, графики, игр, видео, а также многих других.

В микроархитектуре P6 корпорация Intel впервые представила набор команд Streaming SIMD Extensions (SSE), реализованный в процессоре Pentium III. Набор команд SSE расширял возможности MMX и позволял одновременно выполнять команды SIMD над четырьмя упакованными элементами данных с плавающей запятой одинарной точности. Для этого использовались специальные 128-разрядные регистры (названные XMM0-XMM7).

На базе микроархитектуры NetBurst (процессор Pentium 4) был разработан набор команд SSE2, который стал расширением SSE (и MMX). SSE2 предназначался для повышения степени параллелизма при выполнении команд MMX и SSE. Поддерживалась обработка 128-разрядных целочисленных данных и упакованных данных с плавающей запятой двойной точности. В целом, набор команд SSE2 содержал 144 дополнительные инструкции, которые обеспечивали повышение производительности самых разных приложений.

В процессоре Pentium 4, выпускаемом по 90 нм производственной технологии, был реализован набор команд SSE3. Он включал 13 дополнительных инструкций SIMD, по сравнению с SSE2.

Следующим этапом стал набор команд Supplemental SSE3 на базе микроархитектуры Intel Core. Он реализован в процессорах Xeon 5100 (для серверов и рабочих станций) и Intel Core 2 Duo (для мобильных и настольных ПК). Supplemental SSE3 содержит 32 новых кода операций, включая выравнивание и умножение-суммирование.

SSE4 — самое масштабное и значительное расширение архитектуры Intel ISA со времени появления SSE2, то есть со времен процессора Pentium 4. Набор команд SSE4 включает множество новых инновационных инструкций, которые можно разделить на две основные категории: 1) векторизирующий компилятор и мультимедиа-ускорители; 2) ускорители обработки строк и текстовой информации. Новые инструкции дополняют обширную архитектуру набора команд (instruction set architecture, ISA) Intel 64.

Векторизирующие компиляторные элементы включают в себя усовершенствованные целочисленные операции и операции с плавающей точкой, поддержку упакованных операций DWORD и QWORD, новые операции с плавающей точкой одинарной точности, быстрые регистровые операции, оптимизированные операции памяти и др. Компиляторы, использующие эти векторизирующие элементы, помогут реализовывать их преимущества в широком диапазоне приложений, включая мультимедиа-приложения (например, скорость кодирования видео можно увеличить в полтора раза), а также серверные приложения для высокопроизводительных вычислений.

Команды обработки строк и текста позволяют увеличить производительность приложений для обработки данных, поиска и других текстовых приложений. Они включают в себя набор команд сравнения упакованных строк, который позволяет производить несколько операций сравнения и поиска за одну инструкцию.

Ниже приведён полный список процессорных команд по подгруппам.

Различные упакованные операции. Процессорные команды DWORD, PMULLD, PMULDQ. Новая поддержка четырех знаковых (и без знака) 32×32 битных умножений за одну инструкцию, а также знаковые умножения вида 32×32->64. Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких, как C и Fortran).

Скалярное произведение с плавающей точкой. Процессорные команды DPPS, DPPD. Повышенная производительность обработки данных типа AOS (массив структур) посредством поддержки скалярных произведений с одинарной и двойной точностью. Создание трехмерного контента, игр. Поддержка языков программирования, таких, как CG и HLSL.

Упакованное сопряжение. Процессорные команды BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW. Условно операция сопряжения копирует одно поле от источника и переносит его в место назначения. Эти новые процессорные команды повысят производительность операций сопряжения для большинства размеров полей посредством упаковки операций умножения в единую инструкцию. Широко применимо для автоматизации компиляторной векторизации обработки данных, а также для приложений, предназначенных для обработки изображений, видеоинформации.

Упакованные целочисленные максимальные и минимальные значения. Процессорные команды PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINDS, PMAXSD. Сравнивает упакованные знаковые/без знака на уровне байт/слов/двойных слов целочисленные значения в операнде назначения и в исходном операнде и возвращает минимальное или максимальное значение за одну инструкцию для каждого запакованного операнда в операнде назначения. Широко применимо для автоматизации компиляторной векторизации обработки данных.

Округление значений с плавающей запятой. Процессорные команды ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD. Эффективно округляет скаляр и упакованный операнд с одинарной или двойной точностью до целочисленного значения с поддержкой требований языков программирования Fortran, JAVA и C99. Применимо в обработке изображений, графики, видеоинформации, приложениях с двухмерной/трехмерной графикой, мультимедиа и игровых ресурсах.

Вставка/извлечение регистров. Процессорные команды INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ. Эти новые процессорные команды упрощают процесс вставки и извлечения между регистрами GPR (или памятью) и XMM. Широко применимо для автоматизации компиляторной векторизации обработки данных, а также для приложений, предназначенных для обработки изображений, видеоинформации.

Упакованное преобразование форматов. Процессорные команды PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ. Преобразует упакованное целочисленное значение (из регистра XMM или памяти) в целочисленное значение более широкого типа со знаковым или нулевым расширением. Широко применимо для автоматизации компиляторной векторизации обработки данных, а также для приложений, предназначенных для обработки изображений, видеоинформации.

Упакованная проверка и установка. Процессорная команда PTEST. Более быстрое ветвление архитектуры SIMD, осуществляемое для поддержки векторизированного кода. Применимо для автоматизации компиляторной векторизации обработки данных, обработки изображений и видеоинформации, создания трехмерного контента.

Упакованное определение идентичности. Процессорные команды PCMPEQQ, PCMPGTQ. Архитектура SIMD определяет идентичность упакованных значений QWORDs в операнде назначения и в исходном операнде. Широко применимо для автоматизации компиляторной векторизации обработки данных, а также для приложений, предназначенных для обработки изображений, видеоинформации.

Упаковка DWORD в беззнаковый формат WORD. Процессорная команда PACKUSDW. Преобразует упакованный знаковый DWORD в упакованный формат WORD без знака посредством беззнакового сосредоточения для обработки условий переполнения. Эта новая процессорная команда завершает набор других команд в этом формате. Широко применимо для автоматизации компиляторной векторизации обработки данных, а также для приложений, предназначенных для обработки изображений, видеоинформации.

Улучшенные строковые операции. Процессорные команды PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM. Эти новые процессорные команды содержат в себе большое количество возможностей обработки строк и текста, которые обычно требуют участия большего количества кодов операции. В результате повышается производительность сканирования вирусов, поиска текста, строковой обработки библиотек, таких, как ZLIB, баз данных, компиляторов.

Несмотря на то, что процессоры Intel Core 2 Duo имеют новую внутреннюю конструкцию, в них реализована версия ISA, практически идентичная набору команд процессоров предыдущего поколения Intel Pentium D, что гарантирует совместимость на уровне приложений. Практически все приложения, разработанные для процессоров Intel Pentium D, смогут выполняться на процессорах Intel Core 2 Duo без каких-либо изменений.

Чтобы получить максимальную выгоду от использования новых инструкций, старые приложения необходимо перекомпилировать с помощью обновленных версий компиляторов Intel или других производителей. В специализированных мультимедиа-приложениях рост производительности может быть очень значительным. Например, перекомпилированные версии программ DivX 6.7 и VirtualDub 1.7.2 демонстрируют рост производительности на 49% на процессоре Core 2 Extreme QX9650 (3,0 ГГц; 1333 МГц системная шина; 12 Мб кэш-памяти второго уровня; набор инструкций SSE4), по сравнению с той же конфигурацией на процессоре Core 2 Extreme QX6850 (3,0 ГГц; 1333 МГц системная шина; 8 Мб кэш-памяти второго уровня; набор инструкций SSE2). В программе TMPGEncoder Xpress 4.4 повышение производительности составляет 42%.

Другие программы при апгрейде с QX6850 (SSE2) на QX9650 (SSE4) ускоряются не так сильно, так что рост производительности в некоторых задачах может, по большей степени, объясняться увеличенным объемом кэш-памяти второго уровня.

Практическое применение SSE расширения.


Этой статьей я как обычно попытаюсь угодить обоим категориям читателей: начинающим, дав общее понимание SIMD принципов, лежащих в основе таких расширений как MMX, SSE, SSE2, 3DNOW! и Enhanced 3DNOW!,более опытным — поделившись некоторыми на мой взгляд интересными фактами и примерами с которыми я столкнулся в процессе работы над темой. Однако основной упор будет сделан именно на SSE расширение и его практическом применении. Как всегда, вполне допустимо пропускать те абзацы, которые содержат информацию, в которой читатель достаточно хорошо ориентируется. Статья содержит большое количество материала, поэтому рекомендуется разбирать ее постепенно, разбивая на отдельные шаги.

Не стоит рассматривать статью как достаточно обширный и всеобъемлющий материал — это только толчок к дальнейшему исследованию и применению темы, развиваемой в статье.

В статье могут встречаться недочеты и ошибки, от которых никто не застрахован. Но думаю, что вместе, мы сможем решить все возникшие недоразумения и найти правильное решение проблемы.

Знания и инструментарий

Статья предполагает, что у читателя есть знания базовых принципов программирования на языке ассемблера и Си. В остальном, я полагаю, что после внимательного изучения данной статьи и примера, читатель будет в состоянии самостоятельно писать процедуры, используя SSE расширение. Тем не менее, поскольку статья представляет из себя лишь вводный экскурс, для более полного понимания проблемы, желательно изучение документации и справочников (как минимум презентаций и CBT (computer based training)) которые можно получить с сайта Intel (http://developer.intel.com).

В качестве компилятора для примера был использован MS VC 6. Тем не менее, пример нормально компилируется в VC 7 (.Net). Да, именно – Си. Самое время удивиться, а лучше продолжим чтение статьи. В случае 6 версии на VC должны быть установлены SP 4 или 5 а также соответствующий для этого сервис пака процессор пак (Processor pack). Все это может быть получено с сайта Microsot (http://www.microsoft.com). Так как в примере использованы специфичные для Microsoft директивы, другие компиляторы без корректировки исходного кода примера использовать скорее всего не удастся. Компиляция примера выполнялась с использованием одного единственного ключа /O2 — оптимизация по скорости исполнения. Кстати, именно с ключем /O2 в MS VC 6+SP 5 связана одна из ошибок компилятора, обнаруженная в процессе создания примера.

Для отладки приложения использовался встроенный в Visual Studio отладчик. Конечно же, ему далеко по функциональности до небезызвестного Soft Ice от NuMega, тем не менее, это достаточно качественная программа, кроме того, интегрированная в Visual Studio. В качестве неплохого бесплатного отладчика/дизассемблера могу порекомендовать OllyDbg (http://home.t-online.de/home/Ollydbg), который так же позволяет отлаживать приложения, использующие SSE расширение (позволяет просматривать содержимое XMM регистров и дизассемблирует инструкции SSE). На момент начала написания статьи на сайте была доступна версия 1.08b.

SIMD расширения — что это?

SIMD (single instruction multiple data) — общий принцип лежащий в основе всех перечисленных до этого расширений — одной инструкцией выполняется действие сразу над некоторой группой однотипных операндов. Тем самым главные предметы изучения расширения — его архитектура, а именно представление данных и дополнительные наборы команд.
[tr=code]На заметку:

Все информация и определения справедливы для архитектуры IA-32 и совместимых с ней процессоров — то есть, грубо говоря, для «32-битных» процессоров Intel, AMD и некоторых других о которых уже никто наверное и не помнит.

Начиная с процессоров Pentium Pro (MMX) поддерживается MMX расширение от Intel. Включает в себя 8 (MM0-MM7) 64-битных регистров (Ты не знаешь что такое регистры? Ниже мы поговорим об этом освежив твою память, однако это ещё один знак того, что тебе следует поднять уровень знаний в рассматриваемой области если ты хочешь до конца понять статью) и позволяет производить целочисленные операции над парами нескольких новых типов данных:

— восемь упакованных байт
— четыре упакованных слова
— два двойных слова
— учетверенное слово

Другими словами, одной инструкцией MMX расширения программист может например сложить между собой два двойных слова. Физически никаких новый регистров не было добавлено. MM0-MM7 это мантиссы (младшие 64 бита) стека 80 битных FPU (floating point unit — сопроцессор) регистров.
[tr=code]На заметку:

В целом маркетинговый успех MMX расширения обошел в несколько раз его практическое применение — достаточно вспомнить те бури страстей и рекламного ажиотажа задолго до появления процессоров с поддержкой MMX.

Расширение от AMD впервые появилось в процессорах K6-2. По сути, являясь подмножеством того же MMX расширения (использует те MMX регистры), основным его достоинством являлось то, что расширение позволяло выполнять одновременные операции над двумя парами float чисел (32 битные операнды). При этом, как утверждало AMD, без дополнительных затрат могли выполняться одновременно две операции такого рода за такт, что выводит 3DNOW! на уровень сравнимый по производительности с SSE расширением от Intel. Само по себе расширение было достаточно революционным, хотя и не смогло вывести эту модель на конкурентоспособный уровень с процессорами-аналогами от Intel, что связанно не с самим расширением конечно, а лишь с недостатками самого процессора. Того количества игр, под которые были выпущены патчи или в которых уже была поддержка 3DNOW! было явно недостаточно для того, чтобы полностью доказать пользователям и программистам его преимущества. Начиная с процессоров Athlon (да здравствует здоровая конкуренция!) процессоры AMD поддерживают Enhanced 3DNOW! — более производительный блок и новый набор инструкций для 3DNOW! расширения. 3DNOW! (и его Enhanced реинкарнация) поддерживается лишь процессорами фирмы AMD.

Илон Маск рекомендует:  Атрибут cite в HTML

Виновник появления этой статьи, SSE расширение от Intel поддерживается как процессорами от Intel так и c некоторых пор некоторыми моделями от AMD. Аппаратно расширение включает в себя 8 (XMM0-XMM7) 128 битных регистров.
[tr=code]На заметку:

Архитектурно пайплайн SSE очень схож с гибким пайплайном шейдеров на современных GPU(видеокартах), не так ли?

SSE расширение позволяет одновременно выполнять операции над 4 парами float чисел. Начиная с процессоров Pentium 4 нам доступно расширение SSE2 — выполнение операций над двумя парами double (числа с плавающей точкой двойной точности — 64 бита) чисел. Кроме того, SSE2 расширяет MMX влияние, позволяя оперировать над целыми числами размерностью до 128-и бит.
[tr=code]На заметку:

Возвращаясь к игроделью — многие драйверы современных видеокарт уже имеют поддержку расширенных инструкций на своем вооружении. Зачем тогда нам его изучать? А как же наш с вами программный код?

Векторная обработка (SIMD-команды)

В классификации Г. Флинна (см. табл. 2.4) имеется рубрика SIMD — поток данных, обрабатываемых одной командой. В последовательных расширениях системы команд х86, выполненных Intel и AMD, все более полно используются принципы обработки одной командой вектора (потока) данных.

ММХ (MultiMedia extension) — архитектура системы команд (57 команд для ФЗ, см. табл. 3.4), непосредственно предназначенных для задач мультимедиа, связи и графических приложений, которые часто используют сложные алгоритмы, исполняющие одинаковые операции на большом количестве типов данных (байты, слова и двойные слова). Анализ участков таких программ с большим объемом вычислений показал, что такие приложения имеют следующие общие свойства, определившие выбор системы команд и структуры данных:

  • • небольшая разрядность целочисленных данных (например, 8-разрядные пиксели для графики или 16-разрядное представление речевых сигналов);
  • • небольшая длина циклов, но большое число их повторений;
  • • большой объем вычислений и значительный удельный вес операций умножения и накопления;
  • • существенный параллелизм операций в программах.

Это и определило новую структуру данных и расширение системы команд. При этом было достигнуто общее повышение производительности на 10—20 %, а в программах обработки мультимедиа — до 60 %.

В процессоре Pentium MMX (1996 г.) появляются 8 новых 64-разрядных «регистров» с именами ммО—мм7 (или же ммп), в действительности, эти новые «регистры» были только псевдонимами для регистров стека ПЗ х87 (см. рис. 3.4). В связи с тем, что каждый из регистров стека содержит 80 бит, старшие 16 бит регистров стека оказываются неиспользованными в ММХ (рис. 3.4). Поэтому в режиме ММХ они заполняются всеми единицами, что позволяет отличать данные формата с плавающей запятой от ММХ-данных.

Преимущество совмещения ММп с регистрами FPU состоит в том, что одни и те же команды и структуры данных различных операционных систем (при обработке прерываний и вызове подпрограмм) могут использоваться как для сохранения содержания регистров ПЗ, так и регистров 3DNow!.

Каждый из регистров ммп предназначен для целых чисел на 64 бита. Однако главным понятием набора команд ММХ является концепция упакованных типов данных (см. табл. 1.10, рис. 1.5).

MMX-команды исполняются в том же режиме процессора, что и команды с плавающей запятой. Поэтому при исполнении всех MMX-команд (кроме EMMS) «портится» слово состояния регистров с плавающей запятой. В табл. 3.4 приведены примеры некоторых команд.

MMX-команды используются в ЦП, начиная с Pentium MMX (AMD Кб) и имеют следующий синтаксис:

instruction [src, dest]

Здесь instruction — имя команды, dest — выходной, а src — входной операнды. Все команды ММХ оперируют с двумя операндами — источник и приемник. В обозначениях команды правый операнд является источником, а левый — приемником.

Операнд-приемник может также быть и вторым операндом-источником. Команды записывают в приемник результат.

Операнд-источник для всех команд ММХ (кроме команд пересылок) может располагаться либо в памяти, либо в регистре ММХ. Операнд-приемник должен располагаться в регистре ММХ.


Для команд пересылок операндами могут также выступать целочисленные РОН или ячейки памяти. Большинство команд имеет суффикс, который определяет тип данных и используемую арифметику:

  • • US (unsigned saturation) — арифметика с насыщением, данные без знака;
  • • S или SS (signed saturation) — арифметика с насыщением, данные со знаком. Если в суффиксе нет ни S, ни SS, используется циклическая арифметика (wraparound);
  • • в, w, D, Q указывают тип данных. Если в суффиксе есть две из этих букв, первая соответствует входному операнду, а вторая — выходному.

Все 57 MMX-команд разделены на следующие классы — арифметические, сравнения, преобразования, логические, сдвига, пересылки и смены состояний. Основные форматы представлены в табл. 3.4 (не представлены команды сравнения, логические, сдвига и смены состояний).

Архитектура 3DNow! впервые реализована в процессорах AMD К6-2 (май 1998 г.). Технология 3DNow! включает 21 дополнительную команду, новые типы данных и использует регистры ммп (ммо—ММ7) для поддержки высокопроизводительной обработки ЗО-графики и звука (см. табл. 3.5).

В то время как архитектура ММХ предполагает целочисленную арифметику, векторные команды 3DNow! параллельно обрабатывают две пары 32-разрядных вещественных операндов одинарной точности (см. табл. 1.10).

Таблица 3.4. Некоторые команды технологии ММХ

Сложение с округлением [byte, word, doubleword]

Форматы данных и команды их обработки процессоров Pentium III, Pentium IV (стр. 1 из 18)

Форматы данных и команды их обработки процессоров Intel Pentium III и Intel Pentium IV

В курсовой работе представлены данные о всевозможных форматах данных процессоров Intel Pentium III и Intel Pentium IV. Так же приведён полный список команд, реализованных в данных процессорах, с кратким описанием для обработки этих данных. Более подробно рассмотрены команды блока XMM: SSE – Pentium III и SSE2 – Pentium IV, с подробным описанием: для данных команд предсталено описание синтксиса, правила построения машинного кода, принцип действия (для многих команд принцип действия для большей наглядности представлен графически, ввиде схем), воздействие команды на флаги процессора, возможные возникаемые исключения во время выполнения команд.

1. Типы данных процессоров Pentium 3, Pentium 4 . . . . . . . . . . . . 5

2. Математический сопроцессор x87 . . . . . . . . . . . . . . . . 9

3. Технология MMX . . . . . . . . . . . . . . . . . . . . . . . 12

4. Расширение SSE и SSE2 — блок XMM. . . . . . . . . . . . . . . 14

5. Команды обработки данных. . . . . . . . . . . . . . . . . . . 15

6. Команды блока XMM (SSE и SSE2) . . . . . . . . . . . . . . . . 31

6.1. Команды блока XMM (SSE – Pentium 3) . . . . . . . . . . . 33

6.2. Команды блока XMM (SSE2 – Pentium 4) . . . . . . . . . . . 50

Целью курсовой работы «Форматы данных и команды их обработки процессоров Intel Pentium III, Intel Pentium IV» является поытка наиболее полно показать отличительные признаки современных процессоров. В данной работе автор не ставил себе задачу расписать каждую команду обработки данных существующую в данных процессорах, ведь отличительная особенность процессоров Intel заключается в том, что наиболее поздние модификации полностью совместимы с более ранними. В процессорах Intel Pentium III, Intel Pentium IV нововведением стали два блока XMM (eXtended MultiMedia) – это SSE (Streaming SIMD (Single Istruction Multiply Data) Extensions) – введённый в процессоре Intel Pentium III и SSE2 – введённый в процессоре Intel Pentium IV. Поэтому базовые команды (существующие в более ранних модификациях Intel, начиная с 8086), команды математического сопроцессора (FPU) и команды блока MMX, появившегося впервые в процессоре Intel Pentium рассмотрены лишь обзорно. Так как расширение 3Dnow! блока MMX, введённое фирмой AMD в процессорах K6-2 на данный момент отсутствует в процессорах фирмы Intel, то оно совсем не рассмотренно в курсовой работе.

1. Типы данных процессоров Pentium 3, Pentium 4

История 32-разрядных процессоров Intel Pentium 3 и Pentium 4 началась с процессора Intel386. Он вобрал в себя все черты своих 16-разрядных предшественников 8086/88 и 80286 для обеспечения совместимости с громадным объемом программного обеспечения, существовавшего на момент его появления. Процессоры могут оперировать с 8-,16- и 32-битными операндами, строками байт, слов и двойных слов, а также с битами, битовыми полями и строками бит.

Рассматриваемые процессоры непосредственно поддерживают (используют в качестве операндов) знаковые и беззнаковые целые числа, строки байт, цифр и символов, битовые строки, указатели и числа с плавающей точкой. В семействе х86 принято, что слова записываются в двух смежных байтах памяти, начиная с младшего. Адресом слова является адрес его младшего байта. Двойные слова записываются в четырех смежных байтах, опять-таки начиная с младшего байта, адрес которого и является адресом двойного слова. Этот порядок называется Little-Endian Memory Format. В других семействах процессоров применяют и обратный порядок — Big-Endian Memory Format, в котором адресом слова (двойного слова) является адрес его старшего байта, а младшие байты располагаются в последующих адресах. Для взаимного преобразования форматов слова имеется инструкция XCHG, двойного слова — BSWAP (процессор 486 и выше).

На рис.1. приведены форматы данных, обрабатываемых целочисленным блоком АЛУ всех 32-разрядных процессоров:

• Бит (Bit) — единица информации. Бит в памяти задается базой (адресом слова) и смещением (номером бита в слове).

• Битовое поле (Bit Field) — группа до 32 смежных бит, располагающихся не более чем в 4 байтах.

• Битовая строка (Bit String) — набор смежных бит длиной до 4 Гбит.

• Байт (Byte) — 8 бит.

• Числа без знака: байт/слово/двойное/учетверенное слово (Unsigned Byte/ Word/Double Word/Quade Word), 8/16/32/64 бит.

• Целые числа со знаком: байт/слово/двойное/учетверенное слово (Integer Byte/ Word/Double Word/Quade Word). Единичное значение самого старшего бита (знак) является признаком отрицательного числа, которое хранится в дополнительном коде.

• Двоично-десятичные числа (BCD — Binary Coded Decimal):

• 8-разрядные упакованные (Packed BCD), содержащие два десятичных разряда в одном байте;

• 8-разрядные неупакованные (Unpacked BCD), содержащие один десятичный разряд в байте (значение бит 7:4 при сложении и вычитании несущественно, при умножении и делении они должны быть нулевыми).


• Строки байт, слов и двойных слов (Bit String, Byte String, Word String, Double Word String) длиной до 4 Гбайт.

• длинный указатель (48 бит) — 16-битный селектор (или сегмент) и 32-битное смещение;

• короткий указатель — 32-битное смещение;

• просто указатель (32 бит, единственный тип указателя для 8086 и 80286) • 16-битный селектор (или сегмент) и 16-битное смещение.

16-разрядные процессоры из приведенных типов данных не поддерживают учетверенные слова всех типов, битовые поля и строки, строки двойных слов, короткие и длинные указатели.

Числа в формате с плавающей точкой и упакованные 80-битные BCD-числа обрабатываются блоками FPU процессоров класса 486 и выше, а также сопроцессорами 8087/287/387. Упакованные 64-битные и 128-битные данные обрабатываются процессорами с ММХ и SSE. Форматы данных, обрабатываемых блоками FPU/MMX и ХММ, представлены на рис. 2.

• Действительные числа в формате с плавающей точкой:

• одинарной точности (Single Precision), 32 бит — 23 бит мантисса, 8 бит порядок;

• двойной точности (Double Precision), 64 бит — 52 бит мантисса, 11 бит порядок;

• повышенной точности (Extended Precision), 80 бит — 64 бит мантисса, 15 бит порядок.

• Двоично-десятичные 80-битные упакованные числа (18 десятичных разрядов и знак).

• Упакованные действительные числа одинарной точности в формате с плавающей точкой, обрабатываются блоком ХММ.

• Упакованные целые числа, знаковые и беззнаковые, обрабатываются блоком ММХ:

• упакованные байты (Packed byte) — восемь байт;

• упакованные слова (Packed word) — четыре слова;

• упакованные двойные слова (Packed doubleword) — два двойных слова;

• учетверенное слово (Quadword) — одно слово.

Для 16-разрядных процессоров, естественно, все форматы чисел для блоков ММХ и ХММ недоступны.

Рассмотрим более подробно блоки, упомянутые выше: блоки FPU, MMX, XMM, которые архитектуре процессоров IA-32 х86 держатся особняком. Они присутствуют не но всех процессорах и даже по схемотехнической реализации являются пристройками к центральному процессору с его набором обычных целочисленных регистров. Данные блоки предназначены для ускорения вычислений.

Математический сопроцессор (FPU) позволяет использовать несколько форматов чисел с плавающей точкой — FP-форматов. Операции с такими числами можно выполнять и программно средствами целочисленного процессора, но сопроцессор выполняет эти операции анпаратно во много раз быстрее. Блок ММХ дает ускорение целочисленных вычислений за счет одновременной обработки одной инструкцией целого пакета чисел (пар чисел). Блок ХММ комбинирует эти два приема — обрабатывает одной инструкцией пакет из четырех чисел в FP-формате. Исторически первым появился сопроцессор. Блок ММХ ради совместимости с операционными системами «спрятали» в то же оборудование, что и сопроцессор. Так появился комбинированный блок, называемый блоком FP/MMX, или FPU/ММХ. И толысо блок ХММ, используемый расширением SSE процессоров Pentium 3, стал полностью новым самостоятельным набором регистров.

Рис. 1. Типы данных, обрабатываемых целочисленным АЛУ

Рис. 2. Типы данных, обрабатываемых блоками FPU/MMX и ХММ

При отсутствии математического сопроцессора прикладная программа все-таки может использовать инструкции FPU, но для этого операционная система должна поддерживать эмуляцию сопроцессора. Эмулятор сопроцессора — это программа-обработчик прерывания от сопроцессора или исключения #NM, которая должна «выловить» код операции, сопроцессора, определить местонахождение данных и выполнить требуемые вычисления, используя целочисленную арифметику центрального процессора. Понятно, что эмуляция будет выполняться во много раз медленнее, чем те же действия, выполняемые настоящим сопроцессором. Тем не менее эмуляция позволяет все-таки пользоваться прикладными программами, требующими вычислений с плавающей точкой. Для этого в регистре CR0 должно быть установлено сочетание флагов ЕМ = 1, МР = 0. Для эмуляции в IBM PC обычно устанавливают значение NE = 0. Тогда каждая инструкция FPU автоматически будет вызывать эмулятор генерацией запроса прерывания (а не исключения #NM, как было бы при NE = 1).

Эмуляция для блоков ММХ и ХММ не предусматривается — эти блоки предназначены для ускорения вычислений в приложениях реального времени, и выполнять их с крайне низкой скоростью эмуляции было бы просто бессмысленно. Если установлен флаг эмуляции ЕМ = 1, то любая инструкция ММХ вызовет исключение #UD.

2. Математический сопроцессор x87

Математический сопроцессор предназначен для расширения вычислительных возможностей центрального процессора — выполнения арифметических операций, вычисления основных математических функции (тригонометрических, экспоненты, логарифма) и т. д. В разных поколениях процессоров он назывался по-разному — FPU (Floating Point Unit — блок чисел с плавающей точкой) или NPX (Numeric Processor eXtension — числовое расширение процессора).

Сопроцессор поддерживает семь типов данных: 16-, 32-, 64-битные целые числа; 32-, 64-, 80-битные числа с плавающей точкой и 18-разрядные числа в двоично-десятичном формате. Формат чисел с плавающей точкой соответствует стандартам IEEE 754 и 854. Применение сопроцессора повышает производительность вычислений в сотни раз. С программной точки зрения сопроцессор и процессор выглядят как единое целое. В современных (486+) процессорах FPU располагается на одном кристалле с центральным процессором. Для процессоров 386 и ниже сопроцессор был отдельной микросхемой, подключаемой к локальной нише основного процессора. В любом случае сопроцессор исполняет только свои специфические команды, а всю работу по декодированию инструкции и доставке данных осуществляет CPU. Сопроцессор может выполнять вычисления параллельно с центральным процессором, независимо от переключения задач в защищенном режиме. Как и основной процессор, сопроцессор может работать в реальном или защищенном режиме и переключать разрядность- 16 или 32. Переключение режимов влияет на формат отображения регистров сопроцессора в оперативной памяти, при этом формат используемых внутренних регистров не изменяется.

PARALLEL.RU — Информационно-аналитический центр по параллельным вычислениям

Общие сведения

SSE (Streaming SIMD Extensions) — расширение инструкций процессора для потоковой обработки в режиме SIMD (Single Instruction Multiple Data), т.е. когда требуется применять однотипные операции к потоку данных.

Расширение SSE разработано компанией Intel и было впервые применено в процессоре Intel Pentium III с ядром Katmai. Отсюда изначальное название KNI (Katmai New Instructions). Технология SSE позволила преодолеть проблемы MMX — при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры задействовались для MMX и работы с вещественными числами.

В общем случае, к архитектуре процессора добавляется ряд самих инструкций и несколько 128-битных регистров с различной интерперетацией. Тем не менее, хотя изначально каждый регистр трактуется как два значения с плавающей точкой двойной точности (2*64-бит), операции могут применяться практически ко всем типам, «помещающимся» в 16 байт:

Это означает, например, что появляется возможность одновременно сложить или умножить с помощью всего одной инструкции два операнда из четырех чисел с плавающей точностью одинарной точности, двух — с двойной, двух 64-битных целочисленных, 16 8-битных целых и т.п.

Таким образом, для получения максимальной отдачи от SSE, следует использовать такие структуры данных, чтобы они максимально укладывались в эти 128-битные регистры. Если это не удается сделать изначально, то среди SSE существуют и специальные для этих целей инструкции.

Для програм с большим количеством ветвлений и условных операций рекомендуется, по возможности, заменить условные ветвления на логические и вычислительные операции.

Более подробно об этом можно прочитать в документе Using SSE and SSE2: Misconceptions and Reality на сайте Intel.

Впервые применено в
SSE Intel Pentium III
SSE2 Intel Pentium IV
SSE3 Intel Pentium IV (Prescott)
SSE4 Intel Core (Penryn)

SSE включает в архитектуру процессора восемь 128-битных регистров (с xmm0 до xmm7), каждый из которых трактуется как 4 последовательных значения с плавающей точкой одинарной точности. SSE включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных.

SSE2 использует восемь 128-битных регистров (с xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE, каждый из которых трактуется как 2 последовательных значения с плавающей точкой двойной точности. SSE2 включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных. Также SSE2 содержит инструкции для потоковой обработки целочисленных данных в тех же 128-битных xmm регистрах, что делает это расширение более предпочтительным для целочисленных вычислений, нежели MMX, появившийся гораздо ранее.

Набор SSE3 содержит 13 инструкций: FISTTP (x87), MOVSLDUP (SSE), MOVSHDUP (SSE), MOVDDUP (SSE2), LDDQU (SSE/SSE2), ADDSUBPD (SSE), ADDSUBPD (SSE2), HADDPS (SSE), HSUBPS (SSE), HADDPD (SSE2), HSUBPD (SSE2), MONITOR (нет аналога в SSE3 для AMD), MWAIT (нет аналога в SSE3 для AMD).

SSE4 состоит из 54 инструкций, 47 из них относят к SSE4.1 (только они появятся в процессорах Penryn). Ожидается, что полный набор команд (SSE4.1 и SSE4.2, то есть 47 + оставшиеся 7 команд) будет доступен в процессорах Nehalem. Ни одна из SSE4 инструкций не работает с 64-х битными mmx регистрами (только с 128-ми битными xmm0-15).

Компилятор языка Си от Intel начиная с версии 10 будет генерировать инструкции SSE4 при задании опции -QxS.

Более подробную информацию по SSE4 можно найти на сайте Intel по ссылке.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL