使用 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 字节码中使用疯狂指令。以您描述的三种方式中的任何一种方式编写它都不会影响性能。
我知道表达式 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 字节码中使用疯狂指令。以您描述的三种方式中的任何一种方式编写它都不会影响性能。