Хочу еще напомнить, что D3DXMatrixMultiply есть несколько реализаций в зависимости от типа матрицы. Если используешь D3DXAMTRIXA16, то там выравнивание на 16 байт. Но оно вроде тока по Pentium 4 оптимизирует, насколько не врут доки.
А что, копилятор разве не раскладывает независимые инструкции в SSE?
Gurich
А можешь код показать? )
FearOfTheDark
> Поделитесь своими соображениями по этому поводу, или может быть методами?!)
IDA на d3dx9_42.dll ...
Код умножения матриц в d3dx9_42.dll находится по адресу 1002FA80.
В это ведь развернется код из нулевого поста. Который #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])) );
у них оптимизация флот операций быстрая
Project properties -> Code generation -> Foating Point Model -> Fast (/fp:fast)
если щас еще операция сложения быстрей умножения то можно попробовать использовать 'быстрое' перемножение векторов.
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 <- сложение с выталкиванием из стека там не ипользуеться стек хотя можно было хранить в стеке один вектор
susageP
>faddp <- сложение с выталкиванием из стека там не ипользуеться стек хотя можно было хранить в стеке один вектор
Disasm неверен? Или я неправильно понял где запятые должны стоять?
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
crsib
данная вариация, тоже уступает DX =\
Какие методы они вообще для своей функции использовали?! )
А в чём сложность посмотреть, как выглядит функция в дх?
Nevin
ток асемблером, но в идеале хотелось бы знать:
1) какие алгоритмы используют
2) какие технологии
чтобы потом еще где-нибудь применить... и вообще, не думаю, что там( в оригинале ) на чистом asm написано
http://democoder.ru/article/13 там пример на асм для матрица на вектор но в конце приписка "Надо заметить, что BatchMultiply5(mat, vin[4], vout[4], 4) может быть использовано для выполнения перемножения матриц размера 4x4."
Может луше подумать как сделать это на шейдерах?
susageP
а есть ли смысл загружать этим шейдеры?!...
можно, конечно, какой-нить OpenCL заюзать... но хотелось бы всетаки на ЦПУ, темолее возвращаясь к нашим баранам, Microsoft сделал хорошую функцию!
Встречная мысль!
сейчас нет возможности сравнить, будет ли быстрее использовать на ЦПУ:
D3DXMatrixMultiply(&OUT,&A,&B);
или же на ГПУ:
mul( A, B )
?!
может и правда, на ЦПУ только вращать и прочее, а умножать у же в шейдере( в вершинном к примеру, если матрицы для вершин :) )
Тема в архиве.