Примеры использования команд ХММ-расширения
Ниже будут рассмотрены несколько типовых примеров использования команд ХММ-расширения. Основная цель – демонстрация методики работы с основными группами команд ХММ-расширения. Начнем с реализации простейших операций – сложения и умножения.
Сложение и умножение двух упакованных ХММ-значений
Задача – вычислить скалярное произведение двух векторов, каждый из которых состоит из 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 байта).
Ниже приведены два варианта программы умножения матрицы на вектор – один с использованием стандартного сопроцессора, другой с использованием команд ХММ-расширения (с помощью профайлера можно сравнить скорость преобразования). Результирующий трехмерный вектор замещает исходный.