Ну да, вот такой стиль общения - я огородился тэгами в своей песочнице, леплю себе куличики, и не лезьте со своими экскаваторами - он раздражает профессиональных экскаваторщиков :)
Можно было какой-то вежливый сдержанный интерес изобразить, даже если не готов изучать Си прямо сейчас (хотя что в нём страшного? Шейдеры же писал на Си-подобном языке - не обломился). Статья, которую в комментах кидали - реально классная, можно было почитать и проникнуться тем, как люди оптимизируют.
Нет, идите нафиг со своими ковшами! Мне и с формочками хорошо!
Тут спасёт разве что тэг "йа блондинко" :)
Кстати, протестировал сишный код (самый примитивный, из сообщения 26) - в 3.7-3.8 раза быстрее, и как ни странно, большой разницы между sse2 и avx2 нет.
Хотя блондинкам наверное неинтересно.
eDmk
Модельку самолёта сам рисовал? Или где в открытом доступе валяется? С текстурированием и освещением в софте будет? Но даже так уже очень хорошо выглядит.
Truthfinder
> Модельку самолёта сам рисовал?
Модельку купил на 3ddd для тестов.
>С текстурированием и освещением в софте будет?
Да, делаю. Пока с текстурными координатами разбираюсь:
Truthfinder
> Но даже так уже очень хорошо выглядит.
Спасибо!
invis
> Мне и с формочками хорошо!
Тут вы правы.
invis
> Тут спасёт разве что тэг "йа блондинко" :)
А тут не правы.
Просто люди не уважают друг друга.
В реальном мире это называется мордобой.
Они дали мне ссылку на супер-пупер код, который не работает. Он очень быстрый (168 млн. умножений в секунду, но он не умножает матрицы по правилам умножения матриц). Это просто умножение 4-х векторов на матрицу.
Не взудмайте его использовать!
Я им говорю, что код нерабочий, а они мне говорят, что земля круглая и солнце теплое. Уже пытался им объяснить почему нерабочий и т.д., а они просят за тон извиниться. Ощущение, что попал в дурдом.
eDmk
> Они дали мне ссылку на супер-пупер код, который не работает. Он очень быстрый
> (168 млн. умножений в секунду, но он не умножает матрицы по правилам умножения
> матриц). Это просто умножение 4-х векторов на матрицу.
Вы ошибаетесь. Очень даже рабочий. https://habr.com/ru/post/418247/
Тут приведён вывод "неработающего" алгоритма и обычного простой перестановкой строк.
Умножение транспонированных матриц не требует изменения реализации алгоритма, достаточно переставить порядок матриц на входе.
Результат - также транспонированная матрица. Это обычная высшая алгебра. Зато вы избавляетесь от лишних инструкций транспонирования. А транспонирование это плохо. Даже 8 шафлами. Потому что там идёт полный загруз 5 порта процессора, который фиг оптимизируешь.
P.S. Нерабочий он может оказаться по одной причине, у вас формат хранения данных другой. Транспонирование 4 шафлами, равно как и умножение, я переписывал под свой формат хранения.
Truthfinder
>Вы ошибаетесь. Очень даже рабочий. https://habr.com/ru/post/418247/
Ссылка это доказательство?
Truthfinder
> Транспонирование 4 шафлами я переписывал под свой формат хранения.
Вы туда же? Шуффлинг не умеет транспонировать. Нужно вертикально переставлять элементы в матрице B. Кроме того, в коде из #23 нет поэлементного сложения.
У меня есть умножение без транспонирования матрицы. Там вообще нет никакого шуфлинга.
>свой формат хранения.
У меня ROW-major - строками. У вас видимо Column-major - столбцами.
Или еще есть способ хранения?
eDmk
> Ссылка это доказательство?
В статье приведёт вывод алгоритма.
> Вы туда же? Шуффлинг не умеет транспонировать.
Это потому, что вы ленитесь расписать sse регистры в результате операций shuffle.
> У меня ROW-major - строками. У вас видимо Column-major - столбцами.
> Или еще есть способ хранения?
Я храню вектора как wzyx, в регистре они выглядят как xyzw, w можно оперировать через sse *ss команды.
Truthfinder
Ну это же другой способ умножения. Скорее всего кватернионы. Спрашивается при чем здесь матрицы? Я же про матрицы пишу. Есть правила умножения матрицы на матрицу. У меня они соблюдаются, а кватернионы - это другая тема. Она несовместима с матричным умножением. Поэтому и не работает.
eDmk
> Truthfinder
> Ну это же другой способ умножения. Скорее всего кватернионы. Спрашивается при
> чем здесь матрицы? Я же про матрицы пишу. Есть правила умножения матрицы на
> матрицу. У меня они соблюдаются, а кватернионы - это другая тема. Она
> несовместима с матричным умножением. Поэтому и не работает.
Причём здесь кватернионы? Я про них ничего не писал.
Truthfinder
> Причём здесь кватернионы?
Вы описали формат хранения кватернионов (задом наперед).
eDmk
> Вы описали формат хранения кватернионов (задом наперед).
А причём здесь кватернионы? Это вектор обычный 4х компонентный. Матрица 4x4 в свою очередь может быть представлена 4мя такими векторами.
shuffle(a, b, i{w:2,z:2,y:2,x:2}) => b[w], b[z], a[y], a[z] r0=r03,r02,r01,r00 r1=r13,r12,r11,r10 r2=r23,r22,r21,r20 r3=r33,r32,r31,r30 t0=shuf<0x44=0b 01'00'01'00=1,0,1,0>(r0, r1) // t0{r1|r0}=r11 r10 r01 r00 t1=shuf<0x44=0b 01'00'01'00=1,0,1,0>(r2, r3) // t1{r3|r2}=r31 r30 r21 r20 t2=shuf<0xEE=0b 11'10'11'10=3,2,3,2>(r0, r1) // t2{r1|r0}=r13 r12 r03 r02 t3=shuf<0xEE=0b 11'10'11'10=3,2,3,2>(r2, r3) // t3{r3|r2}=r33 r32 r23 r22 r0=shuf<0x88=0b 10'00'10'00=2,0,2,0>(t0, t1) // r0{t1|t0}=t12 t10 t02 t00=r30 r20 r10 r00 r1=shuf<0xDD=0b 11'01'11'01=3,1,3,1>(t0, t1) // r1{t1|t0}=t13 t11 t03 t01=r31 r21 r11 r01 r2=shuf<0x88=0b 10'00'10'00=2,0,2,0>(t2, t3) // r2{t3|t2}=t32 t20 t32 t20=r32 r22 r12 r02 r3=shuf<0xDD=0b 11'01'11'01=3,1,3,1>(t2, t3) // r3{t3|t2}=t33 t21 t33 t21=r33 r23 r13 r03
Это в регистрах. Ну и очевидно, что в памяти матрица должна хранится для этого алгоритма в виде: r00, r01, r02, r03, r10, r11, r12, r13, ..., r33.
Truthfinder
> А причём здесь кватернионы?
Я предположил, что это они.
Я никому не навязываю свое видение. Умножайте как хотите и чем хотите.
Люди ломают копья за способ умножения. Капец. Мне ваши способы не подходят.
Они в моем случае не работают.
Я делал свое умножение по этой статье: http://www.mathprofi.ru/deistviya_s_matricami.html
Меня оно полностью устраивает.
Но и это ещё не всё. Это алгоритм из xmmintrin.h. Интеловский заголовок. При этом в intel intrinsics guide есть ещё реализация от интел в виде:
__m128 tmp3, tmp2, tmp1, tmp0; tmp0 := _mm_unpacklo_ps(row0, row1); tmp2 := _mm_unpacklo_ps(row2, row3); tmp1 := _mm_unpackhi_ps(row0, row1); tmp3 := _mm_unpackhi_ps(row2, row3); row0 := _mm_movelh_ps(tmp0, tmp2); row1 := _mm_movehl_ps(tmp2, tmp0); row2 := _mm_movelh_ps(tmp1, tmp3); row3 := _mm_movehl_ps(tmp3, tmp1);
P.S. Повторюсь, это алгоритмы Intel.
eDmk
> Меня оно полностью устраивает.
Будет интересно прогнать через Intel® Architecture Code Analyzer и сравнить эти алгоритмы.
А у вас проц модный, есть ещё AVX, что быстрее ещё раза в два можно сделать.