Скачиваний:
28
Добавлен:
15.06.2014
Размер:
190.46 Кб
Скачать

1. Скалярное произведение векторов. Эта операция часто используется в приложениях линейной алгебры и цифровой обработки сигналов.

Скалярное произведение a·b векторов ak и bk (k = 1,..., n) вычисляется так:

a·b = a1b1 + a2b2 + ... + anbn

С помощью MMX-команд можно быстро вычислять скалярное произведение векторов. Пусть векторы состоят из 16-разрядных слов и находятся в памяти по адресам a_vector и b_vector. Программа будет выполнять следующие шаги:

  1. Скопировать 4 слова первого вектора в MMX-регистр командой movq.

  2. Скопировать 4 слова второго вектора в MMX-регистр.

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

  4. Добавить результаты шага 3 к ранее накопленным суммам командой paddd.

  5. Повторить эти шаги для всех слов исходных векторов.

  6. Сохранить частичные суммы в MMX-регистре.

  7. Выполнить сдвиг результата вправо с помощью команды psrlq.

  8. Сложить сохраненные частичные суммы с результатм последнего шага с помощью команды paddd.

  9. Поместить результат в память, используя команду movd.

Задание №1. Реализуйте функцию, которая принимает в качестве параметров адреса двух векторов и количество элементов векторов. Функция возвращает скалярное произведение этих векторов.

2. Условный выбор фрагмента изображения. MMX-команды помогают разрабатывать более эффективные программы компьютерной графики и обработки видеоизображений, во многих случаях позволяя избежать условных переходов. Например, для выделения графического объекта и наложения его на неоднородный фон можно воспользоваться следующими командами:

  1. Сформировать маску сравнением цвета точек верхней картинки с синим цветом командой pcmpeqb.

  2. Командой pand присвоить значение 0 всем точкам сцены, на которые будет наложен объект «Герой».

  3. Командой pandn присвоить значение 0 всем синим точкам исходной картинки с «Героем».

  4. Выполнить наложение точек объекта на фон командой por.

Объект «Герой»

Фон

Результат наложения

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

  1. Команда pcmpeqb формирует маску: точки, соответствующие «Герою» заполняются нулями, а окружающие точки – единицами.

  1. Команда pand присваивает значение 0 всем точкам фона, на которые попадет «Герой».

  1. Команда pandn присваивает значение 0 всем синим точкам картинки с «Героем».

  1. Команда por выполняет наложение «Героя» на фон.

Задание №2. Сформируйте файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне, выполненные символами псевдографики. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.

3. Распаковка с «размножением» знакового бита. Часто бывает нужно преобразовать короткие данные в более длинные. Если это слова без знака, можно воспользоваться одной из команд группы punpck, позаботившись, чтобы в старшие разряды результатов сразу попали нули. Если же надо повысить разрядность слов со знаком, можно действовать следующим образом:

  1. Распаковать слова из младших 32 разрядов командой punpcklwd, так, чтобы знаковый бит попал в самый старший разряд двойного слова-результата (см. рисунок).

  2. Распаковать слова из старших 32 разрядов командой punpckhwd (в другой регистр).

  3. Выполнить арифметический сдвиг полученных двойных слов направо командой psrad. При этом знаковый бит в каждом слове размножится, и 32-разрядные слова со знаком будут иметь те же численные значения, что и исходные 16-разрядные слова со знаком.

Задание №3. Написать функцию на языке С, которая получает в качестве параметров адрес вектора слов, адрес вектора двойных слов и количество элементов в них. Функция преобразовывает слова первого вектора в двойные слова и помещает результат во второй вектор.

4. Абсолютные величины разностей. Абсолютные величины разностей чисел используются как мера различия в алгоритмах сжатия и распознавания. MMX-команды помогут Вам быстро вычислять эти величины. Идея программы проста:

  1. Скопировать элементы исходных векторов из памяти в MMX-регистры командой movq.

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

  3. Таким же образом вычесть элементы первого вектора из элементов второго. Там, где в предыдущем случае получились нули, теперь будут неотрицательные разности.

  4. Вычислить поразрядное логическое ИЛИ от результатов шагов 2 и 3. При этом из каждой пары элементов данных на входе ИЛИ в выходной операнд попадет тот, который не равен нулю. Это и требовалось.

Задание №4. Написать функцию на языке С, которая получает в качестве параметров адреса трех векторов. Функция вычисляет абсолютные величины разностей элементов первых двух векторов и помещает результат в третий.

5. Реализация быстрого наложения картинки (спрайта) на другую. Байты изображения складываются с уже имеющимися байтами на другом изображении:

movd mm0,[edi] ; загрузка четырех байт из изображения

movd mm1,[ebx] ; загрузка четырех байт спрайта

paddusb mm0,mm1 ; сложение их с проверкой переполнения на 255

movd [edi],mm0 ; поместить эти четыре байта обратно в изображение

add ebx,4 ; следующие байты спрайта

add edi,4 ; следующие байты изображения

Задание №5. Сформируйте BMP-файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.

6. Вывод картинки (спрайтов) с прозрачностью. Вывод только тех байтов, чьи значения не равны константе прозрачности (этот метод используется практически во всех современных 2D-играх).

pxor mm2,mm2 ; обнуляем регистр mm2

movd mm0,[ebx] ; загрузка четырех байт спрайта

movd mm1,[esi] ; загрузка четырех байт фона

pcmpeqb mm2,mm0 ; делаем маску тех байт которые надо вывести

pand mm2,mm1 ; обнуляем ненужные

por mm1,mm0 ; складываем их с нашими байтами спрайта

movd [esi],mm1 ; кладем их обратно на изображение

add ebx,4

add esi,4

Задание №6. Сформируйте BMP-файлы с произвольной картинкой и файл с некоторым фрагментом на однородном фоне. Размеры файлов должны быть кратны 8 и совпадать. Напишите программу, которая читает эти файлы в память, выполняет наложение фрагмента на картинку и записывает результат в другой файл.