Эффективен ли XMMATRIX для 2D-преобразований или я должен создать собственный набор матриц 3×3?

Я создаю высокопроизводительный механизм компоновки пользовательского интерфейса поверх Direct3D 11. Приложение разрабатывается с использованием Visual Studio 2013, нацелено на x64 и предназначено для Windows 7 (с обновлением платформы) и выше.

Мне нужно сделать матричные преобразования на 2D элементах в визуальном дереве, и мне интересно, использовать ли встроенный DirextXMath (SIMD-оптимизированный) XMMATRIX и связанные с ним функции эффективны для использования в 2D (поскольку для этого требуется только матрица 3×3, а XMMATRIX и т. д. 4×4), или я должен свернуть свой собственный класс / функции матрицы (хотя, вероятно, без какого-либо специального кода SIMD).

Мне кажется, что матрица 4×4 повсюду будет означать выполнение множества избыточных вычислений, но, опять же, это может быть компенсировано инструкциями SIMD по сравнению с работой матрицы 3×3 без SIMD.


Изменить: Комментарии о том, что «преждевременная оптимизация является корнем всего зла» (и его производные) здесь излишни (и по иронии судьбы преждевременны, так как вы ничего не знаете о проекте — или я). Вопрос подводит итог того, что меня интересует в некоторых точках зрения / о том, что я знаю больше.

0

Решение

Механизмы компоновки имеют тенденцию иметь много связанных преобразований, поэтому использование (и сохранение на протяжении всей цепочки) ваших данных в регистрах SSE может повысить производительность (даже в большей степени, чем в типичных игровых сценариях, которые обычно имеют лишь несколько преобразований в цепочке). ). Если вы конкретно не собирается использовать SSE в вашем пользовательском классе, затем XMMATRIX вероятно будет быстрее. Разница в столбцах не должна иметь большого значения, поскольку каждая строка вписывается в регистр SSE, но разница строк будет означать дополнительную нагрузку. Тем не менее, выгода SSE, вероятно, того стоит.

Тем не менее, многие современные компиляторы теперь автоматически векторизуются, так что пользовательский класс, который вы пишете в vanilla C ++, может в конечном итоге получить SSE-оптимизацию за кулисами.

В любом случае, вы, вероятно, не увидите никакой разницы в производительности, если вы еще не оптимизировали свой движок для кеширования. Например, если ваш движок представляет иерархию с помощью указателей, и вы просто выделяете новые элементы в куче всякий раз, когда они вам нужны, вы будете разбивать кэш и у вас будет достаточно времени для вычисления преобразований, пока вы ожидаете память, SSE или нет.

1

Другие решения


По вопросам рекламы [email protected]