如何优化此S曲线功能?

时间:2016-01-18 11:52:17

标签: c++ gamma-function

我正在开发一个生成" S-Curve"的gamma功能。 我需要在实时环境中运行它,所以我需要尽可能加快速度。

代码如下:

float Gamma = 2.0f; //Input Variable

float GammaMult = pow(0.5f, 1.0f-Gamma);
if(Input<1.0f && Input>0.0f)
{
    if(Input<0.5f)
    {
        Output = pow(Input,Gamma)*GammaMult;
    }
    else
    {
        Output  = 1.0f-pow(1.0f-Input,Gamma)*GammaMult;
    }
}
else
{
   Output  = Input;
}

有什么办法可以优化这段代码吗?

2 个答案:

答案 0 :(得分:3)

如果指令集支持pipeline stalls或使用max / min内在函数,则可以通过消除Input<1.0f && Input>0.0f上的分支来避免saturation arithmeticx86 MAXSS

您还应该通过舍入饱和Input来消除其他分支。完整算法:

float GammaMult = pow(0.5f, 1.0f-Gamma);
Input = saturate(Input); // saturate via assembly or intrinsics
// Input is now in [0, 1]
Rounded = round(Input); // round via assembly or intrinsics
Coeff = 1 - 2 * Rounded
Output = Rounded + Coeff * pow(Rounded + Coeff * Input,Gamma)*GammaMult;

应该进行舍入via asm/intrinsics as well

如果您使用此功能,例如如果目标体系结构支持SIMD,则应考虑对其进行矢量化。

答案 1 :(得分:0)

您的代码似乎很好。瓶颈(如果存在)是pow函数。唯一的解决方案是深入了解低级细节,并尝试实现自己的pow函数。例如,如果2个浮点数对您来说足够,您可能会发现一些基于近似的算法更快。

请参阅:The most efficient way of implementing pow() function in floating point