Optimization 在着色器中乘以2的幂时的gpu优化

Optimization 在着色器中乘以2的幂时的gpu优化,optimization,gpu,shader,Optimization,Gpu,Shader,现代GPU是否通过进行位移位来优化2次幂的乘法?例如,假设我在着色器中执行以下操作: float t = 0; t *= 16; t *= 17; 第一次乘法是否可能比第二次乘法运行得更快?浮点乘法不能通过位移位完成。然而,从理论上讲,通过2个常数的幂进行浮点乘法是可以优化的。浮点值通常以S*M*2^E的形式存储,其中S是符号,M是尾数,E是指数。可以通过对浮点的指数部分进行加/减运算,而不修改其他部分,从而乘以2的幂常数。但在实践中,我敢打赌在GPU上总是使用通用乘法指令 在研究PVRSha

现代GPU是否通过进行位移位来优化2次幂的乘法?例如,假设我在着色器中执行以下操作:

float t = 0;
t *= 16;
t *= 17;

第一次乘法是否可能比第二次乘法运行得更快?

浮点乘法不能通过位移位完成。然而,从理论上讲,通过2个常数的幂进行浮点乘法是可以优化的。浮点值通常以
S*M*2^E
的形式存储,其中
S
是符号,
M
是尾数,
E
是指数。可以通过对
浮点
的指数部分进行加/减运算,而不修改其他部分,从而乘以2的幂常数。但在实践中,我敢打赌在GPU上总是使用通用乘法指令

在研究PVRShaderEditor(PowerVR GPUs)的反汇编输出时,我对2个常数的幂进行了有趣的观察。我注意到,2个常数(在我的例子中是[2^(-16),2^10])的某个幂的范围使用了特殊的符号,例如C65,这意味着它们是预定义的。而任意常量(如3.0或2.3)使用共享寄存器表示法(如SH12),这意味着它们存储为统一的,可能会产生一些设置成本。因此,至少在某些硬件上,使用2个常量的幂可以产生一些优化效益。

A是类型。乘法不能用简单的位移位来处理。