ПрограммированиеФорумГрафика

Перемножение матриц( почему-то D3DXMatrixMultiply все-равно быстрее?!) (7 стр)

Страницы: 1 2 3 4 5 6 7
#90
17:08, 7 фев 2010

ну вот ДХ не инлайнится но всёже быстрее ))

#91
17:27, 7 фев 2010

Smouking
он быстрей, при левых тестах))
а так, он медленнее раза в 3...5 получается( в зависимости от функций )
D3DXQUATERNION  - вообще тормозная штука.
у D3DXMATRIX - только D3DXMatrixMultiply более-менее, хотя тоже не дотягивает( но там, действительно дело в инлайне, т.е. у себя его затираешь и время выполнения примерно равное получается )


p.s. хотя, честно говоря, самому охота от него( инлайн ) избавится, чтобы движок не стал Open Source =), но без него FPS меньше =\

#92
17:57, 7 фев 2010

Aldaron
Поворот - сам по себе тяжелая операция, хоть с D3DX хоть нет.  А ты как поворачиваешь модель ?

#93
0:47, 8 фев 2010

ksacvet777
модель?! Кватернионами, и их же передаю шейдеру( или же получаю из них World матрицу, у меня тут несколько реализаций )

#94
13:28, 3 мар 2010

Вопрос:
Почему никто не использует SSE3? Там есть замечательная команда: _mm_hadd_ps С ее помощью можно ускорить DOT векторов и умножение матриц.
Нечто типа:

    TH_FINLINE Matrix Multiply(const Matrix& M1, const Matrix& M2)
    {
              //Транспонируем M2
              TH_VECTOR vTemp1 = _mm_shuffle_ps(M2.r[0],M.2r[1],_MM_SHUFFLE(1,0,1,0));
              TH_VECTOR vTemp3 = _mm_shuffle_ps(M2.r[0],M2.r[1],_MM_SHUFFLE(3,2,3,2));
              TH_VECTOR vTemp2 = _mm_shuffle_ps(M2.r[2],M2.r[3],_MM_SHUFFLE(1,0,1,0));
              TH_VECTOR vTemp4 = _mm_shuffle_ps(M2.r[2],M2.r[3],_MM_SHUFFLE(3,2,3,2));
              TH_VECTOR vTemp0 = _mm_shuffle_ps(vTemp1, vTemp2,_MM_SHUFFLE(2,0,2,0));
              vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2,_MM_SHUFFLE(3,1,3,1));
              vTemp2 = _mm_shuffle_ps(vTemp3, vTemp4,_MM_SHUFFLE(2,0,2,0));
              vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4,_MM_SHUFFLE(3,1,3,1));
              //Умножаем строка на строку
              return Matrix(
 _mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[0],vTemp0),_mm_mul_ps(M1.r[0],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[0],vTemp2),_mm_mul_ps(M1.r[0],vTemp3))),
_mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[1],vTemp0),_mm_mul_ps(M1.r[1],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[1],vTemp2),_mm_mul_ps(M1.r[1],vTemp3))),
_mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[2],vTemp0),_mm_mul_ps(M1.r[2],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[2],vTemp2),_mm_mul_ps(M1.r[2],vTemp3))),
_mm_hadd_ps(_mm_hadd_ps(_mm_mul_ps(M1.r[3],vTemp0),_mm_mul_ps(M1.r[3],vTemp1)),_mm_hadd_ps(_mm_mul_ps(M1.r[3],vTemp2),_mm_mul_ps(M1.r[3],vTemp3))));
   }

В сравнении с вариантом из поста #19 экономим 8 shuffle.

DOT:

  TH_FINLINE static Vector4  Dot(const Vector4& V1, const Vector4& V2)
  {
    TH_VECTOR vTemp2 = V2.v;
    TH_VECTOR vTemp = _mm_mul_ps(V1.v,vTemp2);    //w1*w2 z1*z2 y1*y2 x1*x2
    vTemp2 = _mm_hadd_ps(vTemp2,vTemp2);            //w+z y+x w+z y+x
    vTemp2 = _mm_hadd_ps(vTemp2,vTemp2);            //w+z+y+x w+z+y+x w+z+y+x w+z+y+x
    return Vector4(vTemp2);
            }

В сравнении с обычной реализацией на SSE/SSE2 экономится 3 shuffle

#95
14:13, 3 мар 2010

еще можно оптимизировать не само умножение матриц (общий случай), а преобразования

например, есть матрица, хотим ее сдвинуть (translate)
в данном случае, можно получить матрицу трансляции и перемножить
такое умножение займет (без MMX\SSE) 64*48+
а можно дописать метод postTranslate( x, y, z ) - которая будет сдвигать матрицу-this за 12*12+
аналогично с масштабированием и вращениями по основным осям

#96
21:57, 3 мар 2010

Я конечно извиняюсь, что встреваю в ваш разговор, но разве ДХ делает перемножение не на вершинном шейдере? В этом случае там по умолчанию перемножение должно быть бестрее.

#97
22:04, 3 мар 2010

dave
> Я конечно извиняюсь, что встреваю в ваш разговор, но разве ДХ делает
> перемножение не на вершинном шейдере? В этом случае там по умолчанию
> перемножение должно быть бестрее.

в перлы?

#98
22:09, 3 мар 2010

А хотя, если он функцию использует, то наверное на процессоре считает.

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорумГрафика

Тема в архиве.