Иллюстрированный самоучитель по задачам и примерам Assembler

Примеры использования команд ХММ-расширения

Ниже будут рассмотрены несколько типовых примеров использования команд ХММ-расширения. Основная цель – демонстрация методики работы с основными группами команд ХММ-расширения. Начнем с реализации простейших операций – сложения и умножения.

Сложение и умножение двух упакованных ХММ-значений

Задача – вычислить скалярное произведение двух векторов, каждый из которых состоит из 4 вещественных чисел в коротком формате. Если в качестве таких векторов взять два вектора А и В, то их произведение вычисляется по формуле: АхВ = aoxbo+aixbi+a2xb2+a3xb3 – В программной реализации с использованием ХММ-команд это выглядит так, как показано ниже.

:prg10_02.asm – программа вычисления скалярного произведения двух векторов.
.data
xmm_pack_1 dd 1.0. 2.0. 3.0. 4.0
xmm_pack_2 dd 5.0. 6.0. 7.0. 8.0
rez_sum dd 0.0 результат сложения.
.code
movaps rxmmO.xrom_pack_l;RXMM0= 4.0. 3.0, 2.0, 1.0 mulps rxmm0.xinTi_pack_2
:RXMM0= 4.0x8.0. 3.0x7.0. 2.0x6.0, 1.0x5.0 movaps rxmml .rxmmO
:RXMM1= 4.0x8.0, 3.0x7.0. 2.0x6.0. 1.0x5.0
shufps rxmml.rxmml.4eh;RXMM1= 2.0x6.0, 1.0x5.0. 4.0x8.0. 3.0x7.0 addps rxmmO .rxmml:складываем:
;RXMM0= 4.0x8.0. 3.0x7.0. 2.0x6.0, 1.0x5.0
J +
:RXMM1= 2.0x6.0. 1.0x5.0. 4.0x8.0. 3.0x7.0
:RXMM0-4.0x8.0+2.0x6.0. 3.0x7.0+1.0x5.0, 2.0x6.0+4.0x8.0. 1.0x5.0+3.0x7.0
:или
;RXMM0= 44.0. 26.0, 44.0. 26.0
movaps rxmml, rxmmO:RXMM1= 44.0, 26.0, 44.0, 26.0
shufps rxmml.rxmml.llh:RXMM1= 26.0. 44.0. 26.0. 44.0
addps rxmmO .rxmml:складываем:;RXMM0= 44.0. 26.0. 44.0, 26.0
; +
;RXMM1= 26.0, 44.0, 26.0, 44.0
:RXMM0= 70.0. 70.0, 70.0, 70.0 сохраняем результат movss rez_sum.rxmm0

Умножение матрицы на вектор

Умножение матрицы на вектор – наиболее характерная операция для вычислений в области машинной графики. Существуют различные способы формирования трехмерного изображения. В наиболее простом случае изображение на экране задается в виде опорных точек. К примеру, рассмотрим случай, когда на экране дисплея находится трехмерное изображение, состоящее из отрезков прямых.

Необходимая для его формирования информация хранится в памяти как список опорных точек – концов отрезков. Если изображение дается в трехмерном изображении, то описание каждой точки удобно задать в виде четырехмерного вектора (х, у, z, w). Включение в трехмерный вектор (х, у, z) дополнительной координаты w объясняется тем, что проективные преобразования, необходимые для показа изображения с различных точек зрения, описываются матрицами 4x4. Поэтому для удобства реализации проективных преобразований, зачастую сопровождаемых операциями умножения матриц и векторов, трехмерный вектор (х, у, z) представляют в виде четырехмерного вектора (х, у, r, w), где значение w обычно принимается равным 1.

Для выполнения самого преобразования, подготовленная заранее матрица преобразования умножается на этот вектор, в результате чего получается четырехмерный вектор (х1, у', r, w'). Для обратного перехода к требуемому трехмерному вектору необходимо разделить координаты х', у', r на w', после чего удалить четвертую координату w'.

Матрица М преобразования и вектор V имеют следующий вид:

m00 m01 m02 m03 x
m10 m11 m12 m13 у
m20 m21 m22 m23 z
m30 m31 m32 m33 w=l

Преобразования координат выполняются по формулам:

х' xxm0o+yxni01+zxm02+lxm03
у' = xxm+yxnid+zxm+lxm
r' = xxm20+yxm21+zxm22+lxm23
w' = xxm30 +yxm31+zxm32+lxm33

Для получения преобразованных координат в виде трехмерного вектора (x,y,z) делим х', у', z' на w':

х = x'/w' = (ххт00+ухт01+гхт02+1хт0з)/(ххт30+ухт31+гхт32+1хт3з)
у = У'/w' = (xxmlo+yxm))+zxm,2+lxm13)/(xxm3O+yxm31+zxm32+lxm33)
z -z'/w' = (xxm20+yxm2i+zxm22+lxm23)/(xxm30+yxm31+zxm32+lxm33)

Элементы матрицы И векторов представлены числами с плавающей точкой в коротком вещественном формате (4 байта).

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.