使用 MAD(m,a,d) 优化 HLSL 着色器

HLSL Shader Optimilation with MAD(m,a,d)

我知道表达式 x = m*a+d 写成 x = mad(m,a,d) 最有效,因为在汇编级别只需要一条指令而不是单独的乘法和加法。我的问题是关于最佳地编写这个表达式:x += m*a应该写成 x = mad(m,a,x) 还是 x += m*a 差异太细微,无法描述,但我想知道是否有人能看出汇编级别的差异。 (不知如何查看汇编代码)

使用 'fxc' 编译着色器并查看它打印出的已编译 DXBC。

在这种情况下,编译器可以毫不费力地确定 x += m * a;与 x = mad(m,a,x) 相同;因此生成的代码将是相同的。

对于这两个表达式,生成的字节码是:

疯狂 o0.x, v0.x, v0.y, v0.z

即使写成 x = m * a + d;编译器可以(并且确实)在 DirectX 字节码中使用疯狂指令。以您描述的三种方式中的任何一种方式编写它都不会影响性能。