Я понимаю, что выражение 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)
0
A
ответ
1
Скомпилируйте шейдер с помощью «fxc» и посмотрите на скомпилированный DXBC, который он распечатает.
В этом случае у компилятора нет проблем с определением того, что x + = m * a; совпадает с x = mad (m, a, x); и поэтому полученный сгенерированный код будет таким же.
Для обоих выражений производится в результате байткодом:
бешеной o0.x, v0.x, v0.y, v0.z
Даже тогда, когда записывается в виде х = M * A + D; компилятор свободен (и делает) использовать сумасшедшую инструкцию в байт-коде DirectX. Не существует штрафа за производительность при написании его любым из трех описанных вами способов.
После того, как я опубликовал вопрос, который я взял последние два часа, чтобы выяснить, как просмотреть код сборки и понять, что вы сделали. Я не понял, что компилятор сделал такую оптимизацию. Кажется, я пытался оптимизировать. –