Предположим, у вас есть следующий код:
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 «был установлен с некоторыми флагами», вектор модулей Unit (UnitSSE), а затем использует их для составления класса UnitBank с 32 единицами sse? Что-то вроде этого:
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 генерировать такую оптимизацию автоматически?
Задача ещё не решена.
Других решений пока нет …