Войти
ПрограммированиеФорумОбщее

Инверсия матрицы 4x4 (комментарии) (3 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#30
(Правка: 20:06) 20:04, 26 янв. 2020
У меня лично оптимизация на SIMD работает. В 3,5 раза короче и быстрее.

Заинтриговал.
У меня на SSE 171 асм строк.

Сколько асм команд у тебя eDmk ?

#31
20:46, 26 янв. 2020

eDmk
> На самом деле достаточно медленно.
Да, я проверил на MatrixInverse из D3DX, на i5-2400 за секунду больше 20 млн инверсий.

#32
21:57, 26 янв. 2020

в каком месте важна скорость обращения ?

#33
23:55, 26 янв. 2020
Да, я проверил на MatrixInverse из D3DX, на i5-2400 за секунду больше 20 млн инверсий.

Вот ! А на практике не больше десятка таких инверсий, а то и вовсе 2 раза на кадр.
#34
(Правка: 4:19) 4:02, 27 янв. 2020

ronniko
> Сколько асм команд у тебя eDmk ?
154

#35
(Правка: 7:59) 7:58, 27 янв. 2020
154

И они точно делают правильную инверсию матрицы ?! :)

Сравнивал результат с D3DXMatrixInverse(&inverseOut, Null, &View); ?
Что бы точно убедиться в правильности работы твоей инверсии.

#36
8:31, 27 янв. 2020

Смотрю тут, как крайтеки упоролись SSE

template<> ILINE f32 min(f32 v0, f32 v1)
{
  return _mm_cvtss_f32(_mm_min_ss(_mm_set_ss(v0), _mm_set_ss(v1)));
}
template<> ILINE f32 max(f32 v0, f32 v1)
{
  return _mm_cvtss_f32(_mm_max_ss(_mm_set_ss(v0), _mm_set_ss(v1)));
}
Неужели вызов 4 функций будет быстрее обычной проверки "a < b"?

#37
9:17, 27 янв. 2020

ronniko
> Сравнивал результат с D3DXMatrixInverse(&inverseOut, Null, &View); ?
Только нужно учесть, что там минорный вариант, транспонировать до и после.

#38
(Правка: 9:26) 9:25, 27 янв. 2020

eDmk а у тебя правосторонняя матрица инвертируется ?
У меня left hand matrix.

#39
(Правка: 10:22) 10:01, 27 янв. 2020

Зачем умножать матрицы в lookat?

Там же алгоритм куда проще:

mtx4 lookat(vec3 eye, vec3 at, vec3 up) {
  vec3 z = norm(eye - at);
  vec3 x = norm(cross(up, z));
  vec3 y = cross(z, x);

  return mtx4(
    vec4(x, -dot(eye, x)),
    vec4(y, -dot(eye, y)),
    vec4(z, -dot(eye, z)),
    vec4(0., 0., 0., 1.));
}

P.S. надеюсь не надо говорить, сколько здесь simd строк?

#40
(Правка: 10:22) 10:19, 27 янв. 2020

nes
> Неужели вызов 4 функций будет быстрее обычной проверки "a < b"?

Да, нет бранчей, и всей с этим связанной мути в процессоре.
Это в simd приводит к тому, что часто выгодно посчитать две ветки и выбрать нужную через blend.

#41
10:21, 27 янв. 2020

Truthfinder
> всей с этим связанной мути в процессоре
Какой мути? По идее кэшмисс здесь получить не реально. А значит вполне ровно будет всё работать.

#42
(Правка: 11:03) 10:25, 27 янв. 2020

@!!ex
> Какой мути?
branch prediction

> По идее кэшмисс здесь получить не реально. А значит вполне ровно
> будет всё работать.
условный переход и кешмисс это о разном

Поручишься за проц (а за разные серии, а за разные поколения, а за разных производителей)? Вообще то все оптимизации делаются через тесты. И там также наверняка заморочились.
Если ты сделал оптимизацию и не проверил тестами, то ты её делал зря. Это не про тебя лично если что, это в принципе про оптимизацию.

Также если там вычисления идут в simd сплошняком, то влезать туда обычными инструкциями для вычисления min/max тоже ну такое себе занятие, тока пайплайн ломать.

#43
(Правка: 11:19) 11:11, 27 янв. 2020

MrShoor
> Часть 3x3 с поворотом надо транспонировать. Часть со смещением умножить на
> минус 1

Я так понимаю это для ModelView матриц? Если так, то это сильно всё меняет в плане производительности в лучшую сторону.

Вот такое нашёл:

void invertMat(float m[16], float i[16]) {
  Vector t(m[12],m[13],m[14]);
  Vector o=Vector(
    dot(Vector(m[0],m[1],m[2]),t), 
            dot(Vector(m[4],m[5],m[6]),t), 
          dot(Vector(m[8],m[9],m[10]),t)); 

  i[0] =m[0]; i[1] =m[4]; i[2] =m[8]; i[3] =0;
  i[4] =m[1]; i[5] =m[5]; i[6] =m[9]; i[7] =0;
  i[8] =m[2]; i[9] =m[6]; i[10]=m[10];i[11]=0;
  i[12]=-o.x; i[13]=-o.y; i[14]=-o.z; i[15]=1;
}

Но просто минус 1 недостаточно. Надо либо умножать матрицы, либо через dot (что быстрее).

#44
(Правка: 11:39) 11:38, 27 янв. 2020

Truthfinder
Вариант для горзонтальных матриц:

+ Показать
Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее