假设您有以下代码:
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 个进程组成的数组,每个进程都会产生一些数字。
本质上,由于向后数据依赖(_outDel 变量),Unit 模块无法向量化。
但是,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 可以自动生成这样的优化吗?