我如何优化这个 S 曲线函数?

How can i optimize this S-curve function?

我正在研究生成 "S-Curve" 的伽马函数。 我需要在实时环境中 运行 它,所以我需要尽可能加快它的速度。

代码如下:

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;
}

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

您的代码看起来不错。瓶颈(如果存在)是 pow 函数。唯一的解决方案是更深入地研究 low-level 细节并尝试实现您自己的 pow 功能。例如,如果 2 个浮点数对您来说足够了,您可能会发现一些 approximation-based 更快的算法。

看到这个:The most efficient way of implementing pow() function in floating point

你可以避免pipeline stalls by eliminating branching on Input<1.0f && Input>0.0f if the instruction set supports saturation arithmetic or use max/min intrinsics, e.g. x86 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,则应考虑对数组的连续值进行矢量化。