如何优化此 S 曲线函数
How can i optimize this S-curve function?
我正在研究一个生成"S曲线"的伽马函数。我需要在实时环境中运行它,所以我需要尽可能加快它的速度。
代码如下:
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;
}
有什么方法可以优化此代码吗?
如果
指令集支持饱和算法或使用最大/最小内部函数,例如 x86 MAXSS Input<1.0f && Input>0.0f
,您可以通过消除上的分支来避免流水线停滞
您还应该通过舍入饱和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;
舍入也应通过 asm/内部函数完成。
例如,如果对数组的连续值使用此函数,则应考虑对目标架构支持 SIMD 进行矢量化处理。
你的代码似乎很好。瓶颈(如果存在)是pow
功能。唯一的解决方案是更深入地了解低级细节,并尝试实现自己的pow
功能。例如,如果 2 个浮点数对您来说足够了,您可能会发现一些基于近似的算法更快。
看这个: 在浮点中实现 pow() 函数的最有效方法
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何优化此 S 曲线函数
- C++如何使用setpixel函数绘制色调曲线(gamma)到图形