У меня лично оптимизация на SIMD работает. В 3,5 раза короче и быстрее.
Заинтриговал.
У меня на SSE 171 асм строк.
Сколько асм команд у тебя eDmk ?
eDmk
> На самом деле достаточно медленно.
Да, я проверил на MatrixInverse из D3DX, на i5-2400 за секунду больше 20 млн инверсий.
в каком месте важна скорость обращения ?
Да, я проверил на MatrixInverse из D3DX, на i5-2400 за секунду больше 20 млн инверсий.
Вот ! А на практике не больше десятка таких инверсий, а то и вовсе 2 раза на кадр.
ronniko
> Сколько асм команд у тебя eDmk ?
154
154
И они точно делают правильную инверсию матрицы ?! :)
Сравнивал результат с D3DXMatrixInverse(&inverseOut, Null, &View); ?
Что бы точно убедиться в правильности работы твоей инверсии.
Смотрю тут, как крайтеки упоролись 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"?
ronniko
> Сравнивал результат с D3DXMatrixInverse(&inverseOut, Null, &View); ?
Только нужно учесть, что там минорный вариант, транспонировать до и после.
eDmk а у тебя правосторонняя матрица инвертируется ?
У меня left hand matrix.
Зачем умножать матрицы в 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 строк?
nes
> Неужели вызов 4 функций будет быстрее обычной проверки "a < b"?
Да, нет бранчей, и всей с этим связанной мути в процессоре.
Это в simd приводит к тому, что часто выгодно посчитать две ветки и выбрать нужную через blend.
Truthfinder
> всей с этим связанной мути в процессоре
Какой мути? По идее кэшмисс здесь получить не реально. А значит вполне ровно будет всё работать.
@!!ex
> Какой мути?
branch prediction
> По идее кэшмисс здесь получить не реально. А значит вполне ровно
> будет всё работать.
условный переход и кешмисс это о разном
Поручишься за проц (а за разные серии, а за разные поколения, а за разных производителей)? Вообще то все оптимизации делаются через тесты. И там также наверняка заморочились.
Если ты сделал оптимизацию и не проверил тестами, то ты её делал зря. Это не про тебя лично если что, это в принципе про оптимизацию.
Также если там вычисления идут в simd сплошняком, то влезать туда обычными инструкциями для вычисления min/max тоже ну такое себе занятие, тока пайплайн ломать.
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 (что быстрее).
Truthfinder
Вариант для горзонтальных матриц:
Тема в архиве.