Использование регистров MMX в программировании
MMX инструкции
Процессор Intel Pentium MMX |
Технология 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, |
Арифметические команды |
|
paddb mm,
mm/m64 |
складывает элементы данных (байты,
слова, двойные слова) входного и выходного операнда. |
paddsb
mm, mm/m64 |
сложение с насыщением знаковых данных (байты, слова) |
paddusb
mm, mm/m64 |
сложение с насыщением беззнаковых данных (байты, слова) |
psubb mm,
mm/m64 |
вычитание элементов данных (байты,
слова, двойные слова). |
psubsb
mm, mm/m64 |
вычитание с насыщением знаковых данных (байты, слова) |
psubusb
mm, mm/m64 |
вычитание с насыщением беззнаковых данных (байты, слова) |
pmullhw mm, mm/m64 |
умножить знаковые слова и выбрать старшие биты результата |
pmulllw mm, mm/m64 |
умножить знаковые слова и выбрать младшие биты результата |
pmaddwd mm, mm/m64 |
умножить и сложить знаковые слова |
Команды сравнения |
|
PCMPEQB mm, mm/m64 |
сравнение данных (байты, слова,
двойные слова). |
PCMPGTB 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 |
Логический сдвиг влево слов, двойных слов, учетверённых слов |
PSRLW mm,
mm/m64/imm |
Логический сдвиг вправо слов, двойных слов, учетверённых слов |
PSRAW mm,
mm/m64/imm |
Арифметический сдвиг вправо слов, двойных слов |
Команды упаковки |
|
PACKSSWB
mm, mm/m64 |
Упаковать с насыщением знаковые слова и двойные слова |
PACKUSWB mm, mm/m64 |
Упаковать с насыщением беззнаковые слова |
PUNPCKHBW
mm, mm/m64 |
Распаковать старшие байты, слова, двойные слова |
PUNPCKLBW
mm, mm/m64 |
Распаковать младшие байты, слова, двойные слова |
Отдельно выделяется комманда emms, которая обеспечивает переход процессора от исполнения MMX-команд к исполнению обычных команд с плавающей запятой: она устанавливает значение 1 во всех разрядах слова состояния
Арифметика с насыщением
Речь идёт об операциях с насыщением (такие, как paddsb, paddsw, и т.д.)
Арифметика с насыщением - это версия арифметики, в которой все операции, такие как сложение и умножение, ограничены в фиксированный диапазон между минимальным и максимальным значением.
Если результат операции больше максимального, он устанавливается на максимум; если он ниже минимума, он ограничивается минимумом.
Пример:
76 + 31 = 100 (не 107, т.к. произошло насыщение)
88 * 91 = 100 (не 8008)
Постановка задачи
Для сравнения скорости работы, написанных на «чистом» Си и с использованием регистров MMX написать две программы, реализующие одинаковую логику и выводящие время своей работы.
Реализация программы
Программа написана в среде Microsoft Visual Studio.
В качестве интерфейса с инструкциями MMX выбрана реализация с ассемблерными вставками.
Программа складывает два массива, считает время работы выбранного метода (на ассемблерных вставках, на "чистом" Си) в тактах процессора.
Чтобы скомпилировать программу - нужно выбрать режим x86 в Visual Studio
Код программы вы можете найти на моём гитхабе.
Результат работы программы
Как видим, на сложение массивов, размером 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
Комментарии
Отправить комментарий