Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / GLM Row Major (2 стр)

GLM Row Major (2 стр)

Страницы: 1 2 3 Следующая »
MrShoorУчастникwww11 янв. 20188:04#15
FordPerfect
> может быть эффективнее в row-major.
Обычно как раз эффективнее в col-major из-за хорошо ложащихся векторных инструкций. Вот только скобки не надо забывать расставлять:
v = m3 * (m2 * (m1 * v))
чтобы промежуточное значение всегда было vec4 а не mat4*4
MrShoorУчастникwww11 янв. 20188:24#16
FordPerfect
Вот тут неплохое чтиво по производительности col major vs row major:
https://stackoverflow.com/questions/14967969/efficient-4x4-matrix… -and-dot-prod
FordPerfectПостоялецwww11 янв. 20188:41#17
MrShoor
>что col major это все не то, и на порядок умножения оно не должно влиять
Я всё-же сторонник терминологической чистоты, но ок.

Т. е. да, для row-vector (нотации/библиотеки/API) обычно по-умолчанию используют row-major (storage), а для column-vector - column-major, но оно в общем случае не связано.

>Обычно как раз эффективнее в col-major из-за хорошо ложащихся векторных инструкций.
Так это v = m3 * (m2 * (m1 * v)) - в col-major, а v = (((v * m1) * m2) * m3); - в row-major. Сама последовательность операций - идентична (ну матрицы транспонированы).

> https://stackoverflow.com/questions/14967969/efficient-4x4-matrix… -and-dot-prod
Да это понятно; хотя я не уверен, что сейчас баланс производительности тот же.

Правка: 11 янв. 2018 8:43

FordPerfectПостоялецwww11 янв. 20188:46#18
Т. е. ты хочешь:
1. Чтобы функции GLM отдавали тебе матрицы, предназначенные для row-векторов (т. е. v*M).
2. Чтобы GLM матрицы хранила в row-major порядке (M[i,j] -> M[4*i+j]).
Что-то одно, или оба?
Правка:
опечатки.

Правка: 11 янв. 2018 8:50

MrShoorУчастникwww11 янв. 20188:51#19
FordPerfect
> Так это v = m3 * (m2 * (m1 * v)) - в col-major, а v = (((v * m1) * m2) * m3); -
> в row-major. Сама последовательность операций - идентична (ну матрицы
> транспонированы).
Вот, подходим к вопросу. Сабж созданный мной собственно в том, что я хочу читать выражение слева направо, и видеть операции по порядку.
Т.е. хочу читать и писать вот так:
v = (((v * m1) * m2) * m3)
Это все что я хочу.

> Да это понятно; хотя я не уверен, что сейчас баланс производительности тот же.
На SSE вроде как он +- тот же, но все это ради одного частного случая: "умножение матрицы на вектор". Я все такие вычисления провожу как правило на GPU, а вот на GPU судя по моим тестам пофигу как ты умножаешь, m * v или v * m. А поскольку у более медленного варианта читабельность лучше - я хочу как раз его. Но вот glm видимо не позволяет это провернуть.

MrShoorУчастникwww11 янв. 20188:52#20
FordPerfect
> 1. Чтобы функции GLM отдавали тебе матрицы, предназначенные для row-векторов (т. е. v*M).
Вот! Именно первый пункт я и хочу.
FordPerfectПостоялецwww11 янв. 20189:27#21
Производительность:
http://rextester.com/OAZBPO64362
FordPerfectПостоялецwww11 янв. 201812:05#22
При -mavx, -mfma и -mfma4 результаты несколько другие.
MrShoorУчастникwww11 янв. 201812:19#23
FordPerfect
> При -mavx, -mfma и -mfma4 результаты несколько другие.
Так выкладывай сюда
FordPerfectПостоялецwww12 янв. 20183:41#24
MrShoor
Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz ( rextester.com )

M=1000
N=400000

Опцииrow-majorcolumn-major
-msse32.62.2
-msse42.52.2
-mavx2.41.8
-mfma2.41.8
-mavx22.41.7
-mfma4SIGILLSIGILL
-mxopSIGILLSIGILL

Ты, наверно, свои замеры выложи. У тебя проц, небось, поновее, чем на rextester.
Плюс на rextester производительность сильно прыгает от запуска к запуску.

Забавно, что согласно godbolt.org, GCC вычисляет выражение через fma (если включено), забивая на #pragma STDC FP_CONTRACT.
Ускорение, впрочем, похоже не из-за этого, а тупо из-за AVX (3-аргументность, поди).
https://godbolt.org/g/h5goxM

MrShoorУчастникwww12 янв. 20183:59#25
FordPerfect
> Ты, наверно, свои замеры выложи. У тебя проц, небось, поновее, чем на
> rextester.
Ок, позже проведу тесты.
The PlayerУчастникwww12 янв. 20184:25#26
Как перешел со своей мат либы на gml - где то пол года плевался от этого говна.
А еще плевался из-за отсутствия банального vec.xy.
А потом как-то привык.
Даже не знаю что посоветовать...
PA3UJIbПостоялецwww12 янв. 20188:08#27
А еще плевался из-за отсутствия банального vec.xy.

В смысле "отсутствия"?
А
#define GLM_SWIZZLE
разве не решает этот вопрос? Или "проблемы с доступом"(с) к компонентам вектора?
FordPerfectПостоялецwww12 янв. 201822:36#28
MrShoor
Кстати, а производительность GLM замеришь?
А то я подозреваю, что она говорит "да ну вас нафиг" и тупо всё скалярными считает.
Или там опции введены какие-нибудь?
The PlayerУчастникwww20 янв. 201810:02#29
PA3UJIb
Спасибо, открыл мне глаза...
А оно на размер объекта не влияет?
Или там все хитрожопо через unionы?
Надо бы завести привычку заходить в темы, в которых отписался...
Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр