2015-04-02 2 views
0

Я понимаю, что выражение x = m*a+d наиболее эффективно записывается как x = mad(m,a,d), потому что на уровне сборки требуется только одна команда, а не умножение и добавление отдельно. Мой вопрос касается оптимального написания этого выражения: x += m*a. Должно ли это быть указано как x = mad(m,a,x) или x += m*a? Разница слишком тонкая для профиля, но мне интересно, может ли кто-нибудь увидеть разницу на уровне сборки. (Я не знаю, как просмотреть код сборки.)HLSL Shader Optimilation с MAD (m, a, d)

ответ

1

Скомпилируйте шейдер с помощью «fxc» и посмотрите на скомпилированный DXBC, который он распечатает.

В этом случае у компилятора нет проблем с определением того, что x + = m * a; совпадает с x = mad (m, a, x); и поэтому полученный сгенерированный код будет таким же.

Для обоих выражений производится в результате байткодом:

бешеной o0.x, v0.x, v0.y, v0.z

Даже тогда, когда записывается в виде х = M * A + D; компилятор свободен (и делает) использовать сумасшедшую инструкцию в байт-коде DirectX. Не существует штрафа за производительность при написании его любым из трех описанных вами способов.

+0

После того, как я опубликовал вопрос, который я взял последние два часа, чтобы выяснить, как просмотреть код сборки и понять, что вы сделали. Я не понял, что компилятор сделал такую ​​оптимизацию. Кажется, я пытался оптимизировать. –