2014-10-01 3 views
0

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

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

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


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

+0

Почему бы не начать работу с 4x4, посмотреть, создает ли это узкое место, а затем переписать его, если это окажется самой важной проблемой в анализе производительности? Правило №1 оптимизации: * не делайте этого *. Правило №2 оптимизации (только эксперты!) * Не делайте этого ... пока *. – HostileFork

+0

Матричные умножения 4x4 не являются узким местом в играх AAA, обрабатывающих многие, многие, многие объекты, состоящие из многих, многих и многих треугольников. Я думаю, можно с уверенностью предположить, что все будет хорошо. На самом деле, я бы не удивился, если бы ваша ручная математическая матрица была менее эффективной, чем библиотека. – delnan

+0

Эти игры выполняют 3D-преобразования, поэтому им нужна матрица 4x4. Поскольку я делаю 2D-преобразования, я получаю матрицу 3x3. Матричное умножение 3x3 включает в себя 27 внутренних умножений. Матрица 4x4 делает 64. Это более чем в два раза больше. В любом случае - меня интересуют понятия и принципы, которые регулируют ответ на этот вопрос так же, как «делать хорошо». Если один метод лучше, чем другой, нет ничего «преждевременного» в том, чтобы использовать один из них с самого начала. – d7samurai

ответ

1

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

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

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