我理解表达式x = m*a+d
最有效地写为x = mad(m,a,d)
,因为在汇编级别只需要一条指令而不是乘法并单独添加。我的问题是最佳地写出这个表达式:x += m*a
。 这应该写成x = mad(m,a,x)
还是x += m*a
?这种差异太过于微妙,但我不知道是否有人能够在汇编级别看到差异。 (我不知道如何查看汇编代码。)
答案 0 :(得分:1)
使用'fxc'编译着色器并查看打印出来的已编译DXBC。
在这种情况下,编译器可以确定x + = m * a;与x = mad(m,a,x)相同;因此生成的代码将是相同的。
对于这两个表达式,生成的字节码为:
mad o0.x,v0.x,v0.y,v0.z
即使写为x = m * a + d;编译器可以自由地(并且确实)在DirectX字节码中使用疯狂指令。以您描述的三种方式中的任何一种方式编写它都没有性能损失。