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




Лабораторная работа №6

Расширение IA MMX.

Теоретическая часть

Начиная с модификации процессора Pentium P54C, все процессоры Intel содержат расширение ММХ, предназначенное для увеличения эффективности программ, работающих с большими потоками данных (обработка изображений, звука, видео, синтез), то есть для всех тех случаев, когда нужно выполнить несложные операции над массивами однотипных чисел. ММХ предоставляет несколько новых типов данных, регистров и команд, позволяющих осуществлять арифметические и логические операции над несколькими числами одновременно.

Регистры ММХ

Расширение ММХ включает в себя восемь 64-битных регистров общего пользования ММ0 - ММ7, показанных на рис. 1.

Рис. 1. Регистры MMX

Физически никаких новых регистров с введением ММХ не появилось, ММ0 - ММ7 - это в точности мантиссы восьми регистров FPU, от R0 до R7. При записи числа в регистр ММХ оно оказывается в битах 63-0 соответствующего регистра FPU, а экспонента (биты 78-64) и ее знаковый бит (бит 79) заполняются единицами. Запись числа в регистр FPU также приводит к изменению соответствующего регистра ММХ. Любая команда ММХ, кроме EMMS, приводит к тому, что поле ТОР регистра SR и весь регистр TW в FPU обнуляются. Команда EMMS заполняет регистр TW единицами. Таким образом, нельзя одновременно пользоваться командами для работы с числами с плавающей запятой и командами ММХ, а если это необходимо - следует применять команды FSAVE/FRSTOR каждый раз перед переходом от FPU к ММХ и обратно (эти команды сохраняют состояние регистров ММХ точно так же, как и FPU).

2. Типы данных ММХ

ММХ использует четыре новых типа данных:

  • учетверенное слово — простое 64-битное число;
  • упакованные двойные слова - два 32-битных двойных слова, упакованные в 64-битный тип данных. Двойное слово 1 занимает биты 63—32, и двойное слово 0 - биты 31-0;
  • упакованные слова - четыре 16-битных слова, упакованные в 64-битный тип данных. Слово 3 занимает биты 63-48, слово 0 - биты 15-0;
  • упакованные байты - восемь байт, упакованных в 64-битный тип данных.

Байт 7 занимает биты 63-56, байт 0 - биты 7-0.

Команды ММХ перемещают упакованные данные в память или в обычные регистры как целое, но выполняют арифметические и логические операции над каждым элементом по отдельности.

Арифметические операции в ММХ могут использовать специальный способ обработки переполнений и антипереполнений - насыщение. Если результат операции больше, чем максимальное значение для его типа данных (+127 для байта со знаком), то результат подразумевают равным этому максимальному значению.

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

3. Команды пересылки данных ММХ

Команда Назначение Процессор
MOVDприемник, источник Пересылка двойных слов ММХ

Команда копирует двойное слово из источника (регистр ММХ, обычный регистр или переменная) в приемник (регистр ММХ, обычный регистр или переменная, но один из операндов обязательно должен быть регистром ММХ). Если приемник - регистр ММХ, двойное слово записывается в его младшую половину (биты 31-0), а старшая заполняется нулями. Если источник - регистр ММХ, в приемник записывается младшее двойное слово этого регистра.

Команда Назначение Процессор
MOVQприемник, источник Пересылка учетверенных слов ММХ

Копирует учетверенное слово (64 бита) из источника (регистр ММХ или переменная) в приемник (регистр ММХ или переменная, оба операнда не могут быть переменными).

4. Команды преобразования типов ММХ

Команда Назначение Процессор
PACKSSWBприемник, источник PACKSSDW приемник, источник Упаковка со знаковым насыщением ММХ

Команды упаковывают, и насыщает слова со знаком в байты (PACKSSWB) или двойные слова со знаком в слова (PACKSSDW). Команда PACKSSWB копирует четыре слова (со знаком), находящиеся в приемнике (регистр ММХ), в 4 младших байта (со знаком) приемника и копирует четыре слова (со знаком) из источника (регистр ММХ или переменная) в старшие четыре байта (со знаком) приемника.

Если значение какого-нибудь слова больше +127 (7Fh) или меньше -128 (80h), в байты помещаются числа +127 и -128 соответственно. Команда PACKSSDW аналогично копирует два двойных слова из приемника в два младших слова приемника и два двойных слова из источника в два старших слова приемника. Если значение какого-нибудь двойного слова больше +32 767 (7FFFH) или меньше -32 768 (8000h), в слова помещаются числа +32 767 и -32 768 соответственно.

Команда Назначение Процессор
PACKUSWBприемник, источник Упаковка с беззнаковым насыщением ММХ

Копирует четыре слова (со знаком), находящиеся в приемнике (регистр ММХ), в 4 младших байта (без знака) приемника и копирует четыре слова (со знаком) из источника (регистр ММХ или переменная) в старшие четыре байта (без знака) приемника. Если значение какого-нибудь слова больше 255 (0FFh) или меньше 0 (00h), в байты помещаются числа 255 и 0 соответственно.

Команда Назначение Процессор
PUNPCKHBWприемник, источник   PUNPCKHWDприемник, источник   PUNPCKHDQприемник, источник Распаковка и объединение старших элементов Распаковка и объединение старших элементов Распаковка и объединение старших элементов ММХ   ММХ   ММХ

Команды распаковывают старшие элементы источника (регистр ММХ или переменная) и приемника (регистр ММХ) и записывают их в приемник через один (см. рис. 2).

Рис. 2. Действие команды PUNPCKHBW

Команда PUNPCKHBW объединяет по 4 старших байта источника и приемника, команда PUNPCKHWD - по 2 старших слова, а команда PUNPCKHDQ копирует в приемник по одному старшему двойному слову из источника и приемника.

Если источник содержит нули, эти команды фактически переводят старшую половину приемника из одного формата данных в другой, дополняя увеличиваемые элементы нулями. PUNPCKHBW переводит упакованные байты в упакованные слова, PUNPCKHWD - слова в двойные слова, a PUNPCKHDQ - единственное старшее двойное слово приемника в учетверенное.

Команда Назначение Процессор
PUNPCKLBW приемник, источник   PUNPCKLWD приемник, источник   PUNPCKLDQ приемник, источник Распаковка и объединение младших элементов Распаковка и объединение младших элементов Распаковка и объединение младших элементов ММХ   ММХ   ММХ

Команды распаковывают младшие элементы источника (регистр ММХ или переменная) и приемника (регистр ММХ) и записывают их в приемник через один аналогично предыдущим командам. Команда PUNPCKLBW объединяет по 4 младших байта источника и приемника, команда PUNPCKLWD объединяет по 2 младших слова, а команда PUNPCKLDQ копирует в приемник по одному младшему двойному слову из источника и приемника. Если источник содержит только нули, эти команды, аналогично PUNPCKH*, фактически переводят младшую половину приемника из одного формата данных в другой, дополняя увеличиваемые элементы нулями.

5. Арифметические операции ММХ

Команда Назначение Процессор
PADDBприемник, источник PADDWприемник, источник PADDDприемник, источник Сложение Сложение Сложение ММХ ММХ ММХ

Команды выполняют сложение отдельных элементов данных (байтов – для PADDB, слов - для PADDW, двойных слов - для PADDD) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при сложении возникает перенос, он не влияет ни на следующие элементы, ни на флаг переноса, а просто игнорируется (так что, например, для PADDB 255 +1 = 0, если это числа без знака, или -128 + -1 = +127, если со знаком).

 

Команда Назначение Процессор
PADDSBприемник, источникPADDSWприемник, источник Сложение с насыщением ММХ Сложение с насыщением ММХ ММХ ММХ

Команды выполняют сложение отдельных элементов данных (байтов – для PADDSB и слов - для PADDSW) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при сложении сумма выходит за пределы байта со знаком для PADDSB (больше +127 или меньше -128) или слова со знаком для PADDSW (больше +32 767 или меньше -32 768), в качестве результата используется соответствующее максимальное или минимальное число; так что, например, для PADDSB -128 + -1 = -128.

Команда Назначение Процессор
PADDUSBприемник, источник PADDUSW приемник, источник Беззнаковое сложение с насыщением Беззнаковое сложение с насыщением ММХ ММХ

Команды выполняют сложение отдельных элементов данных (байтов – для PADDUSB и слов - для PADDUSW) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при сложении сумма выходит за пределы байта без знака для PADDUSB (больше 255 или меньше 0) или слова без знака для PADDUSW (больше 65 535 или меньше 0), то в качестве результата используется соответствующее максимальное или минимальное число; так что, например, для PADDUSB 255 + 1 = 255.

Команда Назначение Процессор
PSUBBприемник, источник PSUBW приемник, источник PSUBD приемник, источник Вычитание Вычитание Вычитание ММХ ММХ ММХ

Команды выполняют вычитание отдельных элементов данных (байтов – для PSUBB, слов - для PSUBW, двойных слов - для PSUBD) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при вычитании возникает заем, он игнорируется (так что, например, для PSUBB -128 - 1 = +127 - применительно к числам со знаком или 0 - 1 = 255 - применительно к числам без знака).

Команда Назначение Процессор
PSUBSBприемник, источник PSUBSW приемник, источник Вычитание с насыщением Вычитание с насыщением ММХ ММХ

Команды выполняют вычитание отдельных элементов данных (байтов – для PSUBSB и слов - для PSUBSW) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при вычитании разность выходит за пределы байта или слова со знаком, в качестве результата используется соответствующее максимальное или минимальное число; так что, например, для PSUBSB -128 - 1 = -128.

Команда Назначение Процессор
PSUBUSB приемник, источник   PSUBUSWприемник, источник Беззнаковое вычитание с насыщением Беззнаковое вычитание с насыщением ММХ   ММХ

Команды выполняют вычитание отдельных элементов данных (байтов — для PSUBUSB и слов - для PSUBUSW) источника (регистр ММХ или переменная) и соответствующих элементов приемника (регистр ММХ). Если при вычитании разность выходит за пределы байта или слова без знака, в качестве результата используется соответствующее максимальное или минимальное число; так что, например, для PSUBUSB 0-1 = 0.

Команда Назначение Процессор
PMULHW приемник, источник Старшее умножение ММХ

Команда умножает каждое из четырех слов со знаком из источника (регистр ММХ или переменная) на соответствующее слово со знаком из приемника (регистр ММХ). Старшее слово каждого из результатов записывается в соответствующую позицию приемника.

Команда Назначение Процессор
PMULLWприемник, источник Младшее умножение ММХ

Умножает каждое из четырех слов со знаком из источника (регистр ММХ или переменная) на соответствующее слово со знаком из приемника (регистр ММХ). Младшее слово каждого из результатов записывается в соответствующую позицию приемника.

Команда Назначение Процессор
PMADDWDприемник, источник Умножение и сложение ММХ

Умножает каждое из четырех слов со знаком из источника (регистр ММХ или переменная) на соответствующее слово со знаком из приемника (регистр ММХ).

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

6. Команды сравнения ММХ

Команда Назначение Процессор
PCMPEQBприемник, источник PCMPEQW приемник, источник PCMPEQDприемник, источник Проверка на равенство Проверка на равенство Проверка на равенство ММХ ММХ ММХ

Команды сравнивают индивидуальные элементы данных (байты - в случае PCMPEQB, слова - в случае PCMPEQW, двойные слова - в случае PCMPEQD) источника (регистр ММХ или переменная) с элементами приемника (регистр ММХ). Если пара сравниваемых элементов равна, соответствующий элемент приемника заполняется единицами, если они не равны - элемент заполняется нулями.

Команда Назначение Процессор
PCMPGTBприемник, источник PCMPGTWприемник, источник PCMPGTDприемник, источник Сравнение Сравнение Сравнение ММХ ММХ ММХ

Команды сравнивают индивидуальные элементы данных (байты - в Случае PCMPGTB, слова - в случае PCMPGTW, двойные слова - в случае PCMPGTD) источника (регистр ММХ или переменная) с элементами приемника (регистр ММХ). Если элемент приемника больше, чем соответствующий элемент Источника, все биты в этом элементе приемника устанавливаются в единицы. Если элемент приемника меньше или равен элементу источника, он обнуляется.

7. Логические операции ММХ

Команда Назначение Процессор
PANDприемник, источник Логическое И ММХ ММХ ММХ

Команда выполняет побитовое «логическое И» над источником (регистр ММХ или переменная) и приемником (регистр ММХ) и сохраняет результат в приемнике.

Каждый бит результата устанавливается в 1, если соответствующие биты в обоих операндах равны 1, в противном случае бит сбрасывается в 0.

Команда Назначение Процессор
PANDNприемник, источник Логическое НЕ-И (штрих Шеффера) ММХ

Выполняет побитовое «логическое НЕ» (то есть инверсию битов) над приемником (регистр ММХ) и затем побитовое «логическое И» над приемником и источником (регистр ММХ или переменная). Результат сохраняется в приемнике. Каждый бит результата устанавливается в 1, только если соответствующий бит источника был равен 1, а приемника - 0, иначе бит сбрасывается в 0. Эта дорическая операция называется также штрихом Шеффера.

Команда Назначение Процессор
POR приемник, источник Логическое ИЛИ ММХ

Выполняет побитовое «логическое ИЛИ» над источником (регистр ММХ или переменная) и приемником (регистр ММХ) и сохраняет результат в приемнике. Каждый бит результата сбрасывается в 0, если соответствующие биты в обоих операндах равны 0, в противном случае бит устанавливается в 1.

Команда Назначение Процессор
PXORприемник, источник Логическое исключающее ИЛИ ММХ

Выполняет побитовое «логическое исключающее ИЛИ» над источником (регистр ММХ или переменная) и приемником (регистр ММХ) и сохраняет результат в приемнике. Каждый бит результата устанавливается в 1, если соответствующие биты в обоих операндах равны, иначе бит сбрасывается в 0.

8. Сдвиговые операции ММХ

Команда Назначение Процессор
PSLLWприемник, источник PSLLDприемник, источник PSLLQприемник, источник Логический сдвиг влево Логический сдвиг влево Логический сдвиг влево ММХ ММХ ММХ

Команды сдвигают влево биты в каждом элементе (в словах - для PSLLW, в двойных словах - для PSLLD, во всем регистре - для PSLLQ) приемника (регистр ММХ) на число битов, указанное в источнике (8-битное число, регистр ММХ или переменная). При сдвиге младшие биты заполняются нулями, так что, например, команды

обнуляют регистр ММ0.

Команда Назначение Процессор
PSRLWприемник, источник PSRLDприемник, источник PSRLQприемник, источник Логический сдвиг вправо Логический сдвиг вправо Логический сдвиг вправо ММХ ММХ ММХ

Команды сдвигают вправо биты в каждом элементе (в словах - для PSRLW, в двойных словах - для PSRLD, во всем регистре - для PSRLQ) приемника (регистр ММХ) на число битов, указанное в источнике (8-битное число, регистр ММХ или переменная). При сдвиге старшие биты заполняются нулями.

Команда Назначение Процессор
PSRAWприемник, источник PSRADприемник, источник Арифметический сдвиг вправо Арифметический сдвиг вправо ММХ ММХ

Команды сдвигают вправо биты в каждом элементе (в словах - для PSRAW и в двойных словах - для PSRAD) приемника (регистр ММХ) на число битов, указанное в источнике (8-битное число, регистр ММХ или переменная). При сдвиге самый старший (знаковый) бит используется для заполнения пустеющих старших битов, так что фактически происходит знаковое деление на 2 в степени, равной содержимому источника.

9. Команды управления состоянием ММХ

Команда Назначение Процессор
EMMS Освободить регистры ММХ ММХ

Если выполнялись какие-нибудь команды ММХ (кроме EMMS), все регистры FPU помечаются как занятые (в регистре TW). Команда EMMS помечает все регистры FPU как пустые для того, чтобы после завершения работы с ММХ можно было передать управление процедуре, использующей FPU.

Расширение AMD 3D

Процессоры AMD, начиная с AMD Кб 3D, поддерживают дополнительное расширение набора команд ММХ. В AMD 3D вводится новый тип данных – упакованные 32-битные вещественные числа, определяются новые команды (начинающиеся с PF) и несколько дополнительных команд для работы с обычными ММХ-типами данных:

  • PI2FD приемник,источник - преобразовывает упакованные 32-битные целые со знаком (двойные слова) в упакованные вещественные числа;
  • PF2ID приемник,источник - преобразовывает упакованные вещественные в упакованные целые числа со знаком (преобразование с насыщением);
  • PAVGUSB приемник,источник - вычисляет средние арифметические для упакованных 8-битных целых чисел без знака;
  • PMULHRW приемник,источник — перемножает упакованные 16-битные целые со знаком и сохраняет результаты как 16-битные целые в приемнике (при переполнениях выполняется насыщение);
  • PFACC приемник,источник - сумма вещественных чисел в приемнике помещается в младшую половину приемника, сумма вещественных чисел из источника помещается в старшую половину приемника;
  • PFADD приемник,источник - сложение упакованных вещественных чисел;
  • PFSUB приемник,источник - вычитание упакованных вещественных чисел;
  • PFSUBR приемник,источник - обратное вычитание (приемник из источника) упакованных вещественных чисел;
  • PFMUL приемник,источник - умножение упакованных вещественных чисел.

Набор команд для быстрого вычисления по итерационным формулам:

Быстрое деление:

Быстрое вычисление квадратного корня:

  • PFCMPEQ приемник, источник - проверка равенства для упакованных вещественных чисел (полностью аналогично PCMPEQW);
  • PFCMPGE приемник, источник - сравнение упакованных вещественных чисел: если число в приемнике больше или равно числу в источнике, все его биты устанавливаются в 1;
  • PFCMPGT приемник, источник - сравнение упакованных вещественных чисел: если число в приемнике больше числа в источнике, все его биты устанавливаются в 1;
  • PFMAX приемник, источник - сохраняет в приемнике максимальное из каждой пары сравниваемых вещественных чисел;
  • PFMIN приемник, источник - сохраняет в приемнике минимальное из каждой пары сравниваемых вещественных чисел;
  • FEMMS - более быстрая версия команды EMMS;
  • PREFETCH источник - заполняет строку кэша L1 из памяти по адресу, указанному источником;
  • PREFETCHW источник - заполняет строку кэша L1 из памяти по адресу, указанному источником, и помечает как модифицированную.

Практическая часть.

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: