现代GPU是否通过位移来优化2的幂乘法?例如,假设我在着色器中执行以下操作:
float t = 0;
t *= 16;
t *= 17;
第一次乘法运算是否有可能比第二次乘法运算快?
答案 0 :(得分:1)
不能通过移位完成浮点乘法。但是,理论上可以优化浮点乘以2个常数 的幂。浮点值通常以S * M * 2 ^ E
的形式存储,其中S
是符号,M
是尾数,E
是指数。可以通过对float
的指数部分进行加/减来乘以2的幂,而无需修改其他部分。但实际上,我敢打赌,在GPU上始终使用通用乘法指令。
在研究PVRShaderEditor(PowerVR GPU)的反汇编输出时,我对2个常数的幂有一个有趣的观察。我注意到2常数的幂在一定范围内(在我的情况下为[2 ^(-16),2 ^ 10]),请使用特殊表示法,例如C65,表示它们是预定义的。而诸如3.0或2.3之类的任意常量则使用共享的寄存器符号(例如SH12),这意味着它们以统一的形式存储,并且可能会产生一些设置成本。因此,使用2常数的幂至少可以在某些硬件上产生一些优化利益。