Процесорные инструкции


Предыдущая |

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

3DNow!

-AMD64 (x86-64)

-EM64T (x86-64)

-Extended 3DNow!

-IA-32 (x86-32)

-MIMD

-MISD

-MMX

-SIMD

-SISD

-SSE

-SSE2

-SSE3

-SSE4

-SSE4.1

-SSE4.2

-SSE4A

-SSSE3

 

MMX (Multimedia Extensions — мультимедийное расширение) — коммерческое название дополнительного набора инструкций, выполняющих характерные для процессов кодирования/декодирования потоковых аудио/видео данных действия за одну машинную инструкцию. Впервые появился в процессорах Pentium MMX. Разработан в лаборатории Intel в Хайфе, Израиль, в первой половине 1990-х.

SIMD (англ. Single Instruction, Multiple Data) — принцип компьютерных вычислений, позволяющий обеспечить параллелизм на уровне данных.

SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel, и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3DNow! от AMD, который был представлен годом раньше. Первоначально названием этих инструкций было KNI что расшифровывалось как Katmai New Instructions (Katmai — название первой версии ядра процессора Pentium III).

Технология SSE позволяла преодолеть 2 основных проблемы MMX — при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры использовались для MMX и работы с вещественными числами.

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

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

Реализация блоков SIMD осуществляется распараллеливанием вычислительного процесса между данными. То есть когда через один блок проходит поочерёдно множество потоков данных.

SSE2

SSE2 (англ. Streaming SIMD Extensions 2, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel, и впервые представленный в процессорах серии Pentium 4.

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

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

SSE3 (PNI — Prescott New Instruction) — третья версия SIMD-расширения Intel, потомок SSE, SSE2 и x87. Впервые представлено 2 февраля 2004 года в ядре Prescott процессора Pentium 4. В 2005 AMD предложила свою реализацию SSE3 для процессоров Athlon 64 (ядра Venice и San Diego).

Набор 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 это набор команд Intel Core микроархитектуры, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD). Он был анонсирован 27 Сентября 2006, однако детальное описание стало доступно только весной 2007.

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

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

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

 

SSE4.1 это расширенный набор команд SSE4 от Intel.

Ниже приведены инструкции, входящие в SSE4.1:

-Ускорение видео (3 инструкции)

-Векторные примитивы (5 инструкций)

-Вставки/извлечения (4 инструкции)

-Скалярное умножение векторов (2 инструкции)

-Смешивания (4 инструкции)

-Проверки бит

-Округления (2 инструкции)

-Чтение WC памяти

SSE4.2 состоит из 7 инструкций.

-Обработка строк (4 инструкции)

-Подсчет CRC32

-Подсчет популяции единичных бит

-Векторные примитивы

SSE4A это расширенный набор команд SSE4 от AMD, разработанный скорее не как дополнение, а как альтернатива инструкциям SSE4 от Intel.

SSSE3 (Supplemental Streaming SIMD Extension 3) — это обозначение данное Intel 4-му расширению системы команд. Предыдущее имело обозначение SSE3 и Intel добавил ещё один символ 'S' вместо того, чтобы увеличить номер расширения, возможно потому, что они посчитали SSSE3 простым дополнением к SSE3. Часто, до того как стало использоваться официальное обозначение SSSE3, эти новые команды назывались SSE4. Также их называли кодовыми именами Tejas New Instructions (TNI) и Merom New Instructions (MNI) по названию процессоров, где впервые Intel намеревалась поддержать эти новые команды. Появившись в Intel Core Microarchitecture, SSSE3 доступно в сериях процессоров Xeon 5100 (Server и Workstation версии), а также в процессорах Intel Core 2 (Notebook и Desktop версии).

Новыми в SSSE3, по сравнению с SSE3, являются 16 уникальных команд, работающих с упакованными целыми. Каждая из них может работать как с 64-х битными (MMX), так и с 128-ми битными (XMM) регистрами, поэтому Intel в своих материалах ссылается на 32 новые команды.

Вот некоторые из них:

-Работа со знаком (2 инструкции)

-Сдвиги

-Перемешивание байт

-Умножения (2 инструкции)

-Горизонтальные сложения/вычитания целых (4 инструкции)

3DNow! — дополнительное расширение MMX для процессоров AMD, начиная с AMD K6 3D. Причиной создания 3DNow! послужило стремление завоевать превосходство над процессорами производства компании Intel в области обработки мультимедийных данных. Хотя это расширение является разработкой AMD, его также интегрировали в свои процессоры IBM, Cyrix и другие.

Технология 3DNow! ввела 21 новую команду процессора и возможность оперировать 32-битными вещественными типами в стандартных MMX- регистрах. Также были добавлены специальные инструкции, оптимизирующие переключение в режим MMX/3DNow! (femms, которая заменяла стандартную инструкцию emms) и работу с кешем процессора. Таким образом технология 3DNow! расширяла возможности технологии MMX, не требуя введения новых режимов работы процессора и новых регистров.

В 3DNow! компания AMD добавила новый тип данных — 32-битные вещественные числа, инструкции для работы с этим типом, а также некоторые инструкции для манипулирования стандартными типами MMX.

Проверка поддержки 3DNow! процессором.

Перед началом работы с расширением 3DNow! следует убедиться, что ЦП их поддерживает. Для этого используется инструкция CPUID. Общий порядок действий при проверке выглядит следующим образом:

1.Убедиться, что процессор поддерживает инструкцию CPUID. Если нет, то ЦП не поддерживает и 3DNow!.

2.Выполнить инструкцию cpuid со значением EAX = 0 — это необходимо для следующего шага.

3.Выполнить CPUID со значением EAX = 80000000h. Если после выполнения инструкции в EAX будет значение меньше 1, то 3DNow! не поддерживается.

4.Выполнить CPUID с EAX = 80000001h. Если после выполнения бит 31 регистра EDX будет установлен в 1, то 3DNow! поддерживается. Иначе — нет.

AMD64 (также x86-64/Intel64/EM64T/x64) — 64-битная архитектура микропроцессора и соответствующий набор инструкций, разработанные компанией AMD. Это расширение архитектуры x86 с полной обратной совместимостью. Набор инструкций x86-64 в настоящее время поддерживается процессорами AMD Athlon 64, Athlon 64 FX, Athlon 64 X2, Turion 64, Opteron, последними моделями Sempron. Интересно, что этот набор инструкций был поддержан основным конкурентом AMD — компанией Intel под названием Intel 64 (ранее известные как EM64T и IA-32e) в поздних моделях процессоров Pentium 4, а также в Pentium D, Pentium Extreme Edition, Celeron D, Core 2 Duo и Xeon. Корпорации Microsoft и Sun Microsystems используют для обозначения этого набора инструкций термин x64.

Особенности архитектуры:

Разработанный компанией AMD набор инструкций x86-64 (позднее переименованный в AMD64) — расширение архитектуры Intel IA-32 (x86-32). Основной отличительной особенностью AMD64 является поддержка 16-ти 64-битных регистров общего назначения (против 8-и 32-битных в x86-32), 64-битных арифметических и логических операций над целыми числами и 64-битных виртуальных адресов. Для адресации новых регистров для команд введены так называемые «префиксы расширения регистра», для которых был выбран диапзон кодов 40h-4Fh, использующихся для команд INC <регистр> и DEC <регистр> в 32- и 16-битных режимах.

 

Архитектура x86_64 имеет:

-16 целочисленных 64-битных регистра общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15)

-8 80-битных регистров с плавающей точкой (ST0 — ST7)

-8 64-битных регистров Multimedia Extensions (MM0 — MM7, имеют общее пространство с регистрами ST0 — ST7)

-16 128-битных регистров SSE (XMM0 — XMM15)

-64-битный указатель RIP

-64-битный регистр флагов RFLAGS.

Проверка поддержки инструкции CPUID процессором:

Так как инструкция CPUID отсутствовала в первых процессорах архитектуры x86, перед её использованием следует удостоверится что ЦП ее поддерживает. Для этого производится попытка изменить бит 21 (ID) регистра EFLAGS. Если бит успешно поменяется, то инструкция CPUID процессором поддерживается.

Приведенный ниже исходный код проверяет поддержку инструкции CPUID: pushfd ; размещение регистра EFLAGS в стэке

pop eax ; извлечение значения EFLAGS в EAX mov ebx, eax ; сохранение значения в EBX xor eax, 200000h ; изменение 21-го бита

push eax ; размещение нового значения в стэке popfd ; сохранение нового значения в EFLAGS pushfd ; снова размещение EFLAGS в стэке pop eax ; значение EFLAGS теперь в EAX

xor eax, ebx ; проверка 21-го бита

je no_cpuid ; если он не изменился, то CPUID не поддерживается

В данном примере используется инструкция XOR, так как она непременно поменяет только 21-й флаг ID не затронув другие. Обратите внимание что здесь используются 32-битные инструкции, поэтому рекомендуем сначала проверить поддерживает ли процессор 32-битные директивы.

Использование CPUID:

Инструкция CPUID по содержимому регистра EAX определяет какого рода информацию о процессоре необходимо вернуть. Первый раз её следует вызывать со значением EAX = 0. При этом будет возвращено максимально допустимое значение параметра инструкции, поддерживаемое данным процессором.

Для того, чтобы получить информацию о дополнительных функциях, имеющихся в процессорах, в регистре EAX перед вызовом CPUID должен быть установлен бит 31. Например, чтобы определить максимально допустимое значение параметра для дополнительных функций, необходимо выполнить CPUID со значением EAX = 80000000h.

EAX = 0: Получить идентификатор производителя процессора

При EAX = 0 ЦП возвращает идентификатор производителя процессора (англ. Vendor ID) в виде 12 символов ASCII, содержащихся в регистрах EBX, ECX, EDX (именно в таком порядке). В регистре EAX же возвращается максимально допустимое значение EAX при вызове CPUID.

ASCii-строка HEX-значения EBX:EDX:ECX Название производителя

"GenuineIntel" 756E6547:49656E69:6C65746E Intel "AuthenticAMD" 68747541:69746E65:444D4163 AMD "CyrixInstead" 69727943:736E4978:64616574 Cyrix "CentaurHauls" 746E6543:48727561:736C7561 Centaur "SiS SiS SiS " 20536953:20536953:20536953 SiS "NexGenDriven" 4778654E:72446E65:6E657669 NexGen "GenuineTMx86" 756E6547:54656E69:3638784D Transmeta "RiseRiseRise" 65736952:65736952:65736952 Rise

"UMC UMC UMC " 20434D55:20434D55:20434D55 UMC

"Geode by NSC" 646F6547:79622065:43534E20 National Semiconductor

EM64T (Extended Memory 64 Technology) - реализация 64-битных расширений AMD64 процессорной архитектуры IA-32 (архитектуры x86- совместимых процессоров) фирмы Intel. Основное улучшение, обеспечиваемое EM64T — 64-битная адресация оперативной памяти, что позволяет снять присущее 32-битным процессорам ограничение в 4 гигабайта адресуемой напрямую памяти.

EM64T обеспечивает поддержку:

-64-битового линейного действительного адресного пространства;

-64-битовых указателей;

-64-битовые регистры общего назначения;

-64-битовых целых чисел;

-поддержку до 1 терабайта адресного пространства платформы.