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

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

Страницы: 1 2 3 4 5 6 7 Следующая »
#15
18:12, 5 фев 2010

Хочу еще напомнить, что D3DXMatrixMultiply есть несколько реализаций в зависимости от типа матрицы. Если используешь D3DXAMTRIXA16, то там выравнивание на 16 байт. Но оно вроде тока по Pentium 4 оптимизирует, насколько не врут доки.

#16
18:17, 5 фев 2010

А что, копилятор разве не раскладывает независимые инструкции в SSE?

#17
21:57, 5 фев 2010

Gurich
А можешь код показать? )

#18
23:02, 5 фев 2010

FearOfTheDark
> Поделитесь своими соображениями по этому поводу, или может быть методами?!)
Изображение  IDA на d3dx9_42.dll ...

Код умножения матриц в d3dx9_42.dll находится по адресу 1002FA80.

#19
23:29, 5 фев 2010

В это ведь развернется код из нулевого поста. Который #1
Где то здесь однозначно подвох...

FearOfTheDark,
можешь погонять код из nebula device? Ну или его вариацию у меня?

matrix4x4       matrix4x4::operator * (const matrix4x4& mb) const
{
return matrix4x4(
                          _mm_add_ps(_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(row[0], row[0], _MM_SHUFFLE(0,0,0,0)), mb.row[0]), _mm_mul_ps(_mm_shuffle_ps(row[0], row[0], _MM_SHUFFLE(1,1,1,1)), mb.row[1])), _mm_mul_ps(_mm_shuffle_ps(row[0], row[0], _MM_SHUFFLE(2,2,2,2)), mb.row[2])), _mm_mul_ps(_mm_shuffle_ps(row[0], row[0], _MM_SHUFFLE(3,3,3,3)), mb.row[3])),
                          _mm_add_ps(_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(row[1], row[1], _MM_SHUFFLE(0,0,0,0)), mb.row[0]), _mm_mul_ps(_mm_shuffle_ps(row[1], row[1], _MM_SHUFFLE(1,1,1,1)), mb.row[1])), _mm_mul_ps(_mm_shuffle_ps(row[1], row[1], _MM_SHUFFLE(2,2,2,2)), mb.row[2])), _mm_mul_ps(_mm_shuffle_ps(row[1], row[1], _MM_SHUFFLE(3,3,3,3)), mb.row[3])),
                          _mm_add_ps(_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(row[2], row[2], _MM_SHUFFLE(0,0,0,0)), mb.row[0]), _mm_mul_ps(_mm_shuffle_ps(row[2], row[2], _MM_SHUFFLE(1,1,1,1)), mb.row[1])), _mm_mul_ps(_mm_shuffle_ps(row[2], row[2], _MM_SHUFFLE(2,2,2,2)), mb.row[2])), _mm_mul_ps(_mm_shuffle_ps(row[2], row[2], _MM_SHUFFLE(3,3,3,3)), mb.row[3])),
                          _mm_add_ps(_mm_add_ps(_mm_add_ps(_mm_mul_ps(_mm_shuffle_ps(row[3], row[3], _MM_SHUFFLE(0,0,0,0)), mb.row[0]), _mm_mul_ps(_mm_shuffle_ps(row[3], row[3], _MM_SHUFFLE(1,1,1,1)), mb.row[1])), _mm_mul_ps(_mm_shuffle_ps(row[3], row[3], _MM_SHUFFLE(2,2,2,2)), mb.row[2])), _mm_mul_ps(_mm_shuffle_ps(row[3], row[3], _MM_SHUFFLE(3,3,3,3)), mb.row[3]))
          );
#20
23:34, 5 фев 2010

у них оптимизация флот операций быстрая
Project properties -> Code generation -> Foating Point Model -> Fast (/fp:fast)

#21
0:14, 6 фев 2010

если щас еще операция сложения  быстрей умножения то можно попробовать использовать 'быстрое' перемножение векторов.

a0*b0+a1*b1+a2*b2+a3*b3 = (a0+b1)*(a1+b0)+(a2+b3)*(a3+b2)+Ac+Bc
где
Ac = -a0*a1-a2*a3
Bc = -b0*b1-b2*b3
итго
за место 4* и 3+ получили 2* и 7+.
для матрицы
за место 64* и 48+ получим (32)* и (112)+ и еще 16* и 8+ для подсчета Ac и Bc

для перемножении матриц может насовсем подходит а вот для матрицы на вектор идеально учитывая что Ac нужно посчитать один разв а для вектора если он статичный Bc можно посчитать заранее.

FalconVVS
faddp <- сложение с выталкиванием из стека  там не ипользуеться стек хотя можно было хранить в стеке один вектор

#22
0:19, 6 фев 2010

susageP
>faddp <- сложение с выталкиванием из стека там не ипользуеться стек хотя можно было хранить в стеке один вектор
Disasm неверен? Или я неправильно понял где запятые должны стоять?

#23
0:26, 6 фев 2010

FalconVVS
>>faddp <- сложение с выталкиванием из стека там не ипользуеться стек хотя можно было хранить в стеке один вектор
>Disasm неверен? Или я неправильно понял где запятые должны стоять?

faddp <- сложение с выталкиванием из стека.
Они не используют стек хотя можно было хранить в стеке один вектор.

_11 = (_11*_mat._11) + (_12*_mat._21) + (_13*_mat._31)+ (_14*_mat._31);
_12 = (_11*_mat._12) + (_12*_mat._22) + (_13*_mat._32)+ (_14*_mat._32);
_13 = (_11*_mat._13) + (_12*_mat._23) + (_13*_mat._33)+ (_14*_mat._33);
_14 = (_11*_mat._14) + (_12*_mat._24) + (_13*_mat._34)+ (_14*_mat._34);

можно было в стекe FPU  хоронить _11,_12,_13,_14

#24
1:31, 6 фев 2010

crsib
данная вариация, тоже уступает DX =\


Какие методы они вообще для своей функции использовали?! )

#25
1:58, 6 фев 2010

А в чём сложность посмотреть, как выглядит функция в дх?

#26
2:24, 6 фев 2010

Nevin
ток асемблером, но в идеале хотелось бы знать:
1) какие алгоритмы используют
2) какие технологии

чтобы потом еще где-нибудь применить... и вообще, не думаю, что там( в оригинале ) на чистом asm написано

#27
2:40, 6 фев 2010

http://democoder.ru/article/13  там пример на асм для матрица на вектор но в конце приписка  "Надо заметить, что BatchMultiply5(mat, vin[4], vout[4], 4) может быть использовано для выполнения перемножения матриц размера 4x4."
Может луше подумать как сделать это на шейдерах?

#28
2:44, 6 фев 2010

susageP
а есть ли смысл загружать этим шейдеры?!...

можно, конечно, какой-нить OpenCL заюзать... но хотелось бы всетаки на ЦПУ, темолее возвращаясь к нашим баранам, Microsoft сделал хорошую функцию!

#29
2:57, 6 фев 2010

Встречная мысль!

сейчас нет возможности сравнить, будет ли быстрее использовать на ЦПУ:

D3DXMatrixMultiply(&OUT,&A,&B);

или же на ГПУ:

mul( A, B )

?!


может и правда, на ЦПУ только вращать и прочее, а умножать у же в шейдере( в вершинном к примеру, если матрицы для вершин :) )

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

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