2

区分線形伝達関数の固有値ベースの実装を最適化する助けが必要です (出力値は入力と同じですが、この場合は [-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;
    }
}

私のプログラム全体は、各スイッチ ケースで次のサンプルの一部を使用します。

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

高速シグモイドはめったに使用されませんが、区分的線形ケースはしきい値ケースと同じくらい頻繁に発生するはずです (ただし、Visual Studio を使用してこれを測定する方法はわかりません)。そのため、私はその Piecewise 線形単項式にかなりの時間を費やしているように思われ、Eigen で機能を実現する別の方法があるかどうか疑問に思っていました。おそらく、いくつかの組み込みメソッドを使用して速度を上げます. これは非常に単純な伝達関数であるため、実際には計算上非常に安価である必要があります-私の推測では、コストは、カスタムラムダによる最適化の悪さと他の何よりも関係があると思います.

考え?

編集:これまでのところ、Leeorの答えのおかげでこれを思いつきました:

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

2 に答える 2

1

既存のコードがまだそのようにコンパイルされていない場合は、FPU の最大および最小命令を使用します。

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

Eigen には既にそのような操作が組み込まれている可能性がありますが、ドキュメントを一瞥しただけでは何もわかりませんでした。

于 2013-11-05T08:38:39.737 に答える
0

おそらく分岐予測、if 条件によって複雑なデータ依存の制御フローが作成され、複数のリターン サイトが最適化を困難にする可能性があります。

おそらく、このような三項演算子は分岐を排除します:

        return (elem>0? 1 : -1) * (std::min(std::abs(elem),0.5));

(フロートで abs をサポートするライブラリを使用していることを確認してください。cmath は問題ないと思います)。

条件付き移動でこれを行うことにより、コンパイラが分岐の少ないコードをそのように出力するかどうかを確認します。

于 2013-11-05T08:19:50.567 に答える