Использование регистров MMX в программировании

 MMX инструкции

Процессор Intel Pentium MMX
Процессор Intel Pentium MMX
MMX (сокр. от MultiMedia eXtensions - мультимедийные расширения) - набор инструкций микропроцессора, предназначенных для ускорения обработки аудио- и видеоданных.

Технология MMX разработана компанией Intel и впервые использована в 1997 году в процессорах Pentium MMX. Позже ее начали использовать и другие производители. Сегодня MMX является обязательным атрибутом любого современного процессора. 

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

Эти недостатки MMX были устранены позже с введением технологий 3DNow! и SSE

 

Типы данных

Команды технологии MMX работают с 64-разрядными целочисленными данными, а также с данными, упакованными в группы (векторы) общей длиной 64 бита. Такие данные могут находиться в памяти или в восьми MMX-регистрах. Эти регистры называются MM0, MM1, ... , MM7. Команды технологии MMX работают со следующими типами данных:

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

По-английски эти типы данных называются, соответственно, packed byte, packed word, packed doubleword и quadword. 

 

Команды MMX

Пересылка данных

Команда

Описание

movq mm, mm/m64

пересылка данных в регистр MMX

movd mm, mm/m32/ir32

копирует 32 бита из младших разрядов регистра MMX,
либо из памяти, либо из целочисленного регистра в младшие 32 бита
MMX-регистра (старшие биты заполняются нулями)

Арифметические команды

paddb mm, mm/m64
paddw mm, mm/m64
paddd mm,mm/m64

складывает элементы данных (байты, слова, двойные слова) входного и выходного операнда.
Если сумма выходит за границу допустимого диапазона, избыток отсчитывается от другой границы диапазона. "Переноса" единицы из одного элемента данных в другой не происходит

paddsb mm, mm/m64
paddsw mm, mm/m64

сложение с насыщением знаковых данных (байты, слова)

paddusb mm, mm/m64
paddusw mm, mm/m64

сложение с насыщением беззнаковых данных (байты, слова)

psubb mm, mm/m64
psubw mm, mm/m64
psubd mm, mm/m64

вычитание элементов данных (байты, слова, двойные слова).
Аналогично сложению

psubsb mm, mm/m64
psubsw mm, mm/m64

вычитание с насыщением знаковых данных (байты, слова)

psubusb mm, mm/m64
psubusw mm, mm/m64

вычитание с насыщением беззнаковых данных (байты, слова)

pmullhw mm, mm/m64

умножить знаковые слова и выбрать старшие биты результата

pmulllw mm, mm/m64

умножить знаковые слова и выбрать младшие биты результата

pmaddwd mm, mm/m64

умножить и сложить знаковые слова

Команды сравнения

PCMPEQB mm, mm/m64
PCMPEQW mm, mm/m64
PCMPEQD mm, mm/m64

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

PCMPGTB mm, mm/m64
PCMPGTW mm, mm/m64
PCMPGTD mm, mm/m64

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

Логические команды

PAND mm, mm/m64

Побитовое И

PANDN mm, mm/m64

Побитовое НЕ-И

POR mm, mm/m64

Побитовое ИЛИ

PXOR mm, mm/m64

Побитовое Исключающее ИЛИ ( XOR )

PSLLW mm, mm/m64/imm
PSLLD mm, mm/m64/imm
PSLLQ mm, mm/m64/imm

Логический сдвиг влево слов, двойных слов, учетверённых слов

PSRLW mm, mm/m64/imm
PSRLD mm, mm/m64/imm
PSRLQ mm, mm/m64/imm

Логический сдвиг вправо слов, двойных слов, учетверённых слов

PSRAW mm, mm/m64/imm
PSRAD mm, mm/m64/imm

Арифметический сдвиг вправо слов, двойных слов

Команды упаковки

PACKSSWB mm, mm/m64
PACKSSDW mm, mm/m64

Упаковать с насыщением знаковые слова и двойные слова

PACKUSWB mm, mm/m64

Упаковать с насыщением беззнаковые слова

PUNPCKHBW mm, mm/m64
PUNPCKHWD mm, mm/m64
PUNPCKHDQ mm, mm/m64

Распаковать старшие байты, слова, двойные слова

PUNPCKLBW mm, mm/m64
PUNPCKLWD mm, mm/m64
PUNPCKLDQ mm, mm/m64

Распаковать младшие байты, слова, двойные слова

Отдельно выделяется комманда emms, которая обеспечивает переход процессора от исполнения MMX-команд к исполнению обычных команд с плавающей запятой: она устанавливает значение 1 во всех разрядах слова состояния


Арифметика с насыщением

Речь идёт об операциях с насыщением (такие, как paddsb, paddsw, и т.д.)

Арифметика с насыщением - это версия арифметики, в которой все операции, такие как сложение и умножение, ограничены в фиксированный диапазон между минимальным и максимальным значением.

Если результат операции больше максимального, он устанавливается на максимум; если он ниже минимума, он ограничивается минимумом.

Пример:

76 + 31 = 100 (не 107, т.к. произошло насыщение) 

88 * 91 = 100 (не 8008)


Постановка задачи

Для сравнения скорости работы, написанных на «чистом» Си и с использованием регистров MMX написать две программы, реализующие одинаковую логику и выводящие время своей работы.

Реализация программы 

Программа написана в среде Microsoft Visual Studio. 

В качестве интерфейса с инструкциями MMX выбрана реализация с ассемблерными вставками.

Программа складывает два массива, считает время работы выбранного метода (на ассемблерных вставках, на "чистом" Си) в тактах процессора.

Чтобы скомпилировать программу - нужно выбрать режим x86 в Visual Studio

MS Visual Studio. Компиляция программы с использованием ассемблерных вставок

Код программы вы можете найти на моём гитхабе.


Результат работы программы


MS Visual Studio. Результат работы программы с MMX инструкциями

Как видим, на сложение массивов, размером 10485760 элементов при реализации с использованием MMX регистров уходит в 2 с лишним раза меньше процессорных тактов, чем при реализации этого алгоритма на "чистом" Си.


Вывод:

Основное предназначение регистров MMX - это выполнение арифметических операций над массивом целочисленных данных.


Источники:

https://www.chaynikam.info/cpu_mmx.html

http://www.codenet.ru/progr/optimize/mmx.php

https://www.club155.ru/index.php?option=com_sobipro&sid=10&site=1 

https://ru.wikibrief.org/wiki/Saturation_arithmetic

Комментарии

Популярные сообщения из этого блога

Как создать трейнер в Cheat Engine