次のコードがあるとします。
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 がそのような最適化を自動的に生成することは可能ですか?