gpt4 book ai didi

c++ - 如何在 Eigen 中实现高性能分段线性传递函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:35 24 4
gpt4 key购买 nike

我需要一些帮助来优化分段线性传递函数的基于特征的实现(输出值等于输入但限制在一个范围内,在本例中为 [-0.5,0.5])。以下是我介绍的功能:

typedef float SignalT;
typdedef Eigen::Array<SignalT, Eigen::Dynamic, Eigen::Dynamic> Signal2D;
void ActivateSum(unsigned char const idx, Signal2D::ColXpr& outputSum)
{
switch (idx)
{
case 0U:
//Threshold
outputSum = (outputSum >= (SignalT) 0.0).cast<SignalT>();
break;
case 1U:
//Piecewise linear
outputSum = outputSum.unaryExpr([](SignalT const elem)
{
if (elem >(SignalT) 0.5)
return (SignalT) 0.5;
else if (elem < (SignalT)-0.5)
return (SignalT)-0.5;
else
return elem;
}
);
break;
case 2U:
//Fast Sigmoid
outputSum *= ((SignalT) 1.0 + outputSum.abs()).inverse();
break;
default:
assert(0);
throw;
}
}

我的整个程序在每个 switch case 中花费了以下样本部分:

Threshold: 3.3%
Piecewise Linear: 18%
Fast Sigmoid: < 0.1%

快速 sigmoid 很少使用,但分段线性情况应该与阈值情况一样频繁出现(尽管我不知道如何使用 Visual Studio 测量它)。所以在我看来,我在那个分段线性一元表达式上花了很多时间,想知道是否有另一种方法来实现 Eigen 中的功能,也许是通过使用一些内置方法来加快速度.这是一个非常简单的传递函数,因此它在计算上确实应该非常便宜 - 我的猜测是,由于我的自定义 lambda,成本更多地与优化不佳有关。

想法?

编辑:到目前为止,由于 Leeor 的回答,我已经想到了这个:

case 1U:
//Piecewise linear
outputSum = outputSum.max((SignalT)-0.5).min((SignalT)0.5);
break;

最佳答案

如果您现有的代码尚未以这种方式编译,请使用 FPU 最大和最小指令。

    outputSum = outputSum.unaryExpr( [] (SignalT elem)
{
return std::fmax( -0.5f, std::fmin( 0.5f, elem ) );
}

Eigen 可能已经内置了这样的操作,但浏览文档并没有发现任何问题。

关于c++ - 如何在 Eigen 中实现高性能分段线性传递函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19783947/

24 4 0
文章推荐: c++ - 不可实例化的谷歌测试夹具父类(super class)
文章推荐: c++ - 无法将字段 声明为抽象类型