0

次のコードがあるとします。

class Unit
{
private:
    float _outDel = 0;

public:

    float Process()
    {
        float rnd = rand();
        float out = rnd + _outDel;
        _outDel = out;
        return out;
    }

    void Process(int frames, float *out)
    {
        for (int i = 0; i < frames; i++)
            out[i] += Process();
    }
}

class UnitBank
{
private:
    Unit _unit[128];

public:

    float Process(int frames, float *out)
    {
        for (int i = 0; i < 128; i++)
            _unit[i].Process(frames, out);
    }
}

この目的は、128 個のプロセスの配列を合計することです。各プロセスはいくつかの数値を生成します。

つまり、Unit モジュールは後方データ依存 (_outDel 変数) のため、ベクトル化できません。

しかし、VS 2012 が「いくつかのフラグで設定されている」ことで、ユニット モジュール (UnitSSE) のベクトルが生成され、これらを使用して 32 個の sse ユニットを持つ UnitBank クラスが構成される可能性はありますか? このようなもの:

class UnitSSE
{
private:
    float128 _outDel = 0;

public:

    float128 Process()
    {
        float128 rnd = rand();
        float128 out = rnd + _outDel;
        _outDel = out;
        return out;
    }

    void Process(int frames, float128 *out)
    {
        for (int i = 0; i < frames; i++)
            out[i] += Process();
    }
}

class UnitBankSSE
{
private:
    UnitSSE _unit[32];

public:

    void Process(int frames, float128 *out)
    {
        for (int i = 0; i < 32; i++)
            _unit[i].Process(frames, out);
    }
}

では、VS 2012 がそのような最適化を自動的に生成することは可能ですか?

4

0 に答える 0